diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-21 18:00:39 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-21 18:00:39 +0000 |
| commit | 16154afb0614bf2010ad295ee89d01106a0c4d64 (patch) | |
| tree | 81d5012d9169f2b8fbfe0fd620eece93f0d6d530 /lld/lib/ReaderWriter/ELF | |
| parent | 5699eed60800197660f94fabb312de26755b9706 (diff) | |
| download | bcm5719-llvm-16154afb0614bf2010ad295ee89d01106a0c4d64.tar.gz bcm5719-llvm-16154afb0614bf2010ad295ee89d01106a0c4d64.zip | |
Keep track of which string table is associated with a symbol table.
This removes the last uses of getStaticSymbolName in lld.
llvm-svn: 242816
Diffstat (limited to 'lld/lib/ReaderWriter/ELF')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ELFFile.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.cpp b/lld/lib/ReaderWriter/ELF/ELFFile.cpp index cac34bad0fa..6475a11a204 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFFile.cpp @@ -208,18 +208,25 @@ template <class ELFT> std::error_code ELFFile<ELFT>::createSymbolsFromAtomizableSections() { // Increment over all the symbols collecting atoms and symbol names for // later use. - auto SymI = _objFile->symbol_begin(), SymE = _objFile->symbol_end(); + const Elf_Shdr *symtab = _objFile->getDotSymtabSec(); + if (!symtab) + return std::error_code(); + + ErrorOr<StringRef> strTableOrErr = _objFile->getStringTableForSymtab(*symtab); + if (std::error_code ec = strTableOrErr.getError()) + return ec; + StringRef strTable = *strTableOrErr; + auto SymI = _objFile->symbol_begin(), SymE = _objFile->symbol_end(); // Skip over dummy sym. - if (SymI != SymE) - ++SymI; + ++SymI; for (; SymI != SymE; ++SymI) { ErrorOr<const Elf_Shdr *> section = _objFile->getSection(&*SymI); if (std::error_code ec = section.getError()) return ec; - auto symbolName = _objFile->getStaticSymbolName(SymI); + auto symbolName = SymI->getName(strTable); if (std::error_code ec = symbolName.getError()) return ec; @@ -301,11 +308,19 @@ template <class ELFT> std::error_code ELFFile<ELFT>::createAtoms() { ELFDefinedAtom<ELFT> *previousAtom = nullptr; ELFReference<ELFT> *anonFollowedBy = nullptr; + const Elf_Shdr *symtab = _objFile->getDotSymtabSec(); + if (!symtab) + continue; + ErrorOr<StringRef> strTableOrErr = + _objFile->getStringTableForSymtab(*symtab); + if (std::error_code ec = strTableOrErr.getError()) + return ec; + StringRef strTable = *strTableOrErr; for (auto si = symbols.begin(), se = symbols.end(); si != se; ++si) { auto symbol = *si; StringRef symbolName = ""; if (symbol->getType() != llvm::ELF::STT_SECTION) { - auto symName = _objFile->getStaticSymbolName(symbol); + auto symName = symbol->getName(strTable); if (std::error_code ec = symName.getError()) return ec; symbolName = *symName; |

