1; RUN: llc < %s -stack-symbol-ordering=0 -mtriple="x86_64-pc-linux-gnu" | FileCheck %s
2; RUN: llc < %s -stack-symbol-ordering=0 -mtriple="x86_64-pc-unknown-elf" | FileCheck %s
3
4; This test is a sanity check to ensure statepoints are generating StackMap
5; sections correctly.  This is not intended to be a rigorous test of the
6; StackMap format (see the stackmap tests for that).
7
8target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
9
10declare zeroext i1 @return_i1()
11
12define i1 @test(i32 addrspace(1)* %ptr_base, i32 %arg)
13  gc "statepoint-example" {
14; CHECK-LABEL: test:
15; Do we see two spills for the local values and the store to the
16; alloca?
17; CHECK: subq	$40, %rsp
18; CHECK: movq	$0,   24(%rsp)
19; CHECK: movq	%rdi, 16(%rsp)
20; CHECK: movq	%rax, 8(%rsp)
21; CHECK: callq return_i1
22; CHECK: addq	$40, %rsp
23; CHECK: retq
24entry:
25  %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8
26  store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1
27  %ptr_derived = getelementptr i32, i32 addrspace(1)* %ptr_base, i32 %arg
28  %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null)
29  %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
30  %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9)
31  %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10)
32  %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11)
33;
34  ret i1 %call1
35}
36
37; This is similar to the previous test except that we have derived pointer as
38; argument to the function. Despite that this can not happen after the
39; RewriteSafepointForGC pass, lowering should be able to handle it anyway.
40define i1 @test_derived_arg(i32 addrspace(1)* %ptr_base,
41                            i32 addrspace(1)* %ptr_derived)
42  gc "statepoint-example" {
43; CHECK-LABEL: test_derived_arg
44; Do we see two spills for the local values and the store to the
45; alloca?
46; CHECK: subq	$40, %rsp
47; CHECK: movq	$0,   24(%rsp)
48; CHECK: movq	%rdi, 16(%rsp)
49; CHECK: movq	%rsi, 8(%rsp)
50; CHECK: callq return_i1
51; CHECK: addq	$40, %rsp
52; CHECK: retq
53entry:
54  %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8
55  store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1
56  %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null)
57  %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
58  %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9)
59  %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10)
60  %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11)
61;
62  ret i1 %call1
63}
64
65; Simple test case to check that we emit the ID field correctly
66define i1 @test_id() gc "statepoint-example" {
67; CHECK-LABEL: test_id
68entry:
69  %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 237, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0)
70  %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
71  ret i1 %call1
72}
73
74
75declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
76declare i1 @llvm.experimental.gc.result.i1(token)
77declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3
78
79; CHECK-LABEL: .section .llvm_stackmaps
80; CHECK-NEXT:  __LLVM_StackMaps:
81; Header
82; CHECK-NEXT:   .byte 2
83; CHECK-NEXT:   .byte 0
84; CHECK-NEXT:   .short 0
85; Num Functions
86; CHECK-NEXT:   .long 3
87; Num LargeConstants
88; CHECK-NEXT:   .long 0
89; Num Callsites
90; CHECK-NEXT:   .long 3
91
92; Functions and stack size
93; CHECK-NEXT:   .quad test
94; CHECK-NEXT:   .quad 40
95; CHECK-NEXT:   .quad 1
96; CHECK-NEXT:   .quad test_derived_arg
97; CHECK-NEXT:   .quad 40
98; CHECK-NEXT:   .quad 1
99; CHECK-NEXT:   .quad test_id
100; CHECK-NEXT:   .quad 8
101; CHECK-NEXT:   .quad 1
102
103;
104; test
105;
106
107; Statepoint ID
108; CHECK-NEXT: .quad	0
109
110; Callsites
111; Constant arguments
112; CHECK-NEXT: .long	.Ltmp1-test
113; CHECK: .short	0
114; CHECK: .short	11
115; SmallConstant (0)
116; CHECK: .byte	4
117; CHECK: .byte	8
118; CHECK: .short	0
119; CHECK: .long	0
120; SmallConstant (0)
121; CHECK: .byte	4
122; CHECK: .byte	8
123; CHECK: .short	0
124; CHECK: .long	0
125; SmallConstant (2)
126; CHECK: .byte	4
127; CHECK: .byte	8
128; CHECK: .short	0
129; CHECK: .long	2
130; Indirect Spill Slot [RSP+0]
131; CHECK: .byte	3
132; CHECK: .byte	8
133; CHECK: .short	7
134; CHECK: .long	16
135; SmallConstant  (0)
136; CHECK: .byte	4
137; CHECK: .byte	8
138; CHECK: .short	0
139; CHECK: .long	0
140; SmallConstant  (0)
141; CHECK: .byte	4
142; CHECK: .byte	8
143; CHECK: .short	0
144; CHECK: .long	0
145; SmallConstant  (0)
146; CHECK: .byte	4
147; CHECK: .byte	8
148; CHECK: .short	0
149; CHECK: .long	0
150; Indirect Spill Slot [RSP+16]
151; CHECK: .byte	3
152; CHECK: .byte	8
153; CHECK: .short	7
154; CHECK: .long	16
155; Indirect Spill Slot [RSP+8]
156; CHECK: .byte	3
157; CHECK: .byte	8
158; CHECK: .short	7
159; CHECK: .long	8
160; Indirect Spill Slot [RSP+16]
161; CHECK: .byte	3
162; CHECK: .byte	8
163; CHECK: .short	7
164; CHECK: .long	16
165; Indirect Spill Slot [RSP+16]
166; CHECK: .byte	3
167; CHECK: .byte	8
168; CHECK: .short	7
169; CHECK: .long	16
170
171; No Padding or LiveOuts
172; CHECK: .short	0
173; CHECK: .short	0
174; CHECK: .p2align	3
175
176;
177; test_derived_arg
178
179; Statepoint ID
180; CHECK-NEXT: .quad	0
181
182; Callsites
183; Constant arguments
184; CHECK-NEXT: .long	.Ltmp3-test_derived_arg
185; CHECK: .short	0
186; CHECK: .short	11
187; SmallConstant (0)
188; CHECK: .byte	4
189; CHECK: .byte	8
190; CHECK: .short	0
191; CHECK: .long	0
192; SmallConstant (2)
193; CHECK: .byte	4
194; CHECK: .byte	8
195; CHECK: .short	0
196; CHECK: .long	2
197; Indirect Spill Slot [RSP+0]
198; CHECK: .byte	3
199; CHECK: .byte	8
200; CHECK: .short	7
201; CHECK: .long	16
202; SmallConstant  (0)
203; CHECK: .byte	4
204; CHECK: .byte	8
205; CHECK: .short	0
206; CHECK: .long	0
207; SmallConstant  (0)
208; CHECK: .byte	4
209; CHECK: .byte	8
210; CHECK: .short	0
211; CHECK: .long	0
212; SmallConstant  (0)
213; CHECK: .byte	4
214; CHECK: .byte	8
215; CHECK: .short	0
216; CHECK: .long	0
217; Indirect Spill Slot [RSP+16]
218; CHECK: .byte	3
219; CHECK: .byte	8
220; CHECK: .short	7
221; CHECK: .long	16
222; Indirect Spill Slot [RSP+8]
223; CHECK: .byte	3
224; CHECK: .byte	8
225; CHECK: .short	7
226; CHECK: .long	8
227; Indirect Spill Slot [RSP+16]
228; CHECK: .byte	3
229; CHECK: .byte	8
230; CHECK: .short	7
231; CHECK: .long	16
232; Indirect Spill Slot [RSP+16]
233; CHECK: .byte	3
234; CHECK: .byte	8
235; CHECK: .short	7
236; CHECK: .long	16
237
238; No Padding or LiveOuts
239; CHECK: .short	0
240; CHECK: .short	0
241; CHECK: .p2align	3
242
243; Records for the test_id function:
244
245; The Statepoint ID:
246; CHECK-NEXT: .quad	237
247
248; Instruction Offset
249; CHECK-NEXT: .long	.Ltmp5-test_id
250
251; Reserved:
252; CHECK: .short	0
253
254; NumLocations:
255; CHECK: .short	3
256
257; StkMapRecord[0]:
258; SmallConstant(0):
259; CHECK: .byte	4
260; CHECK: .byte	8
261; CHECK: .short	0
262; CHECK: .long	0
263
264; StkMapRecord[1]:
265; SmallConstant(0):
266; CHECK: .byte	4
267; CHECK: .byte	8
268; CHECK: .short	0
269; CHECK: .long	0
270
271; StkMapRecord[2]:
272; SmallConstant(0):
273; CHECK: .byte	4
274; CHECK: .byte	8
275; CHECK: .short	0
276; CHECK: .long	0
277
278; No padding or LiveOuts
279; CHECK: .short	0
280; CHECK: .short	0
281; CHECK: .p2align	3
282