1*11791ae7SSayhaan Siddiqui## Check that jump table detection does not fail on a false 2*11791ae7SSayhaan Siddiqui## reference to a jump table. 3e7169be9SMaksim Panchenko 4e7169be9SMaksim Panchenko# REQUIRES: system-linux 5e7169be9SMaksim Panchenko 6e7169be9SMaksim Panchenko# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \ 7e7169be9SMaksim Panchenko# RUN: %s -o %t.o 8d4fdc981SAmir Ayupov# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q 9e7169be9SMaksim Panchenko 10d648aa1bSMaksim Panchenko# RUN: llvm-bolt %t.exe --print-cfg \ 11d648aa1bSMaksim Panchenko# RUN: --print-only=inc_dup -o %t.out | FileCheck %s 12e7169be9SMaksim Panchenko 13e7169be9SMaksim Panchenko .file "jump_table.c" 14e7169be9SMaksim Panchenko .section .rodata 15e7169be9SMaksim Panchenko.LC0: 16e7169be9SMaksim Panchenko .string "0" 17e7169be9SMaksim Panchenko.LC1: 18e7169be9SMaksim Panchenko .string "1" 19e7169be9SMaksim Panchenko.LC2: 20e7169be9SMaksim Panchenko .string "2" 21e7169be9SMaksim Panchenko.LC3: 22e7169be9SMaksim Panchenko .string "3" 23e7169be9SMaksim Panchenko.LC4: 24e7169be9SMaksim Panchenko .string "4" 25e7169be9SMaksim Panchenko.LC5: 26e7169be9SMaksim Panchenko .string "5" 27e7169be9SMaksim Panchenko .text 28e7169be9SMaksim Panchenko .globl inc_dup 29e7169be9SMaksim Panchenko .type inc_dup, @function 30e7169be9SMaksim Panchenkoinc_dup: 31e7169be9SMaksim Panchenko.LFB0: 32e7169be9SMaksim Panchenko .cfi_startproc 33e7169be9SMaksim Panchenko pushq %rbp 34e7169be9SMaksim Panchenko .cfi_def_cfa_offset 16 35e7169be9SMaksim Panchenko .cfi_offset 6, -16 36e7169be9SMaksim Panchenko movq %rsp, %rbp 37e7169be9SMaksim Panchenko .cfi_def_cfa_register 6 38e7169be9SMaksim Panchenko subq $16, %rsp 39e7169be9SMaksim Panchenko movl %edi, -4(%rbp) 40e7169be9SMaksim Panchenko movl -4(%rbp), %eax 41e7169be9SMaksim Panchenko subl $10, %eax 42e7169be9SMaksim Panchenko cmpl $5, %eax 43e7169be9SMaksim Panchenko ja .L2 44e7169be9SMaksim Panchenko# Control flow confusing for JT detection 45e7169be9SMaksim Panchenko# CHECK: leaq "JUMP_TABLE{{.*}}"(%rip), %rdx 46e7169be9SMaksim Panchenko leaq .L4(%rip), %rdx 47e7169be9SMaksim Panchenko jmp .LJT 48f0f5d19aSMaksim Panchenko# CHECK: leaq {{.*}}(%rip), %rdx 49e7169be9SMaksim Panchenko leaq .LC0(%rip), %rdx 50e7169be9SMaksim Panchenko jmp .L10 51e7169be9SMaksim Panchenko.LJT: 52e7169be9SMaksim Panchenko movslq (%rdx,%rax,4), %rax 53e7169be9SMaksim Panchenko addq %rdx, %rax 54e7169be9SMaksim Panchenko# CHECK: jmpq *%rax # UNKNOWN CONTROL FLOW 55e7169be9SMaksim Panchenko jmp *%rax 56e7169be9SMaksim Panchenko .section .rodata 57e7169be9SMaksim Panchenko .align 4 58e7169be9SMaksim Panchenko .align 4 59e7169be9SMaksim Panchenko.L4: 60e7169be9SMaksim Panchenko .long .L3-.L4 61e7169be9SMaksim Panchenko .long .L5-.L4 62e7169be9SMaksim Panchenko .long .L6-.L4 63e7169be9SMaksim Panchenko .long .L7-.L4 64e7169be9SMaksim Panchenko .long .L8-.L4 65e7169be9SMaksim Panchenko .long .L9-.L4 66e7169be9SMaksim Panchenko .text 67e7169be9SMaksim Panchenko.L3: 68e7169be9SMaksim Panchenko leaq .LC0(%rip), %rdi 69e7169be9SMaksim Panchenko call puts@PLT 70e7169be9SMaksim Panchenko movl $1, %eax 71e7169be9SMaksim Panchenko jmp .L10 72e7169be9SMaksim Panchenko.L5: 73e7169be9SMaksim Panchenko leaq .LC1(%rip), %rdi 74e7169be9SMaksim Panchenko call puts@PLT 75e7169be9SMaksim Panchenko movl $2, %eax 76e7169be9SMaksim Panchenko jmp .L10 77e7169be9SMaksim Panchenko.L6: 78e7169be9SMaksim Panchenko leaq .LC2(%rip), %rdi 79e7169be9SMaksim Panchenko call puts@PLT 80e7169be9SMaksim Panchenko movl $3, %eax 81e7169be9SMaksim Panchenko jmp .L10 82e7169be9SMaksim Panchenko.L7: 83e7169be9SMaksim Panchenko leaq .LC3(%rip), %rdi 84e7169be9SMaksim Panchenko call puts@PLT 85e7169be9SMaksim Panchenko movl $4, %eax 86e7169be9SMaksim Panchenko jmp .L10 87e7169be9SMaksim Panchenko.L8: 88e7169be9SMaksim Panchenko leaq .LC4(%rip), %rdi 89e7169be9SMaksim Panchenko call puts@PLT 90e7169be9SMaksim Panchenko movl $5, %eax 91e7169be9SMaksim Panchenko jmp .L10 92e7169be9SMaksim Panchenko.L9: 93e7169be9SMaksim Panchenko leaq .LC5(%rip), %rdi 94e7169be9SMaksim Panchenko call puts@PLT 95e7169be9SMaksim Panchenko movl $6, %eax 96e7169be9SMaksim Panchenko jmp .L10 97e7169be9SMaksim Panchenko.L2: 98e7169be9SMaksim Panchenko movl -4(%rbp), %eax 99e7169be9SMaksim Panchenko addl $1, %eax 100e7169be9SMaksim Panchenko.L10: 101e7169be9SMaksim Panchenko leave 102e7169be9SMaksim Panchenko .cfi_def_cfa 7, 8 103e7169be9SMaksim Panchenko ret 104e7169be9SMaksim Panchenko .cfi_endproc 105e7169be9SMaksim Panchenko.LFE0: 106e7169be9SMaksim Panchenko .size inc_dup, .-inc_dup 107e7169be9SMaksim Panchenko .text 108e7169be9SMaksim Panchenko .globl main 109e7169be9SMaksim Panchenko .type main, @function 110e7169be9SMaksim Panchenkomain: 111e7169be9SMaksim Panchenko.LFB1: 112e7169be9SMaksim Panchenko .cfi_startproc 113e7169be9SMaksim Panchenko pushq %rbp 114e7169be9SMaksim Panchenko .cfi_def_cfa_offset 16 115e7169be9SMaksim Panchenko .cfi_offset 6, -16 116e7169be9SMaksim Panchenko movq %rsp, %rbp 117e7169be9SMaksim Panchenko .cfi_def_cfa_register 6 118e7169be9SMaksim Panchenko subq $16, %rsp 119e7169be9SMaksim Panchenko movl %edi, -4(%rbp) 120e7169be9SMaksim Panchenko movq %rsi, -16(%rbp) 121e7169be9SMaksim Panchenko movl -4(%rbp), %eax 122e7169be9SMaksim Panchenko addl $9, %eax 123e7169be9SMaksim Panchenko movl %eax, %edi 124e7169be9SMaksim Panchenko call inc_dup@PLT 125e7169be9SMaksim Panchenko leave 126e7169be9SMaksim Panchenko .cfi_def_cfa 7, 8 127e7169be9SMaksim Panchenko ret 128e7169be9SMaksim Panchenko .cfi_endproc 129e7169be9SMaksim Panchenko.LFE1: 130e7169be9SMaksim Panchenko .size main, .-main 131e7169be9SMaksim Panchenko .ident "GCC: (GNU) 6.3.0" 132e7169be9SMaksim Panchenko .section .note.GNU-stack,"",@progbits 133