diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-02 14:36:23 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-02 14:36:23 +0000 |
commit | 0e95b3aba9b2039ae3af617e681aacca2ff81f79 (patch) | |
tree | 4e646da3d82ad3e5c3eed95dd76687befca04b7a | |
parent | 1a1d7c4f4c68d64ae5d96ba45270cfcf46421ca0 (diff) | |
download | external_llvm-0e95b3aba9b2039ae3af617e681aacca2ff81f79.zip external_llvm-0e95b3aba9b2039ae3af617e681aacca2ff81f79.tar.gz external_llvm-0e95b3aba9b2039ae3af617e681aacca2ff81f79.tar.bz2 |
Fix option parsing in the gold plugin.
This was broken when options were moved up in r191680. No test because this is
specific LLVMgold.so/libLTO.so.
Patch by Tom Roeder!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191829 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/LTO/LTOCodeGenerator.h | 5 | ||||
-rw-r--r-- | lib/LTO/LTOCodeGenerator.cpp | 12 | ||||
-rw-r--r-- | tools/lto/lto.cpp | 15 |
3 files changed, 27 insertions, 5 deletions
diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 08e6374..97a5066 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -79,6 +79,11 @@ struct LTOCodeGenerator { // and LTOCodeGenerator::writeMergedModules(). // void setCodeGenDebugOptions(const char *opts); + + // Parse the options set in setCodeGenDebugOptions. Like + // setCodeGenDebugOptions, this must be called before + // LTOCodeGenerator::compilexxx() and LTOCodeGenerator::writeMergedModules() + void parseCodeGenDebugOptions(); // Write the merged module to the file specified by the given path. // Return true on success. diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index faa55bb..3abb623 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -264,11 +264,6 @@ bool LTOCodeGenerator::determineTarget(std::string &errMsg) { if (TargetMach != NULL) return true; - // if options were requested, set them - if (!CodegenOptions.empty()) - cl::ParseCommandLineOptions(CodegenOptions.size(), - const_cast<char **>(&CodegenOptions[0])); - std::string TripleStr = Linker.getModule()->getTargetTriple(); if (TripleStr.empty()) TripleStr = sys::getDefaultTargetTriple(); @@ -473,3 +468,10 @@ void LTOCodeGenerator::setCodeGenDebugOptions(const char *options) { CodegenOptions.push_back(strdup(o.first.str().c_str())); } } + +void LTOCodeGenerator::parseCodeGenDebugOptions() { + // if options were requested, set them + if (!CodegenOptions.empty()) + cl::ParseCommandLineOptions(CodegenOptions.size(), + const_cast<char **>(&CodegenOptions[0])); +} diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 7996720..7bfddcd 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -40,6 +40,9 @@ static std::string sLastErrorString; // *** Not thread safe *** static bool initialized = false; +// Holds the command-line option parsing state of the LTO module. +static bool parsedOptions = false; + // Initialize the configured targets if they have not been initialized. static void lto_initialize() { if (!initialized) { @@ -261,6 +264,10 @@ void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, /// that contains the merged contents of all modules added so far. Returns true /// on error (check lto_get_error_message() for details). bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { + if (!parsedOptions) { + cg->parseCodeGenDebugOptions(); + parsedOptions = true; + } return !cg->writeMergedModules(path, sLastErrorString); } @@ -271,6 +278,10 @@ bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { /// lto_codegen_compile() is called again. On failure, returns NULL (check /// lto_get_error_message() for details). const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { + if (!parsedOptions) { + cg->parseCodeGenDebugOptions(); + parsedOptions = true; + } return cg->compile(length, DisableOpt, DisableInline, DisableGVNLoadPRE, sLastErrorString); } @@ -279,6 +290,10 @@ const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { /// native object file. The name of the file is written to name. Returns true on /// error. bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) { + if (!parsedOptions) { + cg->parseCodeGenDebugOptions(); + parsedOptions = true; + } return !cg->compile_to_file(name, DisableOpt, DisableInline, DisableGVNLoadPRE, sLastErrorString); } |