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