[llvm] r350288 - [llvm-readobj] [COFF] Print the symbol index for relocations

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 3 00:08:24 PST 2019


Author: mstorsjo
Date: Thu Jan  3 00:08:23 2019
New Revision: 350288

URL: http://llvm.org/viewvc/llvm-project?rev=350288&view=rev
Log:
[llvm-readobj] [COFF] Print the symbol index for relocations

There can be multiple local symbols with the same name (for e.g.
comdat sections), and thus the symbol name itself isn't enough
to disambiguate symbols.

Differential Revision: https://reviews.llvm.org/D56140

Modified:
    llvm/trunk/include/llvm/Object/COFF.h
    llvm/trunk/lib/Object/COFFObjectFile.cpp
    llvm/trunk/test/MC/COFF/cross-section-relative.s
    llvm/trunk/test/Object/yaml2obj-readobj.test
    llvm/trunk/test/tools/llvm-readobj/relocations.test
    llvm/trunk/tools/llvm-readobj/COFFDumper.cpp

Modified: llvm/trunk/include/llvm/Object/COFF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/COFF.h (original)
+++ llvm/trunk/include/llvm/Object/COFF.h Thu Jan  3 00:08:23 2019
@@ -1022,6 +1022,8 @@ public:
 
   ArrayRef<uint8_t> getSymbolAuxData(COFFSymbolRef Symbol) const;
 
+  uint32_t getSymbolIndex(COFFSymbolRef Symbol) const;
+
   size_t getSymbolTableEntrySize() const {
     if (COFFHeader)
       return sizeof(coff_symbol16);

Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/COFFObjectFile.cpp Thu Jan  3 00:08:23 2019
@@ -1065,6 +1065,16 @@ COFFObjectFile::getSymbolAuxData(COFFSym
   return makeArrayRef(Aux, Symbol.getNumberOfAuxSymbols() * SymbolSize);
 }
 
+uint32_t COFFObjectFile::getSymbolIndex(COFFSymbolRef Symbol) const {
+  uintptr_t Offset =
+      reinterpret_cast<uintptr_t>(Symbol.getRawPtr()) - getSymbolTable();
+  assert(Offset % getSymbolTableEntrySize() == 0 &&
+         "Symbol did not point to the beginning of a symbol");
+  size_t Index = Offset / getSymbolTableEntrySize();
+  assert(Index < getNumberOfSymbols());
+  return Index;
+}
+
 std::error_code COFFObjectFile::getSectionName(const coff_section *Sec,
                                                StringRef &Res) const {
   StringRef Name;

Modified: llvm/trunk/test/MC/COFF/cross-section-relative.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/cross-section-relative.s?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/test/MC/COFF/cross-section-relative.s (original)
+++ llvm/trunk/test/MC/COFF/cross-section-relative.s Thu Jan  3 00:08:23 2019
@@ -87,21 +87,25 @@ t6:
 // READOBJ-NEXT:      Offset: 0x0
 // READOBJ-NEXT:      Type: IMAGE_REL_AMD64_REL32 (4)
 // READOBJ-NEXT:      Symbol: g3
+// READOBJ-NEXT:      SymbolIndex: 12
 // READOBJ-NEXT:    }
 // READOBJ-NEXT:    Relocation {
 // READOBJ-NEXT:      Offset: 0x4
 // READOBJ-NEXT:      Type: IMAGE_REL_AMD64_ADDR32NB (3)
 // READOBJ-NEXT:      Symbol: g3
+// READOBJ-NEXT:      SymbolIndex: 12
 // READOBJ-NEXT:    }
 // READOBJ-NEXT:    Relocation {
 // READOBJ-NEXT:      Offset: 0x20
 // READOBJ-NEXT:      Type: IMAGE_REL_AMD64_REL32 (4)
 // READOBJ-NEXT:      Symbol: g3
+// READOBJ-NEXT:      SymbolIndex: 12
 // READOBJ-NEXT:    }
 // READOBJ-NEXT:    Relocation {
 // READOBJ-NEXT:      Offset: 0x28
 // READOBJ-NEXT:      Type: IMAGE_REL_AMD64_REL32 (4)
 // READOBJ-NEXT:      Symbol: foobar
+// READOBJ-NEXT:      SymbolIndex: 20
 // READOBJ-NEXT:    }
 // READOBJ-NEXT:  }
 // READOBJ-NEXT:]

Modified: llvm/trunk/test/Object/yaml2obj-readobj.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/yaml2obj-readobj.test?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/test/Object/yaml2obj-readobj.test (original)
+++ llvm/trunk/test/Object/yaml2obj-readobj.test Thu Jan  3 00:08:23 2019
@@ -13,16 +13,19 @@ RUN:   | FileCheck %s --check-prefix COF
 // COFF-I386-NEXT:       Offset: 0xE
 // COFF-I386-NEXT:       Type: IMAGE_REL_I386_DIR32 (6)
 // COFF-I386-NEXT:       Symbol: L_.str
+// COFF-I386-NEXT:       SymbolIndex: 5
 // COFF-I386-NEXT:     }
 // COFF-I386-NEXT:     Relocation {
 // COFF-I386-NEXT:       Offset: 0x13
 // COFF-I386-NEXT:       Type: IMAGE_REL_I386_REL32 (20)
 // COFF-I386-NEXT:       Symbol: _puts
+// COFF-I386-NEXT:       SymbolIndex: 6
 // COFF-I386-NEXT:     }
 // COFF-I386-NEXT:     Relocation {
 // COFF-I386-NEXT:       Offset: 0x18
 // COFF-I386-NEXT:       Type: IMAGE_REL_I386_REL32 (20)
 // COFF-I386-NEXT:       Symbol: _SomeOtherFunction
+// COFF-I386-NEXT:       SymbolIndex: 7
 // COFF-I386-NEXT:     }
 // COFF-I386-NEXT:   }
 // COFF-I386-NEXT: ]

Modified: llvm/trunk/test/tools/llvm-readobj/relocations.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/relocations.test?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/relocations.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/relocations.test Thu Jan  3 00:08:23 2019
@@ -21,9 +21,9 @@ RUN:   | FileCheck %s -check-prefix WASM
 
 COFF:      Relocations [
 COFF-NEXT:   Section (1) .text {
-COFF-NEXT:     0x4 IMAGE_REL_I386_DIR32 .data
-COFF-NEXT:     0x9 IMAGE_REL_I386_REL32 _puts
-COFF-NEXT:     0xE IMAGE_REL_I386_REL32 _SomeOtherFunction
+COFF-NEXT:     0x4 IMAGE_REL_I386_DIR32 .data (4)
+COFF-NEXT:     0x9 IMAGE_REL_I386_REL32 _puts (7)
+COFF-NEXT:     0xE IMAGE_REL_I386_REL32 _SomeOtherFunction (8)
 COFF-NEXT:   }
 COFF-NEXT: ]
 

Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=350288&r1=350287&r2=350288&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Thu Jan  3 00:08:23 2019
@@ -1365,10 +1365,12 @@ void COFFDumper::printRelocation(const S
   StringRef SymbolName;
   Reloc.getTypeName(RelocName);
   symbol_iterator Symbol = Reloc.getSymbol();
+  int64_t SymbolIndex = -1;
   if (Symbol != Obj->symbol_end()) {
     Expected<StringRef> SymbolNameOrErr = Symbol->getName();
     error(errorToErrorCode(SymbolNameOrErr.takeError()));
     SymbolName = *SymbolNameOrErr;
+    SymbolIndex = Obj->getSymbolIndex(Obj->getCOFFSymbol(*Symbol));
   }
 
   if (opts::ExpandRelocs) {
@@ -1376,11 +1378,13 @@ void COFFDumper::printRelocation(const S
     W.printHex("Offset", Offset);
     W.printNumber("Type", RelocName, RelocType);
     W.printString("Symbol", SymbolName.empty() ? "-" : SymbolName);
+    W.printNumber("SymbolIndex", SymbolIndex);
   } else {
     raw_ostream& OS = W.startLine();
     OS << W.hex(Offset)
        << " " << RelocName
        << " " << (SymbolName.empty() ? "-" : SymbolName)
+       << " (" << SymbolIndex << ")"
        << "\n";
   }
 }




More information about the llvm-commits mailing list