Fix option parsing in the gold plugin.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Oct 2013 14:36:23 +0000 (14:36 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Oct 2013 14:36:23 +0000 (14:36 +0000)
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

include/llvm/LTO/LTOCodeGenerator.h
lib/LTO/LTOCodeGenerator.cpp
tools/lto/lto.cpp

index 08e63748242141145ba0368576bc3e4cfbf0a39a..97a50663398927099b971765098926296fa9d133 100644 (file)
@@ -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.
index faa55bbf2ba7ab0a39f7db5518aaa86e463d8186..3abb6238b3e6a07d519d61dbc4a533a275f76da4 100644 (file)
@@ -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]));
+}
index 79967207f558529b6d6cc827b89c23b09cd7eff5..7bfddcd9ec4cf30babebd28e7bfa5aa98903bbcf 100644 (file)
@@ -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);
 }