diff options
author | Rui Ueyama <ruiu@google.com> | 2014-11-19 02:07:10 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-11-19 02:07:10 +0000 |
commit | 970dda295e708a54df1c9516c365a915ba68e96c (patch) | |
tree | be55dcaa1f2808d0baf81e2cb9a972108d721d57 /llvm | |
parent | 13d123ccf76e235e687b06d3ab6943d2fb5e2059 (diff) | |
download | bcm5719-llvm-970dda295e708a54df1c9516c365a915ba68e96c.tar.gz bcm5719-llvm-970dda295e708a54df1c9516c365a915ba68e96c.zip |
llvm-readobj: fix off-by-one error in COFFDumper
It printed out base relocation table header as table entry.
This patch also makes llvm-readobj to not skip ABSOLUTE entries
becuase it was confusing.
llvm-svn: 222299
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 2 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/coff-basereloc.test | 38 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 5 |
3 files changed, 23 insertions, 22 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index c5d7c409519..d5ff7d6439c 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -1491,7 +1491,7 @@ void BaseRelocRef::moveNext() { // Header->BlockSize is the size of the current block, including the // size of the header itself. uint32_t Size = sizeof(*Header) + - sizeof(coff_base_reloc_block_entry) * Index; + sizeof(coff_base_reloc_block_entry) * (Index + 1); if (Size == Header->BlockSize) { // .reloc contains a list of base relocation blocks. Each block // consists of the header followed by entries. The header contains diff --git a/llvm/test/tools/llvm-readobj/coff-basereloc.test b/llvm/test/tools/llvm-readobj/coff-basereloc.test index 752e73ab2d4..cd6687cae44 100644 --- a/llvm/test/tools/llvm-readobj/coff-basereloc.test +++ b/llvm/test/tools/llvm-readobj/coff-basereloc.test @@ -1,20 +1,24 @@ RUN: llvm-readobj -coff-basereloc %p/Inputs/basereloc.obj.coff-i386 | FileCheck %s -CHECK: Format: COFF-i386 -CHECK: Arch: i386 -CHECK: AddressSize: 32bit -CHECK: BaseReloc [ -CHECK: Entry { -CHECK: Type: HIGHLOW -CHECK: Address: 0x1004 -CHECK: } -CHECK: Entry { -CHECK: Type: HIGHLOW -CHECK: Address: 0x100A -CHECK: } -CHECK: Entry { -CHECK: Type: HIGHLOW -CHECK: Address: 0x1010 -CHECK: } -CHECK: ] +CHECK: Format: COFF-i386 +CHECK-NEXT: Arch: i386 +CHECK-NEXT: AddressSize: 32bit +CHECK-NEXT: BaseReloc [ +CHECK-NEXT: Entry { +CHECK-NEXT: Type: HIGHLOW +CHECK-NEXT: Address: 0x1004 +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Type: HIGHLOW +CHECK-NEXT: Address: 0x100A +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Type: HIGHLOW +CHECK-NEXT: Address: 0x1010 +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Type: ABSOLUTE +CHECK-NEXT: Address: 0x1000 +CHECK-NEXT: } +CHECK-NEXT: ] diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 2ea3cd8a3da..4e1bf2cbbd3 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -1086,7 +1086,7 @@ static StringRef getBaseRelocTypeName(uint8_t Type) { case COFF::IMAGE_REL_BASED_HIGHLOW: return "HIGHLOW"; case COFF::IMAGE_REL_BASED_HIGHADJ: return "HIGHADJ"; case COFF::IMAGE_REL_BASED_DIR64: return "DIR64"; - default: return "unknown"; + default: return "unknown (" + std::to_string(Type) + ")"; } } @@ -1099,9 +1099,6 @@ void COFFDumper::printCOFFBaseReloc() { continue; if (error(I.getType(Type))) continue; - // IMAGE_REL_BASED_ABSOLUTE is a NOP entry. - if (Type == COFF::IMAGE_REL_BASED_ABSOLUTE) - continue; DictScope Import(W, "Entry"); W.printString("Type", getBaseRelocTypeName(Type)); W.printHex("Address", RVA); |