diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-31 20:51:58 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-31 20:51:58 +0000 |
commit | 7e667c56cf7e27ff521ceb86518beab32bfb630d (patch) | |
tree | 70a76ad0c4af2d93a15e630ebd9864665253a72f /include | |
parent | f7ba4897302bf930f7ec4682a296ff4cd736a0e3 (diff) | |
download | llvm-7e667c56cf7e27ff521ceb86518beab32bfb630d.tar.gz llvm-7e667c56cf7e27ff521ceb86518beab32bfb630d.tar.bz2 llvm-7e667c56cf7e27ff521ceb86518beab32bfb630d.tar.xz |
Use LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN instead of the "dso list".
There are two ways one could implement hiding of linkonce_odr symbols in LTO:
* LLVM tells the linker which symbols can be hidden if not used from native
files.
* The linker tells LLVM which symbols are not used from other object files,
but will be put in the dso symbol table if present.
GOLD's API is the second option. It was implemented almost 1:1 in llvm by
passing the list down to internalize.
LLVM already had partial support for the first option. It is also very similar
to how ld64 handles hiding these symbols when *not* doing LTO.
This patch then
* removes the APIs for the DSO list.
* marks LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN all linkonce_odr unnamed_addr
global values and other linkonce_odr whose address is not used.
* makes the gold plugin responsible for handling the API mismatch.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193800 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm-c/lto.h | 9 | ||||
-rw-r--r-- | include/llvm/LTO/LTOCodeGenerator.h | 6 | ||||
-rw-r--r-- | include/llvm/Transforms/IPO.h | 18 |
3 files changed, 1 insertions, 32 deletions
diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index a09db24f98..89f54b7a7b 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -270,15 +270,6 @@ lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, extern void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, const char* symbol); - -/** - * Tells LTO optimization passes that a dynamic shared library is being - * built and this symbol may be exported. Unless IR semantics allow the symbol - * to be made local to the library, it should remain so it can be exported by - * the shared library. - */ -extern void lto_codegen_add_dso_symbol(lto_code_gen_t cg, const char *symbol); - /** * Writes a new object file at the specified path that contains the * merged contents of all modules added so far. diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 9f50770dcd..97a5066339 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -73,10 +73,6 @@ 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(), @@ -130,7 +126,6 @@ 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); @@ -143,7 +138,6 @@ 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 ed2823098a..7f51c516b9 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -111,25 +111,9 @@ Pass *createPruneEHPass(); /// 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, - ArrayRef<const char *> DSOList); +ModulePass *createInternalizePass(ArrayRef<const char *> ExportList); /// createInternalizePass - Same as above, but with an empty exportList. ModulePass *createInternalizePass(); |