diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-04-02 03:33:31 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-04-02 03:33:31 +0000 |
commit | 1fcbca05db736afc3e555aadc14ae3a5bef59198 (patch) | |
tree | 11858d1fb857a8578981839b28723b45b3d7eda6 /tools | |
parent | a4bd58b0f0d6ca33ff230aff450c9f2b94934bff (diff) | |
download | external_llvm-1fcbca05db736afc3e555aadc14ae3a5bef59198.zip external_llvm-1fcbca05db736afc3e555aadc14ae3a5bef59198.tar.gz external_llvm-1fcbca05db736afc3e555aadc14ae3a5bef59198.tar.bz2 |
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.cpp | 26 | ||||
-rw-r--r-- | tools/lto/LTOModule.h | 1 |
2 files changed, 27 insertions, 0 deletions
diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index fb66973..3bd764c 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 cafb927..6280c67 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; |