It could come about that we parse the inline ASM before we get a potential

definition for it. In that case, we want to wait for the potential definition
before we create a symbol for it.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153859 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2012-04-02 03:33:31 +00:00
parent a4bd58b0f0
commit 1fcbca05db
2 changed files with 27 additions and 0 deletions

View File

@ -399,6 +399,18 @@ void LTOModule::addAsmGlobalSymbol(const char *name,
NameAndAttributes &info = _undefines[entry.getKey().data()];
if (info.symbol == 0) {
// If we haven't seen this symbol before, save it and we may see it again.
StringMap<NameAndAttributes>::value_type
&asm_entry = _asm_defines.GetOrCreateValue(name);
NameAndAttributes &asm_info = _asm_defines[asm_entry.getKey().data()];
asm_info.name = name;
asm_info.attributes = scope;
asm_info.isFunction = false;
asm_info.symbol = 0;
return;
}
if (info.isFunction)
addDefinedFunctionSymbol(cast<Function>(info.symbol));
else
@ -452,6 +464,20 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue *decl, bool isFunc) {
if (entry.getValue().name)
return;
StringMap<NameAndAttributes>::value_type &asm_entry =
_asm_defines.GetOrCreateValue(name);
if (asm_entry.getValue().name != 0) {
if (isFunc)
addDefinedFunctionSymbol(cast<Function>(decl));
else
addDefinedDataSymbol(decl);
_symbols.back().attributes &= ~LTO_SYMBOL_SCOPE_MASK;
_symbols.back().attributes |= asm_entry.getValue().attributes;
return;
}
NameAndAttributes info;
info.name = entry.getKey().data();

View File

@ -53,6 +53,7 @@ private:
// _defines and _undefines only needed to disambiguate tentative definitions
StringSet _defines;
llvm::StringMap<NameAndAttributes> _undefines;
llvm::StringMap<NameAndAttributes> _asm_defines;
std::vector<const char*> _asm_undefines;
llvm::MCContext _context;