]> granicus.if.org Git - llvm/commitdiff
[llvm-readobj] [COFF] Print the symbol index for relocations
authorMartin Storsjo <martin@martin.st>
Thu, 3 Jan 2019 08:08:23 +0000 (08:08 +0000)
committerMartin Storsjo <martin@martin.st>
Thu, 3 Jan 2019 08:08:23 +0000 (08:08 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350288 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 5fe475ee8f46efbd84c65ff527dc3f111bb5793d..b753d261a0fc839b4c5b8c2a7d325e1d0fc73ce3 100644 (file)
@@ -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);
index e17f0e2783e1e838c728cbb2d33a9283ca7e9c78..fc1deeba339a781c84672a3eb58a795216128139 100644 (file)
@@ -1065,6 +1065,16 @@ COFFObjectFile::getSymbolAuxData(COFFSymbolRef Symbol) const {
   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;
index 6f172922e9b8ed9d86b89cf67503a459a337cd49..a9b7e6dbd5de5cb176b93420a64ebbd0ce9464a5 100644 (file)
@@ -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:]
index 3bd0c6b0269a75fc55e8c9e1d9d68398c3253832..e7ee2a016a40783aaa6e61801fc4d054d4b9044f 100644 (file)
@@ -13,16 +13,19 @@ RUN:   | FileCheck %s --check-prefix COFF-I386
 // 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: ]
index 4a7dfa5eba0e389e2a5b44f0120c11ec6e420198..7f1d3fa2b6329acd9a291bbc1848f63fe287ff2f 100644 (file)
@@ -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: ]
 
index 36654919201b53555111c58d64d085ac36eb4847..a58e9d1a5b973e88d0a0226397e6aaaae3bfa57e 100644 (file)
@@ -1365,10 +1365,12 @@ void COFFDumper::printRelocation(const SectionRef &Section,
   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 SectionRef &Section,
     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";
   }
 }