[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