Add the `lto_codegen_set_export_dynamic' function.
authorBill Wendling <isanbard@gmail.com>
Sat, 8 Dec 2012 00:18:16 +0000 (00:18 +0000)
committerBill Wendling <isanbard@gmail.com>
Sat, 8 Dec 2012 00:18:16 +0000 (00:18 +0000)
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

include/llvm-c/lto.h
tools/lto/LTOCodeGenerator.cpp
tools/lto/LTOCodeGenerator.h
tools/lto/lto.cpp
tools/lto/lto.exports

index 74915c0006f74a0c1eec035d248c18b47f18b49b..2bc0b543a5b4c1d958a011e36afda57b989f149f 100644 (file)
@@ -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
index 40983966a99fa05fb2b51c029e9072c35b9af962..90c47eb27ba0dfef1d0a50fb91a7246d9242311a 100644 (file)
@@ -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);
 
index 601dbfa0449a17ba60500906c8fb1c0f1c2b489b..db2a0fe50f9fa7f313c95c56db8d22148f63470c 100644 (file)
@@ -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;
index 11ad532be896c2f6a77b782f3d006e29c0d66152..630e7045a5a101995191aac9120d5aad791abd79 100644 (file)
@@ -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.
index 46d0d74c82a81c1665426165d80a6acb0c376dbf..411f1e3f221318a9a4dbd0426fb3257b14f381f3 100644 (file)
@@ -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