• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc <%s -jump-table-type=single | FileCheck --check-prefix=SINGLE %s
2; RUN: llc <%s -jump-table-type=arity | FileCheck --check-prefix=ARITY %s
3; RUN: llc <%s -jump-table-type=simplified | FileCheck --check-prefix=SIMPL %s
4; RUN: llc <%s -jump-table-type=full | FileCheck --check-prefix=FULL %s
5
6target triple = "x86_64-unknown-linux-gnu"
7
8%struct.fun_struct = type { i32 (...)* }
9
10define void @indirect_fun() unnamed_addr jumptable {
11  ret void
12}
13
14define void @indirect_fun_match() unnamed_addr jumptable {
15  ret void
16}
17
18define i32 @indirect_fun_i32() unnamed_addr jumptable {
19  ret i32 0
20}
21
22define i32 @indirect_fun_i32_1(i32 %a) unnamed_addr jumptable {
23  ret i32 %a
24}
25
26define i32 @indirect_fun_i32_2(i32 %a, i32 %b) unnamed_addr jumptable {
27  ret i32 %a
28}
29
30define i32* @indirect_fun_i32S_2(i32* %a, i32 %b) unnamed_addr jumptable {
31  ret i32* %a
32}
33
34define void @indirect_fun_struct(%struct.fun_struct %fs) unnamed_addr jumptable {
35  ret void
36}
37
38define void @indirect_fun_fun(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
39  ret void
40}
41
42define i32 @indirect_fun_fun_ret(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
43  ret i32 %a
44}
45
46define void @indirect_fun_array([19 x i8] %a) unnamed_addr jumptable {
47  ret void
48}
49
50define void @indirect_fun_vec(<3 x i32> %a) unnamed_addr jumptable {
51  ret void
52}
53
54define void @indirect_fun_vec_2(<4 x float> %a) unnamed_addr jumptable {
55  ret void
56}
57
58define i32 @m(void ()* %fun) {
59  call void ()* %fun()
60  ret i32 0
61}
62
63define void ()* @get_fun() {
64  ret void ()* @indirect_fun
65; SINGLE: movl    $__llvm_jump_instr_table_0_
66; ARITY: movl    $__llvm_jump_instr_table_
67; SIMPL: movl    $__llvm_jump_instr_table_
68; FULL: movl    $__llvm_jump_instr_table_
69}
70
71define i32 @main(i32 %argc, i8** %argv) {
72  %f = call void ()* ()* @get_fun()
73  %a = call i32 @m(void ()* %f)
74  ret i32 %a
75}
76
77; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_1
78; SINGLE-DAG:         .align  8, 0x90
79; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_1,@function
80; SINGLE-DAG: __llvm_jump_instr_table_0_1:
81; SINGLE-DAG:         jmp     indirect_fun_array@PLT
82; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_2
83; SINGLE-DAG:         .align  8, 0x90
84; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_2,@function
85; SINGLE-DAG: __llvm_jump_instr_table_0_2:
86; SINGLE-DAG:         jmp     indirect_fun_i32_2@PLT
87; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_3
88; SINGLE-DAG:         .align  8, 0x90
89; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_3,@function
90; SINGLE-DAG: __llvm_jump_instr_table_0_3:
91; SINGLE-DAG:         jmp     indirect_fun_vec_2@PLT
92; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_4
93; SINGLE-DAG:         .align  8, 0x90
94; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_4,@function
95; SINGLE-DAG: __llvm_jump_instr_table_0_4:
96; SINGLE-DAG:         jmp     indirect_fun_i32S_2@PLT
97; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_5
98; SINGLE-DAG:         .align  8, 0x90
99; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_5,@function
100; SINGLE-DAG: __llvm_jump_instr_table_0_5:
101; SINGLE-DAG:         jmp     indirect_fun_struct@PLT
102; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_6
103; SINGLE-DAG:         .align  8, 0x90
104; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_6,@function
105; SINGLE-DAG: __llvm_jump_instr_table_0_6:
106; SINGLE-DAG:         jmp     indirect_fun_i32_1@PLT
107; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_7
108; SINGLE-DAG:         .align  8, 0x90
109; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_7,@function
110; SINGLE-DAG: __llvm_jump_instr_table_0_7:
111; SINGLE-DAG:         jmp     indirect_fun_i32@PLT
112; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_8
113; SINGLE-DAG:         .align  8, 0x90
114; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_8,@function
115; SINGLE-DAG: __llvm_jump_instr_table_0_8:
116; SINGLE-DAG:         jmp     indirect_fun_fun@PLT
117; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_9
118; SINGLE-DAG:         .align  8, 0x90
119; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_9,@function
120; SINGLE-DAG: __llvm_jump_instr_table_0_9:
121; SINGLE-DAG:         jmp     indirect_fun_fun_ret@PLT
122; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_10
123; SINGLE-DAG:         .align  8, 0x90
124; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_10,@function
125; SINGLE-DAG: __llvm_jump_instr_table_0_10:
126; SINGLE-DAG:         jmp     indirect_fun@PLT
127; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_11
128; SINGLE-DAG:         .align  8, 0x90
129; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_11,@function
130; SINGLE-DAG: __llvm_jump_instr_table_0_11:
131; SINGLE-DAG:         jmp     indirect_fun_match@PLT
132; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_12
133; SINGLE-DAG:         .align  8, 0x90
134; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_12,@function
135; SINGLE-DAG: __llvm_jump_instr_table_0_12:
136; SINGLE-DAG:         jmp     indirect_fun_vec@PLT
137; SINGLE-DAG:         .align  8, 0x90
138; SINGLE-DAG:         ud2
139; SINGLE-DAG:         .align  8, 0x90
140; SINGLE-DAG:         ud2
141; SINGLE-DAG:         .align  8, 0x90
142; SINGLE-DAG:         ud2
143; SINGLE-DAG:         .align  8, 0x90
144; SINGLE-DAG:         ud2
145
146
147; ARITY-DAG:         .globl  __llvm_jump_instr_table_2_1
148; ARITY-DAG:         .align  8, 0x90
149; ARITY-DAG:         .type   __llvm_jump_instr_table_2_1,@function
150; ARITY-DAG: __llvm_jump_instr_table_2_1:
151; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
152; ARITY-DAG:         .align  8, 0x90
153; ARITY-DAG:         ud2
154; ARITY-DAG:         .globl  __llvm_jump_instr_table_0_1
155; ARITY-DAG:         .align  8, 0x90
156; ARITY-DAG:         .type   __llvm_jump_instr_table_0_1,@function
157; ARITY-DAG: __llvm_jump_instr_table_0_1:
158; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
159; ARITY-DAG:         .globl  __llvm_jump_instr_table_1_1
160; ARITY-DAG:         .align  8, 0x90
161; ARITY-DAG:         .type   __llvm_jump_instr_table_1_1,@function
162; ARITY-DAG: __llvm_jump_instr_table_1_1:
163; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
164
165; SIMPL-DAG:         .globl  __llvm_jump_instr_table_2_1
166; SIMPL-DAG:         .align  8, 0x90
167; SIMPL-DAG:         .type   __llvm_jump_instr_table_2_1,@function
168; SIMPL-DAG: __llvm_jump_instr_table_2_1:
169; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
170; SIMPL-DAG:         .align  8, 0x90
171; SIMPL-DAG:         ud2
172; SIMPL-DAG:         .globl  __llvm_jump_instr_table_0_1
173; SIMPL-DAG:         .align  8, 0x90
174; SIMPL-DAG:         .type   __llvm_jump_instr_table_0_1,@function
175; SIMPL-DAG: __llvm_jump_instr_table_0_1:
176; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
177; SIMPL-DAG:         .globl  __llvm_jump_instr_table_1_1
178; SIMPL-DAG:         .align  8, 0x90
179; SIMPL-DAG:         .type   __llvm_jump_instr_table_1_1,@function
180; SIMPL-DAG: __llvm_jump_instr_table_1_1:
181; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
182; SIMPL-DAG:         .globl  __llvm_jump_instr_table_3_1
183; SIMPL-DAG:         .align  8, 0x90
184; SIMPL-DAG:         .type   __llvm_jump_instr_table_3_1,@function
185; SIMPL-DAG: __llvm_jump_instr_table_3_1:
186; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
187; SIMPL-DAG:         .globl  __llvm_jump_instr_table_4_1
188; SIMPL-DAG:         .align  8, 0x90
189; SIMPL-DAG:         .type   __llvm_jump_instr_table_4_1,@function
190; SIMPL-DAG: __llvm_jump_instr_table_4_1:
191; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
192
193
194; FULL-DAG:        .globl  __llvm_jump_instr_table_10_1
195; FULL-DAG:        .align  8, 0x90
196; FULL-DAG:        .type   __llvm_jump_instr_table_10_1,@function
197; FULL-DAG:__llvm_jump_instr_table_10_1:
198; FULL-DAG:        jmp     indirect_fun_i32_1@PLT
199; FULL-DAG:        .align  8, 0x90
200; FULL-DAG:        ud2
201; FULL-DAG:        .globl  __llvm_jump_instr_table_9_1
202; FULL-DAG:        .align  8, 0x90
203; FULL-DAG:        .type   __llvm_jump_instr_table_9_1,@function
204; FULL-DAG:__llvm_jump_instr_table_9_1:
205; FULL-DAG:        jmp     indirect_fun_i32_2@PLT
206; FULL-DAG:        .align  8, 0x90
207; FULL-DAG:        ud2
208; FULL-DAG:        .globl  __llvm_jump_instr_table_7_1
209; FULL-DAG:        .align  8, 0x90
210; FULL-DAG:        .type   __llvm_jump_instr_table_7_1,@function
211; FULL-DAG:__llvm_jump_instr_table_7_1:
212; FULL-DAG:        jmp     indirect_fun_i32S_2@PLT
213; FULL-DAG:        .align  8, 0x90
214; FULL-DAG:        ud2
215; FULL-DAG:        .globl  __llvm_jump_instr_table_3_1
216; FULL-DAG:        .align  8, 0x90
217; FULL-DAG:        .type   __llvm_jump_instr_table_3_1,@function
218; FULL-DAG:__llvm_jump_instr_table_3_1:
219; FULL-DAG:        jmp     indirect_fun_vec_2@PLT
220; FULL-DAG:        .align  8, 0x90
221; FULL-DAG:        ud2
222; FULL-DAG:        .globl  __llvm_jump_instr_table_2_1
223; FULL-DAG:        .align  8, 0x90
224; FULL-DAG:        .type   __llvm_jump_instr_table_2_1,@function
225; FULL-DAG:__llvm_jump_instr_table_2_1:
226; FULL-DAG:        jmp     indirect_fun@PLT
227; FULL-DAG:        .align  8, 0x90
228; FULL-DAG:        ud2
229; FULL-DAG:        .align  8, 0x90
230; FULL-DAG:        ud2
231; FULL-DAG:        .globl  __llvm_jump_instr_table_8_1
232; FULL-DAG:        .align  8, 0x90
233; FULL-DAG:        .type   __llvm_jump_instr_table_8_1,@function
234; FULL-DAG:__llvm_jump_instr_table_8_1:
235; FULL-DAG:        jmp     indirect_fun_i32@PLT
236; FULL-DAG:        .align  8, 0x90
237; FULL-DAG:        ud2
238; FULL-DAG:        .globl  __llvm_jump_instr_table_1_1
239; FULL-DAG:        .align  8, 0x90
240; FULL-DAG:        .type   __llvm_jump_instr_table_1_1,@function
241; FULL-DAG:__llvm_jump_instr_table_1_1:
242; FULL-DAG:        jmp     indirect_fun_array@PLT
243; FULL-DAG:        .align  8, 0x90
244; FULL-DAG:        ud2
245; FULL-DAG:        .globl  __llvm_jump_instr_table_0_1
246; FULL-DAG:        .align  8, 0x90
247; FULL-DAG:        .type   __llvm_jump_instr_table_0_1,@function
248; FULL-DAG:__llvm_jump_instr_table_0_1:
249; FULL-DAG:        jmp     indirect_fun_vec@PLT
250; FULL-DAG:        .align  8, 0x90
251; FULL-DAG:        ud2
252; FULL-DAG:        .globl  __llvm_jump_instr_table_6_1
253; FULL-DAG:        .align  8, 0x90
254; FULL-DAG:        .type   __llvm_jump_instr_table_6_1,@function
255; FULL-DAG:__llvm_jump_instr_table_6_1:
256; FULL-DAG:        jmp     indirect_fun_struct@PLT
257; FULL-DAG:        .align  8, 0x90
258; FULL-DAG:        ud2
259; FULL-DAG:        .globl  __llvm_jump_instr_table_5_1
260; FULL-DAG:        .align  8, 0x90
261; FULL-DAG:        .type   __llvm_jump_instr_table_5_1,@function
262; FULL-DAG:__llvm_jump_instr_table_5_1:
263; FULL-DAG:        jmp     indirect_fun_fun@PLT
264; FULL-DAG:        .align  8, 0x90
265; FULL-DAG:        ud2
266; FULL-DAG:        .globl  __llvm_jump_instr_table_4_1
267; FULL-DAG:        .align  8, 0x90
268; FULL-DAG:        .type   __llvm_jump_instr_table_4_1,@function
269; FULL-DAG:__llvm_jump_instr_table_4_1:
270; FULL-DAG:        jmp     indirect_fun_fun_ret@PLT
271; FULL-DAG:        .align  8, 0x90
272; FULL-DAG:        ud2
273