blob: 1524f6383250699d5067c43195c564c7fb330f4e [file] [log] [blame]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001; Test of multiple indirect calls to the same target. Each call
2; should be to the same operand, whether it's in a register or on the
3; stack.
4
Karl Schimpf2a5324a2014-09-25 09:37:49 -07005; RUN: %p2i -i %s --args -O2 --verbose none \
Jim Stichnothbca2f652014-11-01 10:13:54 -07006; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \
Jan Voungdddc3062014-08-29 12:59:02 -07007; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s
Karl Schimpf2a5324a2014-09-25 09:37:49 -07008; RUN: %p2i -i %s --args -Om1 --verbose none \
Jim Stichnothbca2f652014-11-01 10:13:54 -07009; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \
Jan Voungdddc3062014-08-29 12:59:02 -070010; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
11; RUN: | FileCheck --check-prefix=OPTM1 %s
Jim Stichnothf7c9a142014-04-29 10:52:43 -070012
13@__init_array_start = internal constant [0 x i8] zeroinitializer, align 4
14@__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4
15@__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8
16@__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4
17
18define internal void @CallIndirect(i32 %f) {
19entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -070020 %__1 = inttoptr i32 %f to void ()*
21 call void %__1()
22 call void %__1()
23 call void %__1()
24 call void %__1()
25 call void %__1()
Jim Stichnothf7c9a142014-04-29 10:52:43 -070026 ret void
27}
Jan Voung198b2942014-10-16 09:40:02 -070028; CHECK-LABEL: CallIndirect
Jim Stichnothf7c9a142014-04-29 10:52:43 -070029; CHECK: call [[REGISTER:[a-z]+]]
30; CHECK: call [[REGISTER]]
31; CHECK: call [[REGISTER]]
32; CHECK: call [[REGISTER]]
33; CHECK: call [[REGISTER]]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070034;
Jan Voung198b2942014-10-16 09:40:02 -070035; OPTM1-LABEL: CallIndirect
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070036; OPTM1: call [[TARGET:.+]]
37; OPTM1: call [[TARGET]]
38; OPTM1: call [[TARGET]]
39; OPTM1: call [[TARGET]]
40; OPTM1: call [[TARGET]]
Jim Stichnothf7c9a142014-04-29 10:52:43 -070041
Jan Voung198b2942014-10-16 09:40:02 -070042@fp_v = internal global [4 x i8] zeroinitializer, align 4
43
44define internal void @CallIndirectGlobal() {
45entry:
46 %fp_ptr_i32 = bitcast [4 x i8]* @fp_v to i32*
47 %fp_ptr = load i32* %fp_ptr_i32, align 1
48 %fp = inttoptr i32 %fp_ptr to void ()*
49 call void %fp()
50 call void %fp()
51 call void %fp()
52 call void %fp()
53 ret void
54}
55; CHECK-LABEL: CallIndirectGlobal
56; CHECK: call [[REGISTER:[a-z]+]]
57; CHECK: call [[REGISTER]]
58; CHECK: call [[REGISTER]]
59; CHECK: call [[REGISTER]]
60;
61; OPTM1-LABEL: CallIndirectGlobal
62; OPTM1: call [[TARGET:.+]]
63; OPTM1: call [[TARGET]]
64; OPTM1: call [[TARGET]]
65; OPTM1: call [[TARGET]]
66
67; Calling an absolute address is used for non-IRT PNaCl pexes to directly
68; access syscall trampolines. Do we need to support this?
69; define internal void @CallIndirectConst() {
70; entry:
71; %__1 = inttoptr i32 66496 to void ()*
72; call void %__1()
73; call void %__1()
74; call void %__1()
75; call void %__1()
76; call void %__1()
77; ret void
78; }