aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-04-02 03:33:31 +0000
committerBill Wendling <isanbard@gmail.com>2012-04-02 03:33:31 +0000
commit1fcbca05db736afc3e555aadc14ae3a5bef59198 (patch)
tree11858d1fb857a8578981839b28723b45b3d7eda6 /tools
parenta4bd58b0f0d6ca33ff230aff450c9f2b94934bff (diff)
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
Diffstat (limited to 'tools')
-rw-r--r--tools/lto/LTOModule.cpp26
-rw-r--r--tools/lto/LTOModule.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp
index fb66973357..3bd764cb76 100644
--- a/tools/lto/LTOModule.cpp
+++ b/tools/lto/LTOModule.cpp
@@ -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();
diff --git a/tools/lto/LTOModule.h b/tools/lto/LTOModule.h
index cafb927abf..6280c6770d 100644
--- a/tools/lto/LTOModule.h
+++ b/tools/lto/LTOModule.h
@@ -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;