diff options
Diffstat (limited to 'include/llvm')
-rw-r--r-- | include/llvm/LTO/LTOCodeGenerator.h | 6 | ||||
-rw-r--r-- | include/llvm/Transforms/IPO.h | 26 |
2 files changed, 29 insertions, 3 deletions
diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 97a5066339..9f50770dcd 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -73,6 +73,10 @@ struct LTOCodeGenerator { void addMustPreserveSymbol(const char *sym) { MustPreserveSymbols[sym] = 1; } + void addDSOSymbol(const char* Sym) { + DSOSymbols[Sym] = 1; + } + // To pass options to the driver and optimization passes. These options are // not necessarily for debugging purpose (The function name is misleading). // This function should be called before LTOCodeGenerator::compilexxx(), @@ -126,6 +130,7 @@ private: void applyScopeRestrictions(); void applyRestriction(llvm::GlobalValue &GV, std::vector<const char*> &MustPreserveList, + std::vector<const char*> &SymtabList, llvm::SmallPtrSet<llvm::GlobalValue*, 8> &AsmUsed, llvm::Mangler &Mangler); bool determineTarget(std::string &errMsg); @@ -138,6 +143,7 @@ private: bool EmitDwarfDebugInfo; bool ScopeRestrictionsDone; lto_codegen_model CodeModel; + StringSet DSOSymbols; StringSet MustPreserveSymbols; StringSet AsmUndefinedRefs; llvm::MemoryBuffer *NativeObjectFile; diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h index 6ebb6c4658..ed2823098a 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -104,12 +104,32 @@ Pass *createPruneEHPass(); //===----------------------------------------------------------------------===// /// createInternalizePass - This pass loops over all of the functions in the -/// input module, internalizing all globals (functions and variables) not in the -/// given exportList. +/// input module, internalizing all globals (functions and variables) it can. +//// +/// The symbols in \p ExportList are never internalized. +/// +/// The symbol in DSOList are internalized if it is safe to drop them from +/// the symbol table. +/// +/// For example of the difference, consider a dynamic library being built from +/// two translation units. The first one compiled to a native object +/// (ELF/MachO/COFF) and second one compiled to IL. Translation unit A has a +/// copy of linkonce_odr unnamed_addr function F. The translation unit B has a +/// copy of the linkonce_odr unnamed_addr functions F and G. +/// +/// Assume the linker decides to keep the copy of F in B. This means that LLVM +/// must produce F in the object file it passes to the linker, otherwise we +/// will have an undefined reference. For G the situation is different. The +/// linker puts the function in the DSOList, since it is only wanted for the +/// symbol table. With this information internalize can now reason that since +/// the function is a linkonce_odr and its address is not important, it can be +/// omitted. Any other shared library needing this function will have a copy of +/// it. /// /// Note that commandline options that are used with the above function are not /// used now! -ModulePass *createInternalizePass(ArrayRef<const char *> ExportList); +ModulePass *createInternalizePass(ArrayRef<const char *> ExportList, + ArrayRef<const char *> DSOList); /// createInternalizePass - Same as above, but with an empty exportList. ModulePass *createInternalizePass(); |