summaryrefslogtreecommitdiffstats
path: root/llvm/tools/lto/LTOCodeGenerator.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-12-08 00:18:16 +0000
committerBill Wendling <isanbard@gmail.com>2012-12-08 00:18:16 +0000
commit65a6ee11dd4ccde80bf49e19bb7129b9a08296b9 (patch)
treed66f9ee91067acabd5aa224e203e041d669f704c /llvm/tools/lto/LTOCodeGenerator.cpp
parent315501e2541313e1108ed78970a78752d8038c9e (diff)
downloadbcm5719-llvm-65a6ee11dd4ccde80bf49e19bb7129b9a08296b9.tar.gz
bcm5719-llvm-65a6ee11dd4ccde80bf49e19bb7129b9a08296b9.zip
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. llvm-svn: 169656
Diffstat (limited to 'llvm/tools/lto/LTOCodeGenerator.cpp')
-rw-r--r--llvm/tools/lto/LTOCodeGenerator.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/tools/lto/LTOCodeGenerator.cpp b/llvm/tools/lto/LTOCodeGenerator.cpp
index 40983966a99..90c47eb27ba 100644
--- a/llvm/tools/lto/LTOCodeGenerator.cpp
+++ b/llvm/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);
OpenPOWER on IntegriCloud