[lld] r242816 - Keep track of which string table is associated with a symbol table.

Rafael Espindola rafael.espindola at gmail.com
Tue Jul 21 11:00:40 PDT 2015


Author: rafael
Date: Tue Jul 21 13:00:39 2015
New Revision: 242816

URL: http://llvm.org/viewvc/llvm-project?rev=242816&view=rev
Log:
Keep track of which string table is associated with a symbol table.

This removes the last uses of getStaticSymbolName in lld.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp?rev=242816&r1=242815&r2=242816&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp Tue Jul 21 13:00:39 2015
@@ -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 EL
     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;





More information about the llvm-commits mailing list