aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm-c/lto.h7
-rw-r--r--tools/lto/LTOCodeGenerator.cpp8
-rw-r--r--tools/lto/LTOCodeGenerator.h2
-rw-r--r--tools/lto/lto.cpp6
-rw-r--r--tools/lto/lto.exports1
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