Skip to content

Commit 7026086

Browse files
[XCOFF] Use RLDs to print branches even without -r (#74342)
This presents misleading and confusing output. If you have a function defined at the beginning of an XCOFF object file, and you have a function call to an external function, the function call disassembles as a branch to the local function. That is, `void f() { f(); g();}` disassembles as >00000000 <.f>: 0: 7c 08 02 a6 mflr 0 4: 94 21 ff c0 stwu 1, -64(1) 8: 90 01 00 48 stw 0, 72(1) c: 4b ff ff f5 bl 0x0 <.f> 10: 4b ff ff f1 bl 0x0 <.f> With this PR, the second call will display: `10: 4b ff ff f1 bl 0x0 <.g> ` Using -r can help, but you still get the confusing output: >10: 4b ff ff f1 bl 0x0 <.f> 00000010: R_RBR .g
1 parent f54249e commit 7026086

File tree

8 files changed

+197
-59
lines changed

8 files changed

+197
-59
lines changed

llvm/test/CodeGen/PowerPC/aix-return55.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ entry:
3939
;CHECKOBJ-NEXT: 1c: 67 8a bc de oris 10, 28, 48350{{[[:space:]] *}}
4040
;CHECKOBJ32-NEXT: 00000020 <d>:
4141
;CHECKOBJ64-NEXT: 0000000000000020 <d>:
42-
;CHECKOBJ-NEXT: 20: 40 14 00 00 bdnzf 20, 0x20
42+
;CHECKOBJ-NEXT: 20: 40 14 00 00 bdnzf 20, 0x20 <d>
4343
;CHECKOBJ-NEXT: 24: 00 00 00 00 <unknown>{{[[:space:]] *}}
4444
;CHECKOBJ32-NEXT: 00000028 <foo>:
4545
;CHECKOBJ32-NEXT: 28: 00 00 00 00 <unknown>

llvm/test/CodeGen/PowerPC/aix-xcoff-funcsect.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ entry:
189189
; DIS32-NEXT: 40: 7c 08 02 a6 mflr 0
190190
; DIS32-NEXT: 44: 94 21 ff c0 stwu 1, -64(1)
191191
; DIS32-NEXT: 48: 90 01 00 48 stw 0, 72(1)
192-
; DIS32-NEXT: 4c: 4b ff ff b5 bl 0x0 <.alias_foo>
192+
; DIS32-NEXT: 4c: 4b ff ff b5 bl 0x0 <.foo>
193193
; DIS32-NEXT: 0000004c: R_RBR (idx: 7) .foo[PR]
194194
; DIS32-NEXT: 50: 60 00 00 00 nop
195195
; DIS32-NEXT: 54: 48 00 00 6d bl 0xc0 <.static_overalign_foo>
@@ -198,7 +198,7 @@ entry:
198198
; DIS32-NEXT: 5c: 4b ff ff a5 bl 0x0 <.alias_foo>
199199
; DIS32-NEXT: 0000005c: R_RBR (idx: 9) .alias_foo
200200
; DIS32-NEXT: 60: 60 00 00 00 nop
201-
; DIS32-NEXT: 64: 4b ff ff 9d bl 0x0 <.alias_foo>
201+
; DIS32-NEXT: 64: 4b ff ff 9d bl 0x0 <.extern_foo>
202202
; DIS32-NEXT: 00000064: R_RBR (idx: 1) .extern_foo[PR]
203203
; DIS32-NEXT: 68: 60 00 00 00 nop
204204
; DIS32-NEXT: 6c: 4b ff ff b5 bl 0x20 <.hidden_foo>
@@ -212,7 +212,7 @@ entry:
212212
; DIS64-NEXT: 40: 7c 08 02 a6 mflr 0
213213
; DIS64-NEXT: 44: f8 21 ff 91 stdu 1, -112(1)
214214
; DIS64-NEXT: 48: f8 01 00 80 std 0, 128(1)
215-
; DIS64-NEXT: 4c: 4b ff ff b5 bl 0x0 <.alias_foo>
215+
; DIS64-NEXT: 4c: 4b ff ff b5 bl 0x0 <.foo>
216216
; DIS64-NEXT: 000000000000004c: R_RBR (idx: 7) .foo[PR]
217217
; DIS64-NEXT: 50: 60 00 00 00 nop
218218
; DIS64-NEXT: 54: 48 00 00 6d bl 0xc0 <.static_overalign_foo>
@@ -221,7 +221,7 @@ entry:
221221
; DIS64-NEXT: 5c: 4b ff ff a5 bl 0x0 <.alias_foo>
222222
; DIS64-NEXT: 000000000000005c: R_RBR (idx: 9) .alias_foo
223223
; DIS64-NEXT: 60: 60 00 00 00 nop
224-
; DIS64-NEXT: 64: 4b ff ff 9d bl 0x0 <.alias_foo>
224+
; DIS64-NEXT: 64: 4b ff ff 9d bl 0x0 <.extern_foo>
225225
; DIS64-NEXT: 0000000000000064: R_RBR (idx: 1) .extern_foo[PR]
226226
; DIS64-NEXT: 68: 60 00 00 00 nop
227227
; DIS64-NEXT: 6c: 4b ff ff b5 bl 0x20 <.hidden_foo>

llvm/test/CodeGen/PowerPC/aix-xcoff-reloc.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ declare i32 @bar(i32)
456456
; SYM-NEXT: ]
457457

458458

459-
; DIS: {{.*}}aix-xcoff-reloc.ll.tmp.o: file format aixcoff-rs6000
459+
; DIS: : file format aixcoff-rs6000
460460
; DIS: Disassembly of section .text:
461461
; DIS: 00000000 <.foo>:
462462
; DIS-NEXT: 0: 7c 08 02 a6 mflr 0
@@ -495,7 +495,7 @@ declare i32 @bar(i32)
495495
; DIS: 00000084 <globalB>:
496496
; DIS-NEXT: 84: 00 00 00 44 <unknown>
497497

498-
; DIS_REL: {{.*}}aix-xcoff-reloc.ll.tmp.o: file format aixcoff-rs6000
498+
; DIS_REL: : file format aixcoff-rs6000
499499
; DIS_REL: RELOCATION RECORDS FOR [.text]:
500500
; DIS_REL-NEXT: OFFSET TYPE VALUE
501501
; DIS_REL-NEXT: 00000010 R_RBR .bar
@@ -515,7 +515,7 @@ declare i32 @bar(i32)
515515
; DIS64-NEXT: 4: f8 21 ff 91 stdu 1, -112(1)
516516
; DIS64-NEXT: 8: 38 60 00 01 li 3, 1
517517
; DIS64-NEXT: c: f8 01 00 80 std 0, 128(1)
518-
; DIS64-NEXT: 10: 4b ff ff f1 bl 0x0 <.foo>
518+
; DIS64-NEXT: 10: 4b ff ff f1 bl 0x0 <.bar>
519519
; DIS64-NEXT: 14: 60 00 00 00 nop
520520
; DIS64-NEXT: 18: e8 82 00 00 ld 4, 0(2)
521521
; DIS64-NEXT: 1c: e8 a2 00 08 ld 5, 8(2)

llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbolize-operands.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
; CHECK-NEXT: 68: cmplwi 3, 11
2222
; CHECK-NEXT: 6c: bt 0, 0x60 <L2>
2323
; CHECK-NEXT: 70: mr 31, 3
24-
; CHECK-NEXT: 74: bl 0x0 <.internal>
24+
; CHECK-NEXT: 74: bl 0x0 <.extern>
2525
; CHECK-NEXT: 78: nop
2626
; CHECK-NEXT: 7c: mr 3, 31
2727
; CHECK-NEXT: 80: b 0x60 <L2>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; RUN: llc -mtriple=powerpc-ibm-aix-xcoff %s -filetype=obj -o %t
2+
; RUN: llvm-objdump %t -r -d --symbolize-operands --no-show-raw-insn \
3+
; RUN: | FileCheck %s
4+
5+
; CHECK-LABEL: <.a>:
6+
;; No <L0> should appear
7+
; CHECK-NEXT: 0: mflr 0
8+
; CHECK-NEXT: 4: stwu 1, -64(1)
9+
; CHECK-NEXT: 8: lwz 3, 0(2)
10+
; CHECK-NEXT:0000000a: R_TOC var
11+
; CHECK-NEXT: c: stw 0, 72(1)
12+
; CHECK-NEXT: 10: lwz 3, 0(3)
13+
; CHECK-NEXT: 14: bl 0x4c <.b>
14+
; CHECK-NEXT: 18: nop
15+
; CHECK-NEXT: 1c: li 3, 1
16+
; CHECK-NEXT: 20: bl 0x0 <.c>
17+
; CHECK-NEXT:00000020: R_RBR .c
18+
19+
; CHECK-LABEL: <.b>:
20+
; CHECK-NEXT: 4c: mflr 0
21+
; CHECK-NEXT: 50: stwu 1, -64(1)
22+
; CHECK-NEXT: 54: cmplwi 3, 1
23+
; CHECK-NEXT: 58: stw 0, 72(1)
24+
; CHECK-NEXT: 5c: stw 3, 60(1)
25+
; CHECK-NEXT: 60: bf 2, 0x6c <L0>
26+
; CHECK-NEXT: 64: bl 0x0 <.a>
27+
; CHECK-NEXT: 68: nop
28+
; CHECK-NEXT:<L0>:
29+
; CHECK-NEXT: 6c: li 3, 2
30+
; CHECK-NEXT: 70: bl 0x0 <.c>
31+
; CHECK-NEXT:00000070: R_RBR .c
32+
33+
target triple = "powerpc-ibm-aix7.2.0.0"
34+
35+
@var = external global i32, align 4
36+
37+
; Function Attrs: noinline nounwind optnone
38+
define i32 @a() {
39+
entry:
40+
%0 = load i32, ptr @var, align 4
41+
%call = call i32 @b(i32 noundef %0)
42+
%call1 = call i32 @c(i32 noundef 1)
43+
ret i32 %call1
44+
}
45+
46+
; Function Attrs: noinline nounwind optnone
47+
define i32 @b(i32 noundef %x) {
48+
entry:
49+
%x.addr = alloca i32, align 4
50+
store i32 %x, ptr %x.addr, align 4
51+
%0 = load i32, ptr %x.addr, align 4
52+
%cmp = icmp eq i32 %0, 1
53+
br i1 %cmp, label %if.then, label %if.end
54+
55+
if.then: ; preds = %entry
56+
%call = call i32 @a()
57+
br label %if.end
58+
59+
if.end: ; preds = %if.then, %entry
60+
%call1 = call i32 @c(i32 noundef 2)
61+
ret i32 %call1
62+
}
63+
64+
declare i32 @c(i32 noundef)
65+

llvm/tools/llvm-objdump/XCOFFDump.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ objdump::createXCOFFDumper(const object::XCOFFObjectFile &Obj) {
4343

4444
Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile &Obj,
4545
const RelocationRef &Rel,
46+
bool SymbolDescription,
4647
SmallVectorImpl<char> &Result) {
4748
symbol_iterator SymI = Rel.getSymbol();
4849
if (SymI == Obj.symbol_end())

llvm/tools/llvm-objdump/XCOFFDump.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ std::string getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo,
3333

3434
Error getXCOFFRelocationValueString(const object::XCOFFObjectFile &Obj,
3535
const object::RelocationRef &RelRef,
36+
bool SymbolDescription,
3637
llvm::SmallVectorImpl<char> &Result);
3738

3839
void dumpTracebackTable(ArrayRef<uint8_t> Bytes, uint64_t Address,

0 commit comments

Comments
 (0)