xref: /llvm-project/bolt/test/X86/bolt-address-translation.test (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
1*11791ae7SSayhaan Siddiqui## Check a common case for BOLT address translation tables. These tables are used
2*11791ae7SSayhaan Siddiqui## to translate profile activity happening in a bolted binary back to the
3*11791ae7SSayhaan Siddiqui## original binary, so you can run BOLT again, with updated profile collected
4*11791ae7SSayhaan Siddiqui## in a production environment that only runs bolted binaries. As BOLT only
5*11791ae7SSayhaan Siddiqui## takes no-bolt binaries as inputs, this translation is necessary to cover
6*11791ae7SSayhaan Siddiqui## this scenario.
7fc0ced73SRafael Auler#
8fc0ced73SRafael Auler# RUN: yaml2obj %p/Inputs/blarge.yaml &> %t.exe
9fc0ced73SRafael Auler# RUN: llvm-bolt %t.exe -o %t.out --data %p/Inputs/blarge.fdata \
10fc0ced73SRafael Auler# RUN:   --reorder-blocks=normal --split-functions --enable-bat 2>&1 | FileCheck %s
11fc0ced73SRafael Auler# RUN: llvm-bat-dump %t.out --dump-all \
12fc0ced73SRafael Auler# RUN:   --translate=0x401180 | FileCheck %s --check-prefix=CHECK-BAT-DUMP
13fc0ced73SRafael Auler#
14*11791ae7SSayhaan Siddiqui## In this test we focus on function usqrt at address 0x401170. This is a
15*11791ae7SSayhaan Siddiqui## non-reloc binary case, so we don't expect this address to change, that's
16*11791ae7SSayhaan Siddiqui## why we hardcode its address here. This address also comes hardcoded in the
17*11791ae7SSayhaan Siddiqui## blarge.yaml input file.
18*11791ae7SSayhaan Siddiqui##
19*11791ae7SSayhaan Siddiqui## This is the layout of the function before BOLT reorder blocks:
20*11791ae7SSayhaan Siddiqui##
21*11791ae7SSayhaan Siddiqui##    BB Layout   : .LBB02, .Ltmp39, .LFT1, .Ltmp38, .LFT2
22*11791ae7SSayhaan Siddiqui##
23*11791ae7SSayhaan Siddiqui## This is the layout of the function after BOLT reorder blocks:
24*11791ae7SSayhaan Siddiqui##
25*11791ae7SSayhaan Siddiqui##    BB Layout   : .LBB02, .Ltmp38, .Ltmp39, .LFT2, .LFT3
26*11791ae7SSayhaan Siddiqui##
27*11791ae7SSayhaan Siddiqui## .Ltmp38 is originally at offset 0x39 but gets moved to 0xc (see full dump
28*11791ae7SSayhaan Siddiqui## below).
29*11791ae7SSayhaan Siddiqui##
30*11791ae7SSayhaan Siddiqui## We check that BAT is able to translate references happening in .Ltmp38 to
31*11791ae7SSayhaan Siddiqui## its original offset.
32*11791ae7SSayhaan Siddiqui##
33fc0ced73SRafael Auler
34*11791ae7SSayhaan Siddiqui## This binary has 3 functions with profile, all of them are split, so 6 maps.
35*11791ae7SSayhaan Siddiqui## BAT creates one map per function fragment.
36fc0ced73SRafael Auler#
37fc0ced73SRafael Auler# CHECK:      BOLT: 3 out of 7 functions were overwritten.
38fc0ced73SRafael Auler# CHECK:      BOLT-INFO: Wrote 6 BAT maps
39ad00e7e5SAmir Ayupov# CHECK:      BOLT-INFO: Wrote 3 function and 58 basic block hashes
40d1d9545eSAmir Ayupov# CHECK:      BOLT-INFO: BAT section size (bytes): 940
41fc0ced73SRafael Auler#
42fc0ced73SRafael Auler# usqrt mappings (hot part). We match against any key (left side containing
43fc0ced73SRafael Auler# the bolted binary offsets) because BOLT may change where it puts instructions
44fc0ced73SRafael Auler# depending on whether it is relaxing a branch or not. But the original input
45fc0ced73SRafael Auler# binary offsets (right side) should be the same because these addresses are
46fc0ced73SRafael Auler# hardcoded in the blarge.yaml file.
47fc0ced73SRafael Auler#
48ad00e7e5SAmir Ayupov# CHECK-BAT-DUMP:      Function Address: 0x401170, hash: 0xace6cbc638b31983
49fc0ced73SRafael Auler# CHECK-BAT-DUMP-NEXT: BB mappings:
50ad00e7e5SAmir Ayupov# CHECK-BAT-DUMP-NEXT: 0x0 -> 0x0 hash: 0x36007ba1d80c0000
51fc0ced73SRafael Auler# CHECK-BAT-DUMP-NEXT: 0x8 -> 0x8 (branch)
52ad00e7e5SAmir Ayupov# CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x39 hash: 0x5c06705524800039
53fc0ced73SRafael Auler# CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x3d (branch)
54ad00e7e5SAmir Ayupov# CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x10 hash: 0xd70d7a64320e0010
55fc0ced73SRafael Auler# CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x30 (branch)
56fc0ced73SRafael Auler#
57fc0ced73SRafael Auler# CHECK-BAT-DUMP: 3 cold mappings
58fc0ced73SRafael Auler#
59fc0ced73SRafael Auler# Now check that the translation 0x401180 maps back to its correct
60fc0ced73SRafael Auler# input offset (offset 3d in the usqrt input function).
61fc0ced73SRafael Auler#
62fc0ced73SRafael Auler# COM: CHECK-BAT-DUMP: Translating addresses according to parsed BAT tables:
63fc0ced73SRafael Auler#      CHECK-BAT-DUMP: 0x401180 -> usqrt + 0x3d
64fc0ced73SRafael Auler
65fc0ced73SRafael Auler# -------------------------
66fc0ced73SRafael Auler# Full dump for reference (this is not checked):
67fc0ced73SRafael Auler# -------------------------
68fc0ced73SRafael Auler
69fc0ced73SRafael AulerBinary Function "usqrt" after finalize-functions
70fc0ced73SRafael Auler  Number      : 7
71fc0ced73SRafael Auler  State       : CFG finalized
72fc0ced73SRafael Auler  Address     : 0x401170
73fc0ced73SRafael Auler  Size        : 0x43
74fc0ced73SRafael Auler  MaxSize     : 0x43
75fc0ced73SRafael Auler  Offset      : 0xcb0
76fc0ced73SRafael Auler  Section     : .text
77fc0ced73SRafael Auler  Orc Section : .local.text.usqrt
78fc0ced73SRafael Auler  LSDA        : 0x0
79fc0ced73SRafael Auler  IsSimple    : 1
80fc0ced73SRafael Auler  IsMultiEntry: 0
81fc0ced73SRafael Auler  IsSplit     : 1
82fc0ced73SRafael Auler  BB Count    : 5
83fc0ced73SRafael Auler  Hash        : a6468f132ec176ca
84fc0ced73SRafael Auler  BB Layout   : .LBB02, .Ltmp38, .Ltmp39, .LFT2, .LFT3
85fc0ced73SRafael Auler  Exec Count  : 199
86fc0ced73SRafael Auler  Profile Acc : 100.0%
87fc0ced73SRafael Auler
88fc0ced73SRafael Auler.LBB02 (4 instructions, align : 1)
89fc0ced73SRafael Auler  Entry Point
90fc0ced73SRafael Auler  Exec Count : 199
91fc0ced73SRafael Auler  CFI State : 0
92fc0ced73SRafael Auler  Input offset: 0
93fc0ced73SRafael Auler    00000000:   movl    $0x20, %r8d
94fc0ced73SRafael Auler    00000006:   xorl    %eax, %eax
95fc0ced73SRafael Auler    00000008:   xorl    %edx, %edx # Offset: 8
96fc0ced73SRafael Auler    0000000a:   jmp     .Ltmp39
97fc0ced73SRafael Auler  Successors: .Ltmp39 (mispreds: 0, count: 0)
98fc0ced73SRafael Auler
99fc0ced73SRafael Auler.Ltmp38 (2 instructions, align : 1)
100fc0ced73SRafael Auler  Exec Count : 4711
101fc0ced73SRafael Auler  CFI State : 0
102fc0ced73SRafael Auler  Input offset: 39
103fc0ced73SRafael Auler  Predecessors: .Ltmp39, .LFT2
104fc0ced73SRafael Auler    0000000c:   subl    $0x1, %r8d
105fc0ced73SRafael Auler    00000010:   je      .LFT3 # Offset: 61
106fc0ced73SRafael Auler  Successors: .LFT3 (mispreds: 0, count: 0), .Ltmp39 (mispreds: 33, count: 4711)
107fc0ced73SRafael Auler
108fc0ced73SRafael Auler.Ltmp39 (10 instructions, align : 1)
109fc0ced73SRafael Auler  Exec Count : 4711
110fc0ced73SRafael Auler  CFI State : 0
111fc0ced73SRafael Auler  Input offset: 10
112fc0ced73SRafael Auler  Predecessors: .Ltmp38, .LBB02
113fc0ced73SRafael Auler    00000012:   movq    %rdi, %rcx
114fc0ced73SRafael Auler    00000015:   addq    %rax, %rax
115fc0ced73SRafael Auler    00000018:   shlq    $0x2, %rdi
116fc0ced73SRafael Auler    0000001c:   andl    $0xc0000000, %ecx
117fc0ced73SRafael Auler    00000022:   shrq    $0x1e, %rcx
118fc0ced73SRafael Auler    00000026:   leaq    (%rcx,%rdx,4), %rdx
119fc0ced73SRafael Auler    0000002a:   leaq    0x1(%rax,%rax), %rcx
120fc0ced73SRafael Auler    0000002f:   cmpq    %rcx, %rdx
121fc0ced73SRafael Auler    00000032:   jb      .Ltmp38 # Offset: 48
122fc0ced73SRafael Auler    00000034:   jmp     .LFT2
123fc0ced73SRafael Auler  Successors: .Ltmp38 (mispreds: 171, count: 2886), .LFT2 (mispreds: 0, count: 0)
124fc0ced73SRafael Auler
125fc0ced73SRafael Auler-------   HOT-COLD SPLIT POINT   -------
126fc0ced73SRafael Auler
127fc0ced73SRafael Auler.LFT2 (3 instructions, align : 1)
128fc0ced73SRafael Auler  Exec Count : 0
129fc0ced73SRafael Auler  CFI State : 0
130fc0ced73SRafael Auler  Input offset: 32
131fc0ced73SRafael Auler  Predecessors: .Ltmp39
132fc0ced73SRafael Auler    00000036:   subq    %rcx, %rdx
133fc0ced73SRafael Auler    00000039:   addq    $0x1, %rax # Offset: 53
134fc0ced73SRafael Auler    0000003d:   jmp     .Ltmp38
135fc0ced73SRafael Auler  Successors: .Ltmp38 (mispreds: 0, count: 0)
136fc0ced73SRafael Auler
137fc0ced73SRafael Auler.LFT3 (2 instructions, align : 1)
138fc0ced73SRafael Auler  Exec Count : 0
139fc0ced73SRafael Auler  CFI State : 0
140fc0ced73SRafael Auler  Input offset: 3f
141fc0ced73SRafael Auler  Predecessors: .Ltmp38
142fc0ced73SRafael Auler    0000003f:   movq    %rax, (%rsi)
143fc0ced73SRafael Auler    00000042:   retq # Offset: 66
144fc0ced73SRafael Auler
145fc0ced73SRafael AulerDWARF CFI Instructions:
146fc0ced73SRafael Auler    <empty>
147fc0ced73SRafael AulerEnd of Function "usqrt"
148