diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2009-04-24 16:55:21 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2009-04-24 16:55:21 +0000 |
commit | 7431af050f287011fd52e64034ede6dd98193feb (patch) | |
tree | a6bc5dbc0d059f99cbfbfef6c94ecf0f4ad00ad7 | |
parent | 16ffa807fc93eee79f1775cffe94cef174755455 (diff) | |
download | external_llvm-7431af050f287011fd52e64034ede6dd98193feb.zip external_llvm-7431af050f287011fd52e64034ede6dd98193feb.tar.gz external_llvm-7431af050f287011fd52e64034ede6dd98193feb.tar.bz2 |
Add LTO_SYMBOL_DEFINITION_WEAKUNDEF, use that on the gold plugin.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69972 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm-c/lto.h | 1 | ||||
-rw-r--r-- | tools/gold/gold-plugin.cpp | 3 | ||||
-rw-r--r-- | tools/lto/LTOModule.cpp | 26 | ||||
-rw-r--r-- | tools/lto/LTOModule.h | 2 |
4 files changed, 23 insertions, 9 deletions
diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index 1d98814..98b9e08 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -30,6 +30,7 @@ typedef enum { LTO_SYMBOL_DEFINITION_TENTATIVE = 0x00000200, LTO_SYMBOL_DEFINITION_WEAK = 0x00000300, LTO_SYMBOL_DEFINITION_UNDEFINED = 0x00000400, + LTO_SYMBOL_DEFINITION_WEAKUNDEF = 0x00000500, LTO_SYMBOL_SCOPE_MASK = 0x00003800, LTO_SYMBOL_SCOPE_INTERNAL = 0x00000800, LTO_SYMBOL_SCOPE_HIDDEN = 0x00001000, diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 9ad0450..260e175 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -257,6 +257,9 @@ ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, case LTO_SYMBOL_DEFINITION_WEAK: sym.def = LDPK_WEAKDEF; break; + case LTO_SYMBOL_DEFINITION_WEAKUNDEF: + sym.def = LDPK_WEAKUNDEF; + break; default: (*message)(LDPL_ERROR, "Unknown definition attribute: %d", definition); return LDPS_ERR; diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index 71f3850..78c8cfe 100644 --- a/tools/lto/LTOModule.cpp +++ b/tools/lto/LTOModule.cpp @@ -258,9 +258,21 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue* decl, Mangler &mangler) { const char* name = mangler.getValueName(decl).c_str(); // ignore all llvm.* symbols - if ( strncmp(name, "llvm.", 5) != 0 ) { - _undefines[name] = 1; - } + if ( strncmp(name, "llvm.", 5) == 0 ) + return; + + // we already have the symbol + if (_undefines.find(name) != _undefines.end()) + return; + + NameAndAttributes info; + // string is owned by _undefines + info.name = ::strdup(name); + if (decl->hasExternalWeakLinkage()) + info.attributes = LTO_SYMBOL_DEFINITION_WEAKUNDEF; + else + info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; + _undefines[name] = info; } @@ -339,16 +351,14 @@ void LTOModule::lazyParseSymbols() } // make symbols for all undefines - for (StringSet::iterator it=_undefines.begin(); + for (StringMap<NameAndAttributes>::iterator it=_undefines.begin(); it != _undefines.end(); ++it) { // if this symbol also has a definition, then don't make an undefine // because it is a tentative definition if ( _defines.count(it->getKeyData(), it->getKeyData()+ it->getKeyLength()) == 0 ) { - NameAndAttributes info; - info.name = it->getKeyData(); - info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; - _symbols.push_back(info); + NameAndAttributes info = it->getValue(); + _symbols.push_back(info); } } } diff --git a/tools/lto/LTOModule.h b/tools/lto/LTOModule.h index 0cb9cdc..c233740 100644 --- a/tools/lto/LTOModule.h +++ b/tools/lto/LTOModule.h @@ -97,7 +97,7 @@ private: std::vector<NameAndAttributes> _symbols; // _defines and _undefines only needed to disambiguate tentative definitions StringSet _defines; - StringSet _undefines; + llvm::StringMap<NameAndAttributes> _undefines; }; extern std::string getFeatureString(const char *TargetTriple); |