[llvm] 40f7ab5 - [llvm-objdump] Fix incomplete relocation output for -D -r mode
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 13 08:51:56 PDT 2020
Author: jasonliu
Date: 2020-04-13T15:51:36Z
New Revision: 40f7ab507b39c183533746e00133b7ecd43c4e75
URL: https://github.com/llvm/llvm-project/commit/40f7ab507b39c183533746e00133b7ecd43c4e75
DIFF: https://github.com/llvm/llvm-project/commit/40f7ab507b39c183533746e00133b7ecd43c4e75.diff
LOG: [llvm-objdump] Fix incomplete relocation output for -D -r mode
This patch intends to fix incomplete relocation printing for
XCOFF (potentially for other targets).
Differential Revision: https://reviews.llvm.org/D77580
Added:
llvm/test/tools/llvm-objdump/MachO/disassemble-relocs-data-x86_64.test
Modified:
llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
llvm/tools/llvm-objdump/llvm-objdump.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-objdump/MachO/disassemble-relocs-data-x86_64.test b/llvm/test/tools/llvm-objdump/MachO/disassemble-relocs-data-x86_64.test
new file mode 100644
index 000000000000..cf40fc0fcc13
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/MachO/disassemble-relocs-data-x86_64.test
@@ -0,0 +1,113 @@
+# REQUIRES: x86-registered-target
+# RUN: yaml2obj < %s -o %.o
+# RUN: llvm-objdump -D -r %.o | FileCheck %s
+
+## The yaml file below is generated by the following C code:
+## extern char s[];
+## void *p = s + 0x60606060606060;
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 360
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 232
+ segname: ''
+ vmaddr: 0
+ vmsize: 8
+ fileoff: 392
+ filesize: 8
+ maxprot: 7
+ initprot: 7
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 0
+ offset: 0x00000188
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: ''
+ - sectname: __data
+ segname: __DATA
+ addr: 0x0000000000000000
+ size: 8
+ offset: 0x00000188
+ align: 3
+ reloff: 0x00000190
+ nreloc: 1
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '6060606060606000'
+ - cmd: LC_BUILD_VERSION
+ cmdsize: 24
+ platform: 1
+ minos: 659200
+ sdk: 659204
+ ntools: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 408
+ nsyms: 1
+ stroff: 424
+ strsize: 4
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 0
+ iextdefsym: 0
+ nextdefsym: 1
+ iundefsym: 1
+ nundefsym: 0
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 2
+ n_desc: 0
+ n_value: 0
+ StringTable:
+ - ''
+ - _p
+...
+
+ CHECK: Disassembly of section __DATA,__data:
+CHECK-EMPTY:
+ CHECK-NEXT: 0000000000000000 <_p>:
+ CHECK-NEXT: 0: 60 <unknown>
+ CHECK-NEXT: 0000000000000000: X86_64_RELOC_UNSIGNED 0 (?,?)
+ CHECK-NEXT: 1: 60 <unknown>
+ CHECK-NEXT: 2: 60 <unknown>
+ CHECK-NEXT: 3: 60 <unknown>
+ CHECK-NEXT: 4: 60 <unknown>
+ CHECK-NEXT: 5: 60 <unknown>
+ CHECK-NEXT: 6: 60 <unknown>
+ CHECK-NEXT: 7: 00 <unknown>
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
index 1dee2aa2d52a..230f2e9c592a 100644
--- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
@@ -1,7 +1,7 @@
# REQUIRES: powerpc-registered-target
# RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \
-# RUN: FileCheck --check-prefixes=CHECK,ONLY-D %s
+# RUN: FileCheck %s
# RUN: llvm-objdump -D -r %p/Inputs/xcoff-section-headers.o | \
# RUN: FileCheck --check-prefixes=CHECK,WITH-R %s
@@ -35,18 +35,24 @@ CHECK-NEXT: ...
CHECK: Disassembly of section .data:
CHECK: 00000080 <func>:
CHECK-NEXT: 80: 00 00 00 94 <unknown>
+WITH-R-NEXT: 00000080: R_POS func
CHECK: 00000084 <a>:
CHECK-NEXT: 84: 00 00 00 a4 <unknown>
+WITH-R-NEXT: 00000084: R_POS a
CHECK: 00000088 <b>:
CHECK-NEXT: 88: 00 00 00 a0 <unknown>
+WITH-R-NEXT: 00000088: R_POS b
CHECK: 0000008c <c>:
CHECK-NEXT: 8c: 00 00 00 08 <unknown>
+WITH-R-NEXT: 0000008c: R_TLS c
CHECK: 00000090 <d>:
-ONLY-D-NEXT: 90: 00 00 00 00 <unknown>
-WITH-R-NEXT: ...
+CHECK-NEXT: 90: 00 00 00 00 <unknown>
+WITH-R-NEXT: 00000090: R_TLS d
CHECK: 00000094 <func>:
CHECK-NEXT: 94: 00 00 00 00 <unknown>
+WITH-R-NEXT: 00000094: R_POS .func
CHECK-NEXT: 98: 00 00 00 80 <unknown>
+WITH-R-NEXT: 00000098: R_POS TOC
CHECK-NEXT: 9c: 00 00 00 00 <unknown>
CHECK: 000000a0 <b>:
CHECK-NEXT: a0: 00 00 30 39 <unknown>
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index f407f149b5d6..dd1fec61c10e 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1506,18 +1506,12 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
outs() << CommentStream.str();
Comments.clear();
- // If disassembly has failed, continue with the next instruction, to
- // avoid analysing invalid/incomplete instruction information.
- if (!Disassembled) {
- outs() << "\n";
- Index += Size;
- continue;
- }
-
- // Try to resolve the target of a call, tail call, etc. to a specific
- // symbol.
- if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) ||
- MIA->isConditionalBranch(Inst))) {
+ // If disassembly has failed, avoid analysing invalid/incomplete
+ // instruction information. Otherwise, try to resolve the target of a
+ // call, tail call, etc. to a specific symbol.
+ if (Disassembled && MIA &&
+ (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) ||
+ MIA->isConditionalBranch(Inst))) {
uint64_t Target;
if (MIA->evaluateBranch(Inst, SectionAddr + Index, Size, Target)) {
// In a relocatable object, the target's section must reside in
@@ -1574,7 +1568,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
// Hexagon does this in pretty printer
if (Obj->getArch() != Triple::hexagon) {
- // Print relocation for instruction.
+ // Print relocation for instruction and data.
while (RelCur != RelEnd) {
uint64_t Offset = RelCur->getOffset();
// If this relocation is hidden, skip it.
@@ -1583,7 +1577,11 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
continue;
}
- // Stop when RelCur's offset is past the current instruction.
+ // Stop when RelCur's offset is past the disassembled
+ // instruction/data. Note that it's possible the disassembled data
+ // is not the complete data: we might see the relocation printed in
+ // the middle of the data, but this matches the binutils objdump
+ // output.
if (Offset >= Index + Size)
break;
More information about the llvm-commits
mailing list