From: Nick Lewycky Date: Thu, 30 Apr 2009 15:24:09 +0000 (+0000) Subject: Allow a user of libLTO to specify the full pathname of the gcc executable to X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=195bea3498a7de1d84ace6d4685f02d4d7485468;p=oota-llvm.git Allow a user of libLTO to specify the full pathname of the gcc executable to 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 --- diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 260e175282d..86d3fd3b92c 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -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(lto_codegen_compile(cg, diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 70744c9a8f2..d3a3f7f7b82 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -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 diff --git a/tools/lto/LTOCodeGenerator.h b/tools/lto/LTOCodeGenerator.h index 4a28136f0ad..57398b06500 100644 --- a/tools/lto/LTOCodeGenerator.h +++ b/tools/lto/LTOCodeGenerator.h @@ -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 _codegenOptions; + llvm::sys::Path* _gccPath; }; #endif // LTO_CODE_GENERATOR_H diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 227823f32f4..5c3f90aa485 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -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