diff options
-rw-r--r-- | include/llvm-c/lto.h | 7 | ||||
-rw-r--r-- | tools/lto/LTOCodeGenerator.cpp | 8 | ||||
-rw-r--r-- | tools/lto/LTOCodeGenerator.h | 2 | ||||
-rw-r--r-- | tools/lto/lto.cpp | 6 | ||||
-rw-r--r-- | tools/lto/lto.exports | 1 |
5 files changed, 21 insertions, 3 deletions
diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index 74915c0006..2bc0b543a5 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -251,6 +251,13 @@ lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, int nargs); /** + * If set, then codegen will export all symbols (e.g. the internalize + * pass won't run). + */ +extern void +lto_codegen_set_export_dynamic(lto_code_gen_t cg, bool val); + +/** * Adds to a list of all global symbols that must exist in the final * generated code. If a function is not listed, it might be * inlined into every usage and optimized away. diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 40983966a9..90c47eb27b 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -66,7 +66,7 @@ LTOCodeGenerator::LTOCodeGenerator() : _context(getGlobalContext()), _linker("LinkTimeOptimizer", "ld-temp.o", _context), _target(NULL), _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false), - _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), + _exportDynamic(false), _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), _nativeObjectFile(NULL) { InitializeAllTargets(); InitializeAllTargetMCs(); @@ -339,7 +339,8 @@ void LTOCodeGenerator::applyScopeRestrictions() { LLVMCompilerUsed->setSection("llvm.metadata"); - passes.add(createInternalizePass(mustPreserveList)); + if (!_exportDynamic) + passes.add(createInternalizePass(mustPreserveList)); // apply scope restrictions passes.run(*mergedModule); @@ -377,7 +378,8 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, // Enabling internalize here would use its AllButMain variant. It // keeps only main if it exists and does nothing for libraries. Instead // we create the pass ourselves with the symbol list provided by the linker. - PassManagerBuilder().populateLTOPassManager(passes, /*Internalize=*/false, + PassManagerBuilder().populateLTOPassManager(passes, + /*Internalize=*/!_exportDynamic, !DisableInline, DisableGVNLoadPRE); diff --git a/tools/lto/LTOCodeGenerator.h b/tools/lto/LTOCodeGenerator.h index 601dbfa044..db2a0fe50f 100644 --- a/tools/lto/LTOCodeGenerator.h +++ b/tools/lto/LTOCodeGenerator.h @@ -44,6 +44,7 @@ struct LTOCodeGenerator { bool setCodePICModel(lto_codegen_model, std::string &errMsg); void setCpu(const char* mCpu) { _mCpu = mCpu; } + void setExportDynamic(bool V) { _exportDynamic = V; } void addMustPreserveSymbol(const char* sym) { _mustPreserveSymbols[sym] = 1; @@ -70,6 +71,7 @@ private: llvm::TargetMachine* _target; bool _emitDwarfDebugInfo; bool _scopeRestrictionsDone; + bool _exportDynamic; lto_codegen_model _codeModel; StringSet _mustPreserveSymbols; StringSet _asmUndefinedRefs; diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 11ad532be8..630e7045a5 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -174,6 +174,12 @@ void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, // In here only for backwards compatibility. We use MC now. } +/// lto_codegen_set_export_dynamic - If set, then codegen will export all +/// symbols (e.g. the internalize pass won't run). +void lto_codegen_set_export_dynamic(lto_code_gen_t cg, bool val) { + cg->setExportDynamic(val); +} + /// lto_codegen_add_must_preserve_symbol - 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 inlined into every usage and optimized away. diff --git a/tools/lto/lto.exports b/tools/lto/lto.exports index 46d0d74c82..411f1e3f22 100644 --- a/tools/lto/lto.exports +++ b/tools/lto/lto.exports @@ -27,6 +27,7 @@ lto_codegen_debug_options lto_codegen_set_assembler_args lto_codegen_set_assembler_path lto_codegen_set_cpu +lto_codegen_set_export_dynamic lto_codegen_compile_to_file LLVMCreateDisasm LLVMCreateDisasmCPU |