summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/gold/gold-plugin.cpp10
-rw-r--r--tools/lto/LTOCodeGenerator.cpp24
-rw-r--r--tools/lto/LTOCodeGenerator.h2
-rw-r--r--tools/lto/lto.cpp8
4 files changed, 38 insertions, 6 deletions
diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp
index 260e175282..86d3fd3b92 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<const char *>(lto_codegen_compile(cg,
diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp
index 70744c9a8f..d3a3f7f7b8 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 4a28136f0a..57398b0650 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<const char*> _codegenOptions;
+ llvm::sys::Path* _gccPath;
};
#endif // LTO_CODE_GENERATOR_H
diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp
index 227823f32f..5c3f90aa48 100644
--- a/tools/lto/lto.cpp
+++ b/tools/lto/lto.cpp
@@ -202,6 +202,14 @@ bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model)
}
//
+// 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
// inlined into every usage and optimized away.