xref: /llvm-project/bolt/test/X86/false-jump-table.s (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
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