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