From a93ae711a91dd151ca4d28e4172e0de89d1594f3 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Thu, 3 Jul 2008 22:53:14 +0000 Subject: [PATCH] Provide a hook to set the code generation debug options to investigate lto failures. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53119 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm-c/lto.h | 5 +++++ tools/lto/LTOCodeGenerator.cpp | 14 +++++++++++++- tools/lto/LTOCodeGenerator.h | 6 +++++- tools/lto/lto.cpp | 6 ++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index 508e871ec4c..c57dfe7306d 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -227,6 +227,11 @@ extern const void* lto_codegen_compile(lto_code_gen_t cg, size_t* length); +/** + * Sets options to help debug codegen bugs. + */ +extern void +lto_codegen_debug_options(lto_code_gen_t cg, const char *); #ifdef __cplusplus } #endif diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index d82279d494f..a07247e28e2 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -40,6 +40,7 @@ #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Config/config.h" @@ -116,7 +117,6 @@ bool LTOCodeGenerator::setCodePICModel(lto_codegen_model model, return true; } - void LTOCodeGenerator::addMustPreserveSymbol(const char* sym) { _mustPreserveSymbols[sym] = 1; @@ -334,6 +334,18 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM break; } + for (unsigned opt_index = 0, opt_size = _codegenOptions.size(); + opt_index < opt_size; ++opt_index) { + std::vector cgOpts; + std::string &optString = _codegenOptions[opt_index]; + for (std::string Opt = getToken(optString); + !Opt.empty(); Opt = getToken(optString)) + cgOpts.push_back(Opt.c_str()); + + int pseudo_argc = cgOpts.size()-1; + cl::ParseCommandLineOptions(pseudo_argc, (char**)&cgOpts[0]); + } + // Instantiate the pass manager to organize the passes. PassManager passes; diff --git a/tools/lto/LTOCodeGenerator.h b/tools/lto/LTOCodeGenerator.h index eab076ebc88..24a2ba316e7 100644 --- a/tools/lto/LTOCodeGenerator.h +++ b/tools/lto/LTOCodeGenerator.h @@ -17,6 +17,7 @@ #include "llvm/Linker.h" #include "llvm/ADT/StringMap.h" +#include "llvm/ADT/SmallVector.h" #include @@ -38,7 +39,9 @@ public: bool writeMergedModules(const char* path, std::string& errMsg); const void* compile(size_t* length, std::string& errMsg); - + void setCodeGenDebugOptions(const char *opts) { + _codegenOptions.push_back(std::string(opts)); + } private: bool generateAssemblyCode(std::ostream& out, std::string& errMsg); @@ -56,6 +59,7 @@ private: lto_codegen_model _codeModel; StringSet _mustPreserveSymbols; llvm::MemoryBuffer* _nativeObjectFile; + llvm::SmallVector _codegenOptions; }; #endif // LTO_CODE_GENERATOR_H diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index f60f7b5ac09..b674f3171ef 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -237,5 +237,11 @@ lto_codegen_compile(lto_code_gen_t cg, size_t* length) return cg->compile(length, sLastErrorString); } +extern void +lto_codegen_debug_options(lto_code_gen_t cg, const char * opt) +{ + cg->setCodeGenDebugOptions(opt); +} + -- 2.34.1