xref: /llvm-project/bolt/test/X86/split-func-jump-table-fragment-reverse.s (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
1*11791ae7SSayhaan Siddiqui## This reproduces a bug with jump table identification where jump table has
2*11791ae7SSayhaan Siddiqui## entries pointing to code in function and its cold fragment.
3*11791ae7SSayhaan Siddiqui## The fragment is only reachable through jump table.
48331f75eSAmir Ayupov
58331f75eSAmir Ayupov# REQUIRES: system-linux
68331f75eSAmir Ayupov
78331f75eSAmir Ayupov# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
88331f75eSAmir Ayupov# RUN: llvm-strip --strip-unneeded %t.o
98331f75eSAmir Ayupov# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q
10d648aa1bSMaksim Panchenko# RUN: llvm-bolt %t.exe -o %t.out --lite=0 -v=1 2>&1 | FileCheck %s
118331f75eSAmir Ayupov
128331f75eSAmir Ayupov# CHECK-NOT: unclaimed PC-relative relocations left in data
138331f75eSAmir Ayupov# CHECK: BOLT-INFO: marking main.cold as a fragment of main
148331f75eSAmir Ayupov  .text
15f0f5d19aSMaksim Panchenko  .globl _start
16f0f5d19aSMaksim Panchenko  .type _start, %function
17f0f5d19aSMaksim Panchenko_start:
18f0f5d19aSMaksim Panchenko  callq main.cold
19f0f5d19aSMaksim Panchenko  call exit
20f0f5d19aSMaksim Panchenko.size _start, .-_start
21f0f5d19aSMaksim Panchenko
228331f75eSAmir Ayupov  .globl main.cold
238331f75eSAmir Ayupov  .type main.cold, %function
248331f75eSAmir Ayupov  .p2align 2
258331f75eSAmir Ayupovmain.cold:
268331f75eSAmir AyupovLBB0:
278331f75eSAmir Ayupov  andl $0xf, %ecx
288331f75eSAmir Ayupov  cmpb $0x4, %cl
29*11791ae7SSayhaan Siddiqui  ## exit through ret
308331f75eSAmir Ayupov  ja LBB3
318331f75eSAmir Ayupov
32*11791ae7SSayhaan Siddiqui## jump table dispatch, jumping to label indexed by val in %ecx
338331f75eSAmir AyupovLBB1:
348331f75eSAmir Ayupov  leaq JUMP_TABLE(%rip), %r8
358331f75eSAmir Ayupov  movzbl %cl, %ecx
368331f75eSAmir Ayupov  movslq (%r8,%rcx,4), %rax
378331f75eSAmir Ayupov  addq %rax, %r8
388331f75eSAmir Ayupov  jmpq *%r8
398331f75eSAmir Ayupov
408331f75eSAmir AyupovLBB2:
418331f75eSAmir Ayupov  xorq %rax, %rax
428331f75eSAmir AyupovLBB3:
438331f75eSAmir Ayupov  addq $0x8, %rsp
448331f75eSAmir Ayupov  ret
458331f75eSAmir Ayupov.size main.cold, .-main.cold
468331f75eSAmir Ayupov
47*11791ae7SSayhaan Siddiqui## main function, referenced from jump table in cold fragment
488331f75eSAmir Ayupov  .globl main
498331f75eSAmir Ayupov  .type main, %function
508331f75eSAmir Ayupov  .p2align 2
518331f75eSAmir Ayupovmain:
52*11791ae7SSayhaan Siddiqui  ## load bearing nop: pad LBB4 so that it can't be treated
53*11791ae7SSayhaan Siddiqui  ## as __builtin_unreachable by analyzeJumpTable
548331f75eSAmir Ayupov  nop
558331f75eSAmir AyupovLBB4:
568331f75eSAmir Ayupov  callq abort
578331f75eSAmir Ayupov.size main, .-main
588331f75eSAmir Ayupov
598331f75eSAmir Ayupov  .rodata
60*11791ae7SSayhaan Siddiqui## jmp table, entries must be R_X86_64_PC32 relocs
618331f75eSAmir Ayupov  .globl JUMP_TABLE
628331f75eSAmir AyupovJUMP_TABLE:
638331f75eSAmir Ayupov  .long LBB2-JUMP_TABLE
648331f75eSAmir Ayupov  .long LBB3-JUMP_TABLE
658331f75eSAmir Ayupov  .long LBB4-JUMP_TABLE
668331f75eSAmir Ayupov  .long LBB3-JUMP_TABLE
67