summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Object/COFF.h2
-rw-r--r--llvm/lib/Object/COFFObjectFile.cpp10
-rw-r--r--llvm/test/MC/COFF/cross-section-relative.s4
-rw-r--r--llvm/test/Object/yaml2obj-readobj.test3
-rw-r--r--llvm/test/tools/llvm-readobj/relocations.test6
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp4
6 files changed, 26 insertions, 3 deletions
diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h
index 5fe475ee8f4..b753d261a0f 100644
--- a/llvm/include/llvm/Object/COFF.h
+++ b/llvm/include/llvm/Object/COFF.h
@@ -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);
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp
index e17f0e2783e..fc1deeba339 100644
--- a/llvm/lib/Object/COFFObjectFile.cpp
+++ b/llvm/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<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;
diff --git a/llvm/test/MC/COFF/cross-section-relative.s b/llvm/test/MC/COFF/cross-section-relative.s
index 6f172922e9b..a9b7e6dbd5d 100644
--- a/llvm/test/MC/COFF/cross-section-relative.s
+++ b/llvm/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/llvm/test/Object/yaml2obj-readobj.test b/llvm/test/Object/yaml2obj-readobj.test
index 3bd0c6b0269..e7ee2a016a4 100644
--- a/llvm/test/Object/yaml2obj-readobj.test
+++ b/llvm/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/llvm/test/tools/llvm-readobj/relocations.test b/llvm/test/tools/llvm-readobj/relocations.test
index 4a7dfa5eba0..7f1d3fa2b63 100644
--- a/llvm/test/tools/llvm-readobj/relocations.test
+++ b/llvm/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/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index 36654919201..a58e9d1a5b9 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/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<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";
}
}
OpenPOWER on IntegriCloud