Skip to content

Commit

Permalink
Allow a user of libLTO to specify the full pathname of the gcc execut…
Browse files Browse the repository at this point in the history
…able 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
  • Loading branch information
nlewycky committed Apr 30, 2009
1 parent 4e5ea55 commit 195bea3
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 6 deletions.
10 changes: 10 additions & 0 deletions tools/gold/gold-plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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,
Expand Down
24 changes: 18 additions & 6 deletions tools/lto/LTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{

}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions tools/lto/LTOCodeGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class LTOCodeGenerator {
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);
Expand All @@ -59,6 +60,7 @@ class LTOCodeGenerator {
StringSet _mustPreserveSymbols;
llvm::MemoryBuffer* _nativeObjectFile;
std::vector<const char*> _codegenOptions;
llvm::sys::Path* _gccPath;
};

#endif // LTO_CODE_GENERATOR_H
Expand Down
8 changes: 8 additions & 0 deletions tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 195bea3

Please sign in to comment.