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
This commit is contained in:
Nick Lewycky 2009-04-30 15:24:09 +00:00
parent 4e5ea553d0
commit 195bea3498
4 changed files with 38 additions and 6 deletions

View 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,

View 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

View 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

View 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