## Check a common case for BOLT address translation tables. These tables are used ## to translate profile activity happening in a bolted binary back to the ## original binary, so you can run BOLT again, with updated profile collected ## in a production environment that only runs bolted binaries. As BOLT only ## takes no-bolt binaries as inputs, this translation is necessary to cover ## this scenario. # # RUN: yaml2obj %p/Inputs/blarge.yaml &> %t.exe # RUN: llvm-bolt %t.exe -o %t.out --data %p/Inputs/blarge.fdata \ # RUN: --reorder-blocks=normal --split-functions --enable-bat 2>&1 | FileCheck %s # RUN: llvm-bat-dump %t.out --dump-all \ # RUN: --translate=0x401180 | FileCheck %s --check-prefix=CHECK-BAT-DUMP # ## In this test we focus on function usqrt at address 0x401170. This is a ## non-reloc binary case, so we don't expect this address to change, that's ## why we hardcode its address here. This address also comes hardcoded in the ## blarge.yaml input file. ## ## This is the layout of the function before BOLT reorder blocks: ## ## BB Layout : .LBB02, .Ltmp39, .LFT1, .Ltmp38, .LFT2 ## ## This is the layout of the function after BOLT reorder blocks: ## ## BB Layout : .LBB02, .Ltmp38, .Ltmp39, .LFT2, .LFT3 ## ## .Ltmp38 is originally at offset 0x39 but gets moved to 0xc (see full dump ## below). ## ## We check that BAT is able to translate references happening in .Ltmp38 to ## its original offset. ## ## This binary has 3 functions with profile, all of them are split, so 6 maps. ## BAT creates one map per function fragment. # # CHECK: BOLT: 3 out of 7 functions were overwritten. # CHECK: BOLT-INFO: Wrote 6 BAT maps # CHECK: BOLT-INFO: Wrote 3 function and 58 basic block hashes # CHECK: BOLT-INFO: BAT section size (bytes): 940 # # usqrt mappings (hot part). We match against any key (left side containing # the bolted binary offsets) because BOLT may change where it puts instructions # depending on whether it is relaxing a branch or not. But the original input # binary offsets (right side) should be the same because these addresses are # hardcoded in the blarge.yaml file. # # CHECK-BAT-DUMP: Function Address: 0x401170, hash: 0xace6cbc638b31983 # CHECK-BAT-DUMP-NEXT: BB mappings: # CHECK-BAT-DUMP-NEXT: 0x0 -> 0x0 hash: 0x36007ba1d80c0000 # CHECK-BAT-DUMP-NEXT: 0x8 -> 0x8 (branch) # CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x39 hash: 0x5c06705524800039 # CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x3d (branch) # CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x10 hash: 0xd70d7a64320e0010 # CHECK-BAT-DUMP-NEXT: 0x{{.*}} -> 0x30 (branch) # # CHECK-BAT-DUMP: 3 cold mappings # # Now check that the translation 0x401180 maps back to its correct # input offset (offset 3d in the usqrt input function). # # COM: CHECK-BAT-DUMP: Translating addresses according to parsed BAT tables: # CHECK-BAT-DUMP: 0x401180 -> usqrt + 0x3d # ------------------------- # Full dump for reference (this is not checked): # ------------------------- Binary Function "usqrt" after finalize-functions Number : 7 State : CFG finalized Address : 0x401170 Size : 0x43 MaxSize : 0x43 Offset : 0xcb0 Section : .text Orc Section : .local.text.usqrt LSDA : 0x0 IsSimple : 1 IsMultiEntry: 0 IsSplit : 1 BB Count : 5 Hash : a6468f132ec176ca BB Layout : .LBB02, .Ltmp38, .Ltmp39, .LFT2, .LFT3 Exec Count : 199 Profile Acc : 100.0% .LBB02 (4 instructions, align : 1) Entry Point Exec Count : 199 CFI State : 0 Input offset: 0 00000000: movl $0x20, %r8d 00000006: xorl %eax, %eax 00000008: xorl %edx, %edx # Offset: 8 0000000a: jmp .Ltmp39 Successors: .Ltmp39 (mispreds: 0, count: 0) .Ltmp38 (2 instructions, align : 1) Exec Count : 4711 CFI State : 0 Input offset: 39 Predecessors: .Ltmp39, .LFT2 0000000c: subl $0x1, %r8d 00000010: je .LFT3 # Offset: 61 Successors: .LFT3 (mispreds: 0, count: 0), .Ltmp39 (mispreds: 33, count: 4711) .Ltmp39 (10 instructions, align : 1) Exec Count : 4711 CFI State : 0 Input offset: 10 Predecessors: .Ltmp38, .LBB02 00000012: movq %rdi, %rcx 00000015: addq %rax, %rax 00000018: shlq $0x2, %rdi 0000001c: andl $0xc0000000, %ecx 00000022: shrq $0x1e, %rcx 00000026: leaq (%rcx,%rdx,4), %rdx 0000002a: leaq 0x1(%rax,%rax), %rcx 0000002f: cmpq %rcx, %rdx 00000032: jb .Ltmp38 # Offset: 48 00000034: jmp .LFT2 Successors: .Ltmp38 (mispreds: 171, count: 2886), .LFT2 (mispreds: 0, count: 0) ------- HOT-COLD SPLIT POINT ------- .LFT2 (3 instructions, align : 1) Exec Count : 0 CFI State : 0 Input offset: 32 Predecessors: .Ltmp39 00000036: subq %rcx, %rdx 00000039: addq $0x1, %rax # Offset: 53 0000003d: jmp .Ltmp38 Successors: .Ltmp38 (mispreds: 0, count: 0) .LFT3 (2 instructions, align : 1) Exec Count : 0 CFI State : 0 Input offset: 3f Predecessors: .Ltmp38 0000003f: movq %rax, (%rsi) 00000042: retq # Offset: 66 DWARF CFI Instructions: End of Function "usqrt"