From: Bill Wendling Date: Sat, 8 Dec 2012 00:18:16 +0000 (+0000) Subject: Add the `lto_codegen_set_export_dynamic' function. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=f62b9cd8905fd04e78775e29a01f41667286e67c;p=oota-llvm.git Add the `lto_codegen_set_export_dynamic' function. This function sets the `_exportDynamic' ivar. When that's set, we export all symbols (e.g. we don't run the internalize pass). This is equivalent to the `--export-dynamic' linker flag in GNU land: --export-dynamic When creating a dynamically linked executable, add all symbols to the dynamic symbol table. The dynamic symbol table is the set of symbols which are visible from dynamic objects at run time. If you do not use this option, the dynamic symbol table will normally contain only those symbols which are referenced by some dynamic object mentioned in the link. If you use dlopen to load a dynamic object which needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you will probably need to use this option when linking the program itself. The Darwin linker will support this via the `-export_dynamic' flag. We should modify clang to support this via the `-rdynamic' flag. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169656 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index 74915c0006f..2bc0b543a5b 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -250,6 +250,13 @@ extern void 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 diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 40983966a99..90c47eb27ba 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 601dbfa0449..db2a0fe50f9 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 11ad532be89..630e7045a5a 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 46d0d74c82a..411f1e3f221 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