aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-10-02 14:36:23 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-10-02 14:36:23 +0000
commit0e95b3aba9b2039ae3af617e681aacca2ff81f79 (patch)
tree4e646da3d82ad3e5c3eed95dd76687befca04b7a
parent1a1d7c4f4c68d64ae5d96ba45270cfcf46421ca0 (diff)
downloadexternal_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.h5
-rw-r--r--lib/LTO/LTOCodeGenerator.cpp12
-rw-r--r--tools/lto/lto.cpp15
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);
}