[PATCH] D77580: [llvm-objdump] Fix incomplete relocation output for -D -r mode

Jason Liu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 7 11:23:18 PDT 2020


jasonliu updated this revision to Diff 255735.
jasonliu added a comment.

Add comments for print in the middle behavior.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77580/new/

https://reviews.llvm.org/D77580

Files:
  llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
  llvm/tools/llvm-objdump/llvm-objdump.cpp


Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1514,18 +1514,12 @@
         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
@@ -1582,7 +1576,7 @@
 
         // 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.
@@ -1591,7 +1585,11 @@
               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, and we would see relocation prints in
+            // the middle of the complete data. But this matches the binutils
+            // objdump output.
             if (Offset >= Index + Size)
               break;
 
Index: llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
===================================================================
--- llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test
+++ 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:        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>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77580.255735.patch
Type: text/x-patch
Size: 4213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200407/a5a21544/attachment.bin>


More information about the llvm-commits mailing list