mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 02:33:33 +00:00
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:
parent
4e5ea553d0
commit
195bea3498
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user