From 0239fd32a434cdf50285eb159db6822b1a445cbb Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Thu, 3 Jan 2019 08:08:23 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350288 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFF.h | 2 ++ lib/Object/COFFObjectFile.cpp | 10 ++++++++++ test/MC/COFF/cross-section-relative.s | 4 ++++ test/Object/yaml2obj-readobj.test | 3 +++ test/tools/llvm-readobj/relocations.test | 6 +++--- tools/llvm-readobj/COFFDumper.cpp | 4 ++++ 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 5fe475ee8f4..b753d261a0f 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -1022,6 +1022,8 @@ public: ArrayRef getSymbolAuxData(COFFSymbolRef Symbol) const; + uint32_t getSymbolIndex(COFFSymbolRef Symbol) const; + size_t getSymbolTableEntrySize() const { if (COFFHeader) return sizeof(coff_symbol16); diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index e17f0e2783e..fc1deeba339 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -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(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; diff --git a/test/MC/COFF/cross-section-relative.s b/test/MC/COFF/cross-section-relative.s index 6f172922e9b..a9b7e6dbd5d 100644 --- a/test/MC/COFF/cross-section-relative.s +++ b/test/MC/COFF/cross-section-relative.s @@ -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:] diff --git a/test/Object/yaml2obj-readobj.test b/test/Object/yaml2obj-readobj.test index 3bd0c6b0269..e7ee2a016a4 100644 --- a/test/Object/yaml2obj-readobj.test +++ b/test/Object/yaml2obj-readobj.test @@ -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: ] diff --git a/test/tools/llvm-readobj/relocations.test b/test/tools/llvm-readobj/relocations.test index 4a7dfa5eba0..7f1d3fa2b63 100644 --- a/test/tools/llvm-readobj/relocations.test +++ b/test/tools/llvm-readobj/relocations.test @@ -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: ] diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index 36654919201..a58e9d1a5b9 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/tools/llvm-readobj/COFFDumper.cpp @@ -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 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"; } } -- 2.50.1