Allow a user of libLTO to specify the full pathname of the gcc executable to
authorNick Lewycky <nicholas@mxc.ca>
Thu, 30 Apr 2009 15:24:09 +0000 (15:24 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 30 Apr 2009 15:24:09 +0000 (15:24 +0000)
run when assembling.

Wire this up to the gold plugin. You can now pass --plugin-opt gcc=/foo/bar/gcc
and it will run that gcc instead of looking for it on the path.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70490 91177308-0d34-0410-b5e6-96231b3b80d8

tools/gold/gold-plugin.cpp
tools/lto/LTOCodeGenerator.cpp
tools/lto/LTOCodeGenerator.h
tools/lto/lto.cpp

index 260e175282d53a6bf784c3033222342ae27c8c3b..86d3fd3b92c1e0d17c1710facc1065d54e28fd9d 100644 (file)
@@ -44,6 +44,7 @@ namespace {
   int gold_version = 0;
 
   bool generate_api_file = false;
+  const char *gcc_path = NULL;
 
   struct claimed_file {
     lto_module_t M;
@@ -101,6 +102,13 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
       case LDPT_OPTION:
         if (strcmp("generate-api-file", tv->tv_u.tv_string) == 0) {
           generate_api_file = true;
+        } else if (strncmp("gcc=", tv->tv_u.tv_string, 4) == 0) {
+          if (gcc_path) {
+            (*message)(LDPL_WARNING, "Path to gcc specified twice. "
+                       "Discarding %s", tv->tv_u.tv_string);
+          } else {
+            gcc_path = strdup(tv->tv_u.tv_string + 4);
+          }
         } else {
           (*message)(LDPL_WARNING, "Ignoring flag %s", tv->tv_u.tv_string);
         }
@@ -336,6 +344,8 @@ ld_plugin_status all_symbols_read_hook(void) {
 
   lto_codegen_set_pic_model(cg, output_type);
   lto_codegen_set_debug_model(cg, LTO_DEBUG_MODEL_DWARF);
+  if (gcc_path)
+    lto_codegen_set_gcc_path(cg, gcc_path);
 
   size_t bufsize = 0;
   const char *buffer = static_cast<const char *>(lto_codegen_compile(cg,
index 70744c9a8f271ebb3e7c597b209d12ea8e9181fd..d3a3f7f7b826622eddfe8ba3fb24250d6415466e 100644 (file)
@@ -71,7 +71,7 @@ LTOCodeGenerator::LTOCodeGenerator()
     : _linker("LinkTimeOptimizer", "ld-temp.o"), _target(NULL),
       _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false),
       _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC),
-      _nativeObjectFile(NULL)
+      _nativeObjectFile(NULL), _gccPath(NULL)
 {
 
 }
@@ -120,6 +120,13 @@ bool LTOCodeGenerator::setCodePICModel(lto_codegen_model model,
     return true;
 }
 
+void LTOCodeGenerator::setGccPath(const char* path)
+{
+    if ( _gccPath )
+        delete _gccPath;
+    _gccPath = new sys::Path(path);
+}
+
 void LTOCodeGenerator::addMustPreserveSymbol(const char* sym)
 {
     _mustPreserveSymbols[sym] = 1;
@@ -212,11 +219,16 @@ const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg)
 bool LTOCodeGenerator::assemble(const std::string& asmPath, 
                                 const std::string& objPath, std::string& errMsg)
 {
-    // find compiler driver
-    const sys::Path gcc = sys::Program::FindProgramByName("gcc");
-    if ( gcc.isEmpty() ) {
-        errMsg = "can't locate gcc";
-        return true;
+    sys::Path gcc;
+    if ( _gccPath ) {
+        gcc = *_gccPath;
+    } else {
+        // find compiler driver
+        gcc = sys::Program::FindProgramByName("gcc");
+        if ( gcc.isEmpty() ) {
+            errMsg = "can't locate gcc";
+            return true;
+        }
     }
 
     // build argument list
index 4a28136f0ad8b62e229c57d4e92858e5f7aa51cb..57398b0650037ac63ee900dbd9d93030b83596e9 100644 (file)
@@ -36,6 +36,7 @@ public:
     bool                addModule(class LTOModule*, std::string& errMsg);
     bool                setDebugInfo(lto_debug_model, std::string& errMsg);
     bool                setCodePICModel(lto_codegen_model, std::string& errMsg);
+    void                setGccPath(const char* path);
     void                addMustPreserveSymbol(const char* sym);
     bool                writeMergedModules(const char* path, 
                                                            std::string& errMsg);
@@ -59,6 +60,7 @@ private:
     StringSet                   _mustPreserveSymbols;
     llvm::MemoryBuffer*         _nativeObjectFile;
     std::vector<const char*>    _codegenOptions;
+    llvm::sys::Path*            _gccPath;
 };
 
 #endif // LTO_CODE_GENERATOR_H
index 227823f32f4a23687c56b702af0fca5c15863a4b..5c3f90aa485d90985ba10d1ec09e02fd3debd5e2 100644 (file)
@@ -201,6 +201,14 @@ bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model)
     return cg->setCodePICModel(model, sLastErrorString);
 }
 
+//
+// sets the path to gcc
+//
+void lto_codegen_set_gcc_path(lto_code_gen_t cg, const char* path)
+{
+    cg->setGccPath(path);
+}
+
 //
 // adds to a list of all global symbols that must exist in the final
 // generated code.  If a function is not listed there, it might be