summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-07-21 18:00:39 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-07-21 18:00:39 +0000
commit16154afb0614bf2010ad295ee89d01106a0c4d64 (patch)
tree81d5012d9169f2b8fbfe0fd620eece93f0d6d530 /lld/lib/ReaderWriter/ELF
parent5699eed60800197660f94fabb312de26755b9706 (diff)
downloadbcm5719-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.cpp25
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;
OpenPOWER on IntegriCloud