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
lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
int nargs);
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
/**
* 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
: _context(getGlobalContext()),
_linker("LinkTimeOptimizer", "ld-temp.o", _context), _target(NULL),
_emitDwarfDebugInfo(false), _scopeRestrictionsDone(false),
: _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();
_nativeObjectFile(NULL) {
InitializeAllTargets();
InitializeAllTargetMCs();
LLVMCompilerUsed->setSection("llvm.metadata");
LLVMCompilerUsed->setSection("llvm.metadata");
- passes.add(createInternalizePass(mustPreserveList));
+ if (!_exportDynamic)
+ passes.add(createInternalizePass(mustPreserveList));
// apply scope restrictions
passes.run(*mergedModule);
// apply scope restrictions
passes.run(*mergedModule);
// 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.
// 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);
!DisableInline,
DisableGVNLoadPRE);
bool setCodePICModel(lto_codegen_model, std::string &errMsg);
void setCpu(const char* mCpu) { _mCpu = mCpu; }
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;
void addMustPreserveSymbol(const char* sym) {
_mustPreserveSymbols[sym] = 1;
llvm::TargetMachine* _target;
bool _emitDwarfDebugInfo;
bool _scopeRestrictionsDone;
llvm::TargetMachine* _target;
bool _emitDwarfDebugInfo;
bool _scopeRestrictionsDone;
lto_codegen_model _codeModel;
StringSet _mustPreserveSymbols;
StringSet _asmUndefinedRefs;
lto_codegen_model _codeModel;
StringSet _mustPreserveSymbols;
StringSet _asmUndefinedRefs;
// In here only for backwards compatibility. We use MC now.
}
// 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.
/// 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.
lto_codegen_set_assembler_args
lto_codegen_set_assembler_path
lto_codegen_set_cpu
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
lto_codegen_compile_to_file
LLVMCreateDisasm
LLVMCreateDisasmCPU