mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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
This commit is contained in:
parent
16ffa807fc
commit
7431af050f
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user