diff options
author | jasonliu <jasonliu.development@gmail.com> | 2020-04-13 15:49:36 +0000 |
---|---|---|
committer | jasonliu <jasonliu.development@gmail.com> | 2020-04-13 15:51:36 +0000 |
commit | 40f7ab507b39c183533746e00133b7ecd43c4e75 (patch) | |
tree | 9547f9319dabd3f90f826f380728b1448bd7738a | |
parent | bc78baec4cc3ac95a931f4708f1534af7ff77de5 (diff) | |
download | llvm-40f7ab507b39c183533746e00133b7ecd43c4e75.zip llvm-40f7ab507b39c183533746e00133b7ecd43c4e75.tar.gz llvm-40f7ab507b39c183533746e00133b7ecd43c4e75.tar.bz2 |
[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
3 files changed, 134 insertions, 17 deletions
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 0000000..cf40fc0 --- /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 1dee2aa..230f2e9 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 f407f14..dd1fec6 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; |