[llvm] [llvm-objdump] --adjust-vma: Call getInstruction with adjusted address (PR #140471)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun May 18 12:11:17 PDT 2025


https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/140471

llvm-objdump currently calls MCDisassembler::getInstruction with
unadjusted address and MCInstPrinter::printInst with adjusted address.
The decoded branch targets will be adjusted as expected for most targets
(as the getInstruction address is insignificant) but not for SystemZ
(where the getInstruction address is displayed).

Specify an adjust address to fix SystemZInstPrinter output.

The added test utilizes llvm/utils/update_test_body.py to make updates
easier and additionally checks that we don't adjust SHN_ABS symbol
addresses.


>From 93d8c9c77d5fc2eb6e8904b4f3290eeac4338876 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sun, 18 May 2025 12:11:07 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.5-bogner
---
 .../llvm-objdump/ELF/SystemZ/adjust-vma.test  | 96 +++++++++++++++++++
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |  2 +-
 2 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/tools/llvm-objdump/ELF/SystemZ/adjust-vma.test

diff --git a/llvm/test/tools/llvm-objdump/ELF/SystemZ/adjust-vma.test b/llvm/test/tools/llvm-objdump/ELF/SystemZ/adjust-vma.test
new file mode 100644
index 0000000000000..9cc93fb1af8d8
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/SystemZ/adjust-vma.test
@@ -0,0 +1,96 @@
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: yaml2obj a.yaml -o out
+# RUN: llvm-objdump -td --adjust-vma=0x200000 --no-show-raw-insn out | FileCheck %s --match-full-lines
+
+# CHECK:      SYMBOL TABLE:
+# CHECK-NEXT: 0000000001200104 l       .text  0000000000000000 f1
+# CHECK-NEXT: 0000000001200106 l       .text  0000000000000000 f2
+# CHECK-NEXT: 0000000000000800 l       *ABS*  0000000000000000 abs
+
+# CHECK:      00000000012000f8 <_start>:
+# CHECK-NEXT:  12000f8: brasl   %r14, 0x1200104
+# CHECK-NEXT:  12000fe: brasl   %r14, 0x1200106
+# CHECK-EMPTY:
+# CHECK-NEXT: 0000000001200104 <f1>:
+# CHECK-NEXT:  1200104: br      %r14
+# CHECK-EMPTY:
+# CHECK-NEXT: 0000000001200106 <f2>:
+# CHECK-NEXT:  1200106: br      %r14
+
+#--- a.s
+.globl _start
+_start:
+  brasl %r14, f1
+  brasl %r14, f2
+
+f1:
+  br %r14
+f2:
+  br %r14
+
+abs = 0x800
+#--- gen
+LLD_IN_TEST=1 clang --target=s390x-linux -no-pie -nostdlib -Wl,--no-rosegment,-zseparate-code,-znorelro,-znognustack -fuse-ld=lld a.s -o a
+obj2yaml a
+#--- a.yaml
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2MSB
+  Type:            ET_EXEC
+  Machine:         EM_S390
+  Entry:           0x10000F8
+ProgramHeaders:
+  - Type:            PT_PHDR
+    Flags:           [ PF_R ]
+    VAddr:           0x1000040
+    Align:           0x8
+    Offset:          0x40
+  - Type:            PT_INTERP
+    Flags:           [ PF_R ]
+    FirstSec:        .interp
+    LastSec:         .interp
+    VAddr:           0x10000E8
+    Offset:          0xE8
+  - Type:            PT_LOAD
+    Flags:           [ PF_X, PF_R ]
+    FirstSec:        .interp
+    LastSec:         .text
+    VAddr:           0x1000000
+    Align:           0x1000
+    Offset:          0x0
+Sections:
+  - Name:            .interp
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x10000E8
+    AddressAlign:    0x1
+    Content:         2F6C69622F6C6436342E736F2E3100
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x10000F8
+    AddressAlign:    0x4
+    Content:         C0E500000006C0E50000000407FE07FE
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Offset:          0x1000
+    Content:         4C696E6B65723A204C4C442032312E302E3000
+Symbols:
+  - Name:            f1
+    Section:         .text
+    Value:           0x1000104
+  - Name:            f2
+    Section:         .text
+    Value:           0x1000106
+  - Name:            abs
+    Index:           SHN_ABS
+    Value:           0x800
+  - Name:            _start
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x10000F8
+...
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 7a778da2d3a49..99bb41f5b95a7 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -2323,7 +2323,7 @@ disassembleObject(ObjectFile &Obj, const ObjectFile &DbgObj,
           // provided
           MCInst Inst;
           ArrayRef<uint8_t> ThisBytes = Bytes.slice(Index);
-          uint64_t ThisAddr = SectionAddr + Index;
+          uint64_t ThisAddr = SectionAddr + Index + VMAAdjustment;
           bool Disassembled = DT->DisAsm->getInstruction(
               Inst, Size, ThisBytes, ThisAddr, CommentStream);
           if (Size == 0)



More information about the llvm-commits mailing list