1*11791ae7SSayhaan Siddiqui## This reproduces an issue where two fragments of same function access same 2*11791ae7SSayhaan Siddiqui## jump table, which means at least one fragment visits the other, i.e., one 3*11791ae7SSayhaan Siddiqui## of them has split jump table. As a result, all of them will be marked as 4*11791ae7SSayhaan Siddiqui## non-simple function. 528b1dcb1SHuan Nguyen 628b1dcb1SHuan Nguyen# REQUIRES: system-linux 728b1dcb1SHuan Nguyen 828b1dcb1SHuan Nguyen# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o 928b1dcb1SHuan Nguyen# RUN: llvm-strip --strip-unneeded %t.o 1028b1dcb1SHuan Nguyen# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q 1105523dc3SHuan Nguyen# RUN: llvm-bolt -print-cfg -v=3 %t.exe -o %t.out 2>&1 | FileCheck %s 1228b1dcb1SHuan Nguyen 1305523dc3SHuan Nguyen# CHECK: BOLT-INFO: Multiple fragments access same jump table: main; main.cold.1 1405523dc3SHuan Nguyen# CHECK: PIC Jump table JUMP_TABLE1 for function main, main.cold.1 at {{.*}} with a total count of 0: 1528b1dcb1SHuan Nguyen 1628b1dcb1SHuan Nguyen .text 1728b1dcb1SHuan Nguyen .globl main 1828b1dcb1SHuan Nguyen .type main, %function 1928b1dcb1SHuan Nguyen .p2align 2 2028b1dcb1SHuan Nguyenmain: 2128b1dcb1SHuan NguyenLBB0: 2228b1dcb1SHuan Nguyen andl $0xf, %ecx 2328b1dcb1SHuan Nguyen cmpb $0x4, %cl 24*11791ae7SSayhaan Siddiqui ## exit through ret 2528b1dcb1SHuan Nguyen ja LBB3 2628b1dcb1SHuan Nguyen 27*11791ae7SSayhaan Siddiqui## jump table dispatch, jumping to label indexed by val in %ecx 2828b1dcb1SHuan NguyenLBB1: 2928b1dcb1SHuan Nguyen leaq JUMP_TABLE1(%rip), %r8 3028b1dcb1SHuan Nguyen movzbl %cl, %ecx 3128b1dcb1SHuan Nguyen movslq (%r8,%rcx,4), %rax 3228b1dcb1SHuan Nguyen addq %rax, %r8 3328b1dcb1SHuan Nguyen jmpq *%r8 3428b1dcb1SHuan Nguyen 3528b1dcb1SHuan NguyenLBB2: 3628b1dcb1SHuan Nguyen xorq %rax, %rax 3728b1dcb1SHuan NguyenLBB3: 3828b1dcb1SHuan Nguyen addq $0x8, %rsp 3928b1dcb1SHuan Nguyen ret 4028b1dcb1SHuan Nguyen.size main, .-main 4128b1dcb1SHuan Nguyen 42*11791ae7SSayhaan Siddiqui## cold fragment is only reachable 4328b1dcb1SHuan Nguyen .globl main.cold.1 4428b1dcb1SHuan Nguyen .type main.cold.1, %function 4528b1dcb1SHuan Nguyen .p2align 2 4628b1dcb1SHuan Nguyenmain.cold.1: 47*11791ae7SSayhaan Siddiqui ## load bearing nop: pad LBB8 so that it can't be treated 48*11791ae7SSayhaan Siddiqui ## as __builtin_unreachable by analyzeJumpTable 4928b1dcb1SHuan Nguyen nop 5028b1dcb1SHuan NguyenLBB4: 5128b1dcb1SHuan Nguyen andl $0xb, %ebx 5228b1dcb1SHuan Nguyen cmpb $0x1, %cl 5328b1dcb1SHuan Nguyen # exit through ret 5428b1dcb1SHuan Nguyen ja LBB7 5528b1dcb1SHuan Nguyen 56*11791ae7SSayhaan Siddiqui## jump table dispatch, jumping to label indexed by val in %ecx 5728b1dcb1SHuan NguyenLBB5: 5828b1dcb1SHuan Nguyen leaq JUMP_TABLE1(%rip), %r8 5928b1dcb1SHuan Nguyen movzbl %cl, %ecx 6028b1dcb1SHuan Nguyen movslq (%r8,%rcx,4), %rax 6128b1dcb1SHuan Nguyen addq %rax, %r8 6228b1dcb1SHuan Nguyen jmpq *%r8 6328b1dcb1SHuan Nguyen 6428b1dcb1SHuan NguyenLBB6: 6528b1dcb1SHuan Nguyen xorq %rax, %rax 6628b1dcb1SHuan NguyenLBB7: 6728b1dcb1SHuan Nguyen addq $0x8, %rsp 6828b1dcb1SHuan Nguyen ret 6928b1dcb1SHuan NguyenLBB8: 7028b1dcb1SHuan Nguyen callq abort 7128b1dcb1SHuan Nguyen.size main.cold.1, .-main.cold.1 7228b1dcb1SHuan Nguyen 7328b1dcb1SHuan Nguyen .rodata 74*11791ae7SSayhaan Siddiqui## jmp table, entries must be R_X86_64_PC32 relocs 7528b1dcb1SHuan Nguyen .globl JUMP_TABLE1 7628b1dcb1SHuan NguyenJUMP_TABLE1: 7728b1dcb1SHuan Nguyen .long LBB2-JUMP_TABLE1 7828b1dcb1SHuan Nguyen .long LBB3-JUMP_TABLE1 7928b1dcb1SHuan Nguyen .long LBB8-JUMP_TABLE1 8028b1dcb1SHuan Nguyen .long LBB6-JUMP_TABLE1 8128b1dcb1SHuan Nguyen .long LBB7-JUMP_TABLE1 82