xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/ssp-data-layout.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -disable-fp-elim -march=arm -mcpu=cortex-a8 -mtriple arm-linux-gnu -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;  This test is fairly fragile.  The goal is to ensure that "large" stack
3*9880d681SAndroid Build Coastguard Worker;  objects are allocated closest to the stack protector (i.e., farthest away
4*9880d681SAndroid Build Coastguard Worker;  from the Stack Pointer.)  In standard SSP mode this means that large (>=
5*9880d681SAndroid Build Coastguard Worker;  ssp-buffer-size) arrays and structures containing such arrays are
6*9880d681SAndroid Build Coastguard Worker;  closet to the protector.  With sspstrong and sspreq this means large
7*9880d681SAndroid Build Coastguard Worker;  arrays/structures-with-arrays are closest, followed by small (< ssp-buffer-size)
8*9880d681SAndroid Build Coastguard Worker;  arrays/structures-with-arrays, and then addr-taken variables.
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker;  Ideally, we only want verify that the objects appear in the correct groups
11*9880d681SAndroid Build Coastguard Worker;  and that the groups have the correct relative stack offset.  The ordering
12*9880d681SAndroid Build Coastguard Worker;  within a group is not relevant to this test.  Unfortunately, there is not
13*9880d681SAndroid Build Coastguard Worker;  an elegant way to do this, so just match the offset for each object.
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker%struct.struct_large_char = type { [8 x i8] }
16*9880d681SAndroid Build Coastguard Worker%struct.struct_large_char2 = type { [2 x i8], [8 x i8] }
17*9880d681SAndroid Build Coastguard Worker%struct.struct_small_char = type { [2 x i8] }
18*9880d681SAndroid Build Coastguard Worker%struct.struct_large_nonchar = type { [8 x i32] }
19*9880d681SAndroid Build Coastguard Worker%struct.struct_small_nonchar = type { [2 x i16] }
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine void @layout_ssp() ssp {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker; Expected stack layout for ssp is
24*9880d681SAndroid Build Coastguard Worker;  176 large_char          . Group 1, nested arrays, arrays >= ssp-buffer-size
25*9880d681SAndroid Build Coastguard Worker;  168 struct_large_char   .
26*9880d681SAndroid Build Coastguard Worker;  164 scalar1             | Everything else
27*9880d681SAndroid Build Coastguard Worker;  160 scalar2
28*9880d681SAndroid Build Coastguard Worker;  156 scalar3
29*9880d681SAndroid Build Coastguard Worker;  152 addr-of
30*9880d681SAndroid Build Coastguard Worker;  148 small_nonchar
31*9880d681SAndroid Build Coastguard Worker;  112 large_nonchar
32*9880d681SAndroid Build Coastguard Worker;  110 small_char
33*9880d681SAndroid Build Coastguard Worker;  108 struct_small_char
34*9880d681SAndroid Build Coastguard Worker;   72 struct_large_nonchar
35*9880d681SAndroid Build Coastguard Worker;   68 struct_small_nonchar
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK: layout_ssp:
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar1
40*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #164]
41*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar1
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar2
44*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #160]
45*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar2
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar3
48*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #156]
49*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar3
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_addrof
52*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #152]
53*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_addrof
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; CHECK: get_small_nonchar
56*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #148]
57*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_nonchar
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_nonchar
60*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #112]
61*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_nonchar
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_small_char
64*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #110]
65*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_char
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_char
68*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #176]
69*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_char
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_char
72*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #168]
73*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_char
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_char
76*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #108]
77*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_char
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_nonchar
80*9880d681SAndroid Build Coastguard Worker; CHECK:str r0, [sp, #72]
81*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_nonchar
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_nonchar
84*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #68]
85*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_nonchar
86*9880d681SAndroid Build Coastguard Worker  %x = alloca i32, align 4
87*9880d681SAndroid Build Coastguard Worker  %y = alloca i32, align 4
88*9880d681SAndroid Build Coastguard Worker  %z = alloca i32, align 4
89*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32, align 4
90*9880d681SAndroid Build Coastguard Worker  %small2 = alloca [2 x i16], align 2
91*9880d681SAndroid Build Coastguard Worker  %large2 = alloca [8 x i32], align 16
92*9880d681SAndroid Build Coastguard Worker  %small = alloca [2 x i8], align 1
93*9880d681SAndroid Build Coastguard Worker  %large = alloca [8 x i8], align 1
94*9880d681SAndroid Build Coastguard Worker  %a = alloca %struct.struct_large_char, align 1
95*9880d681SAndroid Build Coastguard Worker  %b = alloca %struct.struct_small_char, align 1
96*9880d681SAndroid Build Coastguard Worker  %c = alloca %struct.struct_large_nonchar, align 8
97*9880d681SAndroid Build Coastguard Worker  %d = alloca %struct.struct_small_nonchar, align 2
98*9880d681SAndroid Build Coastguard Worker  %call = call i32 @get_scalar1()
99*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %x, align 4
100*9880d681SAndroid Build Coastguard Worker  call void @end_scalar1()
101*9880d681SAndroid Build Coastguard Worker  %call1 = call i32 @get_scalar2()
102*9880d681SAndroid Build Coastguard Worker  store i32 %call1, i32* %y, align 4
103*9880d681SAndroid Build Coastguard Worker  call void @end_scalar2()
104*9880d681SAndroid Build Coastguard Worker  %call2 = call i32 @get_scalar3()
105*9880d681SAndroid Build Coastguard Worker  store i32 %call2, i32* %z, align 4
106*9880d681SAndroid Build Coastguard Worker  call void @end_scalar3()
107*9880d681SAndroid Build Coastguard Worker  %call3 = call i32 @get_addrof()
108*9880d681SAndroid Build Coastguard Worker  store i32 %call3, i32* %ptr, align 4
109*9880d681SAndroid Build Coastguard Worker  call void @end_addrof()
110*9880d681SAndroid Build Coastguard Worker  %call4 = call signext i16 @get_small_nonchar()
111*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i64 0
112*9880d681SAndroid Build Coastguard Worker  store i16 %call4, i16* %arrayidx, align 2
113*9880d681SAndroid Build Coastguard Worker  call void @end_small_nonchar()
114*9880d681SAndroid Build Coastguard Worker  %call5 = call i32 @get_large_nonchar()
115*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i64 0
116*9880d681SAndroid Build Coastguard Worker  store i32 %call5, i32* %arrayidx6, align 4
117*9880d681SAndroid Build Coastguard Worker  call void @end_large_nonchar()
118*9880d681SAndroid Build Coastguard Worker  %call7 = call signext i8 @get_small_char()
119*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i64 0
120*9880d681SAndroid Build Coastguard Worker  store i8 %call7, i8* %arrayidx8, align 1
121*9880d681SAndroid Build Coastguard Worker  call void @end_small_char()
122*9880d681SAndroid Build Coastguard Worker  %call9 = call signext i8 @get_large_char()
123*9880d681SAndroid Build Coastguard Worker  %arrayidx10 = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i64 0
124*9880d681SAndroid Build Coastguard Worker  store i8 %call9, i8* %arrayidx10, align 1
125*9880d681SAndroid Build Coastguard Worker  call void @end_large_char()
126*9880d681SAndroid Build Coastguard Worker  %call11 = call signext i8 @get_struct_large_char()
127*9880d681SAndroid Build Coastguard Worker  %foo = getelementptr inbounds %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
128*9880d681SAndroid Build Coastguard Worker  %arrayidx12 = getelementptr inbounds [8 x i8], [8 x i8]* %foo, i32 0, i64 0
129*9880d681SAndroid Build Coastguard Worker  store i8 %call11, i8* %arrayidx12, align 1
130*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_char()
131*9880d681SAndroid Build Coastguard Worker  %call13 = call signext i8 @get_struct_small_char()
132*9880d681SAndroid Build Coastguard Worker  %foo14 = getelementptr inbounds %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
133*9880d681SAndroid Build Coastguard Worker  %arrayidx15 = getelementptr inbounds [2 x i8], [2 x i8]* %foo14, i32 0, i64 0
134*9880d681SAndroid Build Coastguard Worker  store i8 %call13, i8* %arrayidx15, align 1
135*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_char()
136*9880d681SAndroid Build Coastguard Worker  %call16 = call i32 @get_struct_large_nonchar()
137*9880d681SAndroid Build Coastguard Worker  %foo17 = getelementptr inbounds %struct.struct_large_nonchar, %struct.struct_large_nonchar* %c, i32 0, i32 0
138*9880d681SAndroid Build Coastguard Worker  %arrayidx18 = getelementptr inbounds [8 x i32], [8 x i32]* %foo17, i32 0, i64 0
139*9880d681SAndroid Build Coastguard Worker  store i32 %call16, i32* %arrayidx18, align 4
140*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_nonchar()
141*9880d681SAndroid Build Coastguard Worker  %call19 = call signext i16 @get_struct_small_nonchar()
142*9880d681SAndroid Build Coastguard Worker  %foo20 = getelementptr inbounds %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
143*9880d681SAndroid Build Coastguard Worker  %arrayidx21 = getelementptr inbounds [2 x i16], [2 x i16]* %foo20, i32 0, i64 0
144*9880d681SAndroid Build Coastguard Worker  store i16 %call19, i16* %arrayidx21, align 2
145*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_nonchar()
146*9880d681SAndroid Build Coastguard Worker  %arraydecay = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i32 0
147*9880d681SAndroid Build Coastguard Worker  %arraydecay22 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i32 0
148*9880d681SAndroid Build Coastguard Worker  %arraydecay23 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i32 0
149*9880d681SAndroid Build Coastguard Worker  %arraydecay24 = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i32 0
150*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %x, align 4
151*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %y, align 4
152*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %z, align 4
153*9880d681SAndroid Build Coastguard Worker  %coerce.dive = getelementptr %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
154*9880d681SAndroid Build Coastguard Worker  %3 = bitcast [8 x i8]* %coerce.dive to i64*
155*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3, align 1
156*9880d681SAndroid Build Coastguard Worker  %coerce.dive25 = getelementptr %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
157*9880d681SAndroid Build Coastguard Worker  %5 = bitcast [2 x i8]* %coerce.dive25 to i16*
158*9880d681SAndroid Build Coastguard Worker  %6 = load i16, i16* %5, align 1
159*9880d681SAndroid Build Coastguard Worker  %coerce.dive26 = getelementptr %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
160*9880d681SAndroid Build Coastguard Worker  %7 = bitcast [2 x i16]* %coerce.dive26 to i32*
161*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* %7, align 1
162*9880d681SAndroid Build Coastguard Worker  call void @takes_all(i64 %4, i16 %6, %struct.struct_large_nonchar* byval align 4 %c, i32 %8, i8* %arraydecay, i8* %arraydecay22, i32* %arraydecay23, i16* %arraydecay24, i32* %ptr, i32 %0, i32 %1, i32 %2)
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine void @layout_sspstrong() sspstrong {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker; Expected stack layout for sspstrong is
169*9880d681SAndroid Build Coastguard Worker; 144  large_nonchar          . Group 1, nested arrays,
170*9880d681SAndroid Build Coastguard Worker; 136  large_char             .  arrays >= ssp-buffer-size
171*9880d681SAndroid Build Coastguard Worker; 128  struct_large_char      .
172*9880d681SAndroid Build Coastguard Worker; 96   struct_large_nonchar   .
173*9880d681SAndroid Build Coastguard Worker; 84+8 small_non_char         | Group 2, nested arrays,
174*9880d681SAndroid Build Coastguard Worker; 90   small_char             |  arrays < ssp-buffer-size
175*9880d681SAndroid Build Coastguard Worker; 88   struct_small_char      |
176*9880d681SAndroid Build Coastguard Worker; 84   struct_small_nonchar   |
177*9880d681SAndroid Build Coastguard Worker; 80   addrof                 * Group 3, addr-of local
178*9880d681SAndroid Build Coastguard Worker; 76   scalar1                + Group 4, everything else
179*9880d681SAndroid Build Coastguard Worker; 72   scalar2                +
180*9880d681SAndroid Build Coastguard Worker; 68   scalar3                +
181*9880d681SAndroid Build Coastguard Worker;
182*9880d681SAndroid Build Coastguard Worker; CHECK: layout_sspstrong:
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar1
185*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #76]
186*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar1
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar2
189*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #72]
190*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar2
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar3
193*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #68]
194*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar3
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_addrof
197*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #80]
198*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_addrof
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; CHECK: get_small_nonchar
201*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #92]
202*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_nonchar
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_nonchar
205*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #144]
206*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_nonchar
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_small_char
209*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #90]
210*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_char
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_char
213*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #136]
214*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_char
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_char
217*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #128]
218*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_char
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_char
221*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #88]
222*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_char
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_nonchar
225*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #96]
226*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_nonchar
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_nonchar
229*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #84]
230*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_nonchar
231*9880d681SAndroid Build Coastguard Worker  %x = alloca i32, align 4
232*9880d681SAndroid Build Coastguard Worker  %y = alloca i32, align 4
233*9880d681SAndroid Build Coastguard Worker  %z = alloca i32, align 4
234*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32, align 4
235*9880d681SAndroid Build Coastguard Worker  %small2 = alloca [2 x i16], align 2
236*9880d681SAndroid Build Coastguard Worker  %large2 = alloca [8 x i32], align 16
237*9880d681SAndroid Build Coastguard Worker  %small = alloca [2 x i8], align 1
238*9880d681SAndroid Build Coastguard Worker  %large = alloca [8 x i8], align 1
239*9880d681SAndroid Build Coastguard Worker  %a = alloca %struct.struct_large_char, align 1
240*9880d681SAndroid Build Coastguard Worker  %b = alloca %struct.struct_small_char, align 1
241*9880d681SAndroid Build Coastguard Worker  %c = alloca %struct.struct_large_nonchar, align 8
242*9880d681SAndroid Build Coastguard Worker  %d = alloca %struct.struct_small_nonchar, align 2
243*9880d681SAndroid Build Coastguard Worker  %call = call i32 @get_scalar1()
244*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %x, align 4
245*9880d681SAndroid Build Coastguard Worker  call void @end_scalar1()
246*9880d681SAndroid Build Coastguard Worker  %call1 = call i32 @get_scalar2()
247*9880d681SAndroid Build Coastguard Worker  store i32 %call1, i32* %y, align 4
248*9880d681SAndroid Build Coastguard Worker  call void @end_scalar2()
249*9880d681SAndroid Build Coastguard Worker  %call2 = call i32 @get_scalar3()
250*9880d681SAndroid Build Coastguard Worker  store i32 %call2, i32* %z, align 4
251*9880d681SAndroid Build Coastguard Worker  call void @end_scalar3()
252*9880d681SAndroid Build Coastguard Worker  %call3 = call i32 @get_addrof()
253*9880d681SAndroid Build Coastguard Worker  store i32 %call3, i32* %ptr, align 4
254*9880d681SAndroid Build Coastguard Worker  call void @end_addrof()
255*9880d681SAndroid Build Coastguard Worker  %call4 = call signext i16 @get_small_nonchar()
256*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i64 0
257*9880d681SAndroid Build Coastguard Worker  store i16 %call4, i16* %arrayidx, align 2
258*9880d681SAndroid Build Coastguard Worker  call void @end_small_nonchar()
259*9880d681SAndroid Build Coastguard Worker  %call5 = call i32 @get_large_nonchar()
260*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i64 0
261*9880d681SAndroid Build Coastguard Worker  store i32 %call5, i32* %arrayidx6, align 4
262*9880d681SAndroid Build Coastguard Worker  call void @end_large_nonchar()
263*9880d681SAndroid Build Coastguard Worker  %call7 = call signext i8 @get_small_char()
264*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i64 0
265*9880d681SAndroid Build Coastguard Worker  store i8 %call7, i8* %arrayidx8, align 1
266*9880d681SAndroid Build Coastguard Worker  call void @end_small_char()
267*9880d681SAndroid Build Coastguard Worker  %call9 = call signext i8 @get_large_char()
268*9880d681SAndroid Build Coastguard Worker  %arrayidx10 = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i64 0
269*9880d681SAndroid Build Coastguard Worker  store i8 %call9, i8* %arrayidx10, align 1
270*9880d681SAndroid Build Coastguard Worker  call void @end_large_char()
271*9880d681SAndroid Build Coastguard Worker  %call11 = call signext i8 @get_struct_large_char()
272*9880d681SAndroid Build Coastguard Worker  %foo = getelementptr inbounds %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
273*9880d681SAndroid Build Coastguard Worker  %arrayidx12 = getelementptr inbounds [8 x i8], [8 x i8]* %foo, i32 0, i64 0
274*9880d681SAndroid Build Coastguard Worker  store i8 %call11, i8* %arrayidx12, align 1
275*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_char()
276*9880d681SAndroid Build Coastguard Worker  %call13 = call signext i8 @get_struct_small_char()
277*9880d681SAndroid Build Coastguard Worker  %foo14 = getelementptr inbounds %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
278*9880d681SAndroid Build Coastguard Worker  %arrayidx15 = getelementptr inbounds [2 x i8], [2 x i8]* %foo14, i32 0, i64 0
279*9880d681SAndroid Build Coastguard Worker  store i8 %call13, i8* %arrayidx15, align 1
280*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_char()
281*9880d681SAndroid Build Coastguard Worker  %call16 = call i32 @get_struct_large_nonchar()
282*9880d681SAndroid Build Coastguard Worker  %foo17 = getelementptr inbounds %struct.struct_large_nonchar, %struct.struct_large_nonchar* %c, i32 0, i32 0
283*9880d681SAndroid Build Coastguard Worker  %arrayidx18 = getelementptr inbounds [8 x i32], [8 x i32]* %foo17, i32 0, i64 0
284*9880d681SAndroid Build Coastguard Worker  store i32 %call16, i32* %arrayidx18, align 4
285*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_nonchar()
286*9880d681SAndroid Build Coastguard Worker  %call19 = call signext i16 @get_struct_small_nonchar()
287*9880d681SAndroid Build Coastguard Worker  %foo20 = getelementptr inbounds %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
288*9880d681SAndroid Build Coastguard Worker  %arrayidx21 = getelementptr inbounds [2 x i16], [2 x i16]* %foo20, i32 0, i64 0
289*9880d681SAndroid Build Coastguard Worker  store i16 %call19, i16* %arrayidx21, align 2
290*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_nonchar()
291*9880d681SAndroid Build Coastguard Worker  %arraydecay = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i32 0
292*9880d681SAndroid Build Coastguard Worker  %arraydecay22 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i32 0
293*9880d681SAndroid Build Coastguard Worker  %arraydecay23 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i32 0
294*9880d681SAndroid Build Coastguard Worker  %arraydecay24 = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i32 0
295*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %x, align 4
296*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %y, align 4
297*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %z, align 4
298*9880d681SAndroid Build Coastguard Worker  %coerce.dive = getelementptr %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
299*9880d681SAndroid Build Coastguard Worker  %3 = bitcast [8 x i8]* %coerce.dive to i64*
300*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3, align 1
301*9880d681SAndroid Build Coastguard Worker  %coerce.dive25 = getelementptr %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
302*9880d681SAndroid Build Coastguard Worker  %5 = bitcast [2 x i8]* %coerce.dive25 to i16*
303*9880d681SAndroid Build Coastguard Worker  %6 = load i16, i16* %5, align 1
304*9880d681SAndroid Build Coastguard Worker  %coerce.dive26 = getelementptr %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
305*9880d681SAndroid Build Coastguard Worker  %7 = bitcast [2 x i16]* %coerce.dive26 to i32*
306*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* %7, align 1
307*9880d681SAndroid Build Coastguard Worker  call void @takes_all(i64 %4, i16 %6, %struct.struct_large_nonchar* byval align 4 %c, i32 %8, i8* %arraydecay, i8* %arraydecay22, i32* %arraydecay23, i16* %arraydecay24, i32* %ptr, i32 %0, i32 %1, i32 %2)
308*9880d681SAndroid Build Coastguard Worker  ret void
309*9880d681SAndroid Build Coastguard Worker}
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerdefine void @layout_sspreq() sspreq {
312*9880d681SAndroid Build Coastguard Workerentry:
313*9880d681SAndroid Build Coastguard Worker; Expected stack layout for sspreq is the same as sspstrong
314*9880d681SAndroid Build Coastguard Worker;
315*9880d681SAndroid Build Coastguard Worker; CHECK: layout_sspreq:
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar1
318*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #76]
319*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar1
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar2
322*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #72]
323*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar2
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_scalar3
326*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #68]
327*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_scalar3
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_addrof
330*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #80]
331*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_addrof
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker; CHECK: get_small_nonchar
334*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #92]
335*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_nonchar
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_nonchar
338*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #144]
339*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_nonchar
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_small_char
342*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #90]
343*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_small_char
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_large_char
346*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #136]
347*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_large_char
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_char
350*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #128]
351*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_char
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_char
354*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #88]
355*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_char
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_nonchar
358*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #96]
359*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_nonchar
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_nonchar
362*9880d681SAndroid Build Coastguard Worker; CHECK: strh r0, [sp, #84]
363*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_nonchar
364*9880d681SAndroid Build Coastguard Worker  %x = alloca i32, align 4
365*9880d681SAndroid Build Coastguard Worker  %y = alloca i32, align 4
366*9880d681SAndroid Build Coastguard Worker  %z = alloca i32, align 4
367*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32, align 4
368*9880d681SAndroid Build Coastguard Worker  %small2 = alloca [2 x i16], align 2
369*9880d681SAndroid Build Coastguard Worker  %large2 = alloca [8 x i32], align 16
370*9880d681SAndroid Build Coastguard Worker  %small = alloca [2 x i8], align 1
371*9880d681SAndroid Build Coastguard Worker  %large = alloca [8 x i8], align 1
372*9880d681SAndroid Build Coastguard Worker  %a = alloca %struct.struct_large_char, align 1
373*9880d681SAndroid Build Coastguard Worker  %b = alloca %struct.struct_small_char, align 1
374*9880d681SAndroid Build Coastguard Worker  %c = alloca %struct.struct_large_nonchar, align 8
375*9880d681SAndroid Build Coastguard Worker  %d = alloca %struct.struct_small_nonchar, align 2
376*9880d681SAndroid Build Coastguard Worker  %call = call i32 @get_scalar1()
377*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %x, align 4
378*9880d681SAndroid Build Coastguard Worker  call void @end_scalar1()
379*9880d681SAndroid Build Coastguard Worker  %call1 = call i32 @get_scalar2()
380*9880d681SAndroid Build Coastguard Worker  store i32 %call1, i32* %y, align 4
381*9880d681SAndroid Build Coastguard Worker  call void @end_scalar2()
382*9880d681SAndroid Build Coastguard Worker  %call2 = call i32 @get_scalar3()
383*9880d681SAndroid Build Coastguard Worker  store i32 %call2, i32* %z, align 4
384*9880d681SAndroid Build Coastguard Worker  call void @end_scalar3()
385*9880d681SAndroid Build Coastguard Worker  %call3 = call i32 @get_addrof()
386*9880d681SAndroid Build Coastguard Worker  store i32 %call3, i32* %ptr, align 4
387*9880d681SAndroid Build Coastguard Worker  call void @end_addrof()
388*9880d681SAndroid Build Coastguard Worker  %call4 = call signext i16 @get_small_nonchar()
389*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i64 0
390*9880d681SAndroid Build Coastguard Worker  store i16 %call4, i16* %arrayidx, align 2
391*9880d681SAndroid Build Coastguard Worker  call void @end_small_nonchar()
392*9880d681SAndroid Build Coastguard Worker  %call5 = call i32 @get_large_nonchar()
393*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i64 0
394*9880d681SAndroid Build Coastguard Worker  store i32 %call5, i32* %arrayidx6, align 4
395*9880d681SAndroid Build Coastguard Worker  call void @end_large_nonchar()
396*9880d681SAndroid Build Coastguard Worker  %call7 = call signext i8 @get_small_char()
397*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i64 0
398*9880d681SAndroid Build Coastguard Worker  store i8 %call7, i8* %arrayidx8, align 1
399*9880d681SAndroid Build Coastguard Worker  call void @end_small_char()
400*9880d681SAndroid Build Coastguard Worker  %call9 = call signext i8 @get_large_char()
401*9880d681SAndroid Build Coastguard Worker  %arrayidx10 = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i64 0
402*9880d681SAndroid Build Coastguard Worker  store i8 %call9, i8* %arrayidx10, align 1
403*9880d681SAndroid Build Coastguard Worker  call void @end_large_char()
404*9880d681SAndroid Build Coastguard Worker  %call11 = call signext i8 @get_struct_large_char()
405*9880d681SAndroid Build Coastguard Worker  %foo = getelementptr inbounds %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
406*9880d681SAndroid Build Coastguard Worker  %arrayidx12 = getelementptr inbounds [8 x i8], [8 x i8]* %foo, i32 0, i64 0
407*9880d681SAndroid Build Coastguard Worker  store i8 %call11, i8* %arrayidx12, align 1
408*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_char()
409*9880d681SAndroid Build Coastguard Worker  %call13 = call signext i8 @get_struct_small_char()
410*9880d681SAndroid Build Coastguard Worker  %foo14 = getelementptr inbounds %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
411*9880d681SAndroid Build Coastguard Worker  %arrayidx15 = getelementptr inbounds [2 x i8], [2 x i8]* %foo14, i32 0, i64 0
412*9880d681SAndroid Build Coastguard Worker  store i8 %call13, i8* %arrayidx15, align 1
413*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_char()
414*9880d681SAndroid Build Coastguard Worker  %call16 = call i32 @get_struct_large_nonchar()
415*9880d681SAndroid Build Coastguard Worker  %foo17 = getelementptr inbounds %struct.struct_large_nonchar, %struct.struct_large_nonchar* %c, i32 0, i32 0
416*9880d681SAndroid Build Coastguard Worker  %arrayidx18 = getelementptr inbounds [8 x i32], [8 x i32]* %foo17, i32 0, i64 0
417*9880d681SAndroid Build Coastguard Worker  store i32 %call16, i32* %arrayidx18, align 4
418*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_nonchar()
419*9880d681SAndroid Build Coastguard Worker  %call19 = call signext i16 @get_struct_small_nonchar()
420*9880d681SAndroid Build Coastguard Worker  %foo20 = getelementptr inbounds %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
421*9880d681SAndroid Build Coastguard Worker  %arrayidx21 = getelementptr inbounds [2 x i16], [2 x i16]* %foo20, i32 0, i64 0
422*9880d681SAndroid Build Coastguard Worker  store i16 %call19, i16* %arrayidx21, align 2
423*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_nonchar()
424*9880d681SAndroid Build Coastguard Worker  %arraydecay = getelementptr inbounds [8 x i8], [8 x i8]* %large, i32 0, i32 0
425*9880d681SAndroid Build Coastguard Worker  %arraydecay22 = getelementptr inbounds [2 x i8], [2 x i8]* %small, i32 0, i32 0
426*9880d681SAndroid Build Coastguard Worker  %arraydecay23 = getelementptr inbounds [8 x i32], [8 x i32]* %large2, i32 0, i32 0
427*9880d681SAndroid Build Coastguard Worker  %arraydecay24 = getelementptr inbounds [2 x i16], [2 x i16]* %small2, i32 0, i32 0
428*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %x, align 4
429*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %y, align 4
430*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %z, align 4
431*9880d681SAndroid Build Coastguard Worker  %coerce.dive = getelementptr %struct.struct_large_char, %struct.struct_large_char* %a, i32 0, i32 0
432*9880d681SAndroid Build Coastguard Worker  %3 = bitcast [8 x i8]* %coerce.dive to i64*
433*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3, align 1
434*9880d681SAndroid Build Coastguard Worker  %coerce.dive25 = getelementptr %struct.struct_small_char, %struct.struct_small_char* %b, i32 0, i32 0
435*9880d681SAndroid Build Coastguard Worker  %5 = bitcast [2 x i8]* %coerce.dive25 to i16*
436*9880d681SAndroid Build Coastguard Worker  %6 = load i16, i16* %5, align 1
437*9880d681SAndroid Build Coastguard Worker  %coerce.dive26 = getelementptr %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d, i32 0, i32 0
438*9880d681SAndroid Build Coastguard Worker  %7 = bitcast [2 x i16]* %coerce.dive26 to i32*
439*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* %7, align 1
440*9880d681SAndroid Build Coastguard Worker  call void @takes_all(i64 %4, i16 %6, %struct.struct_large_nonchar* byval align 4 %c, i32 %8, i8* %arraydecay, i8* %arraydecay22, i32* %arraydecay23, i16* %arraydecay24, i32* %ptr, i32 %0, i32 %1, i32 %2)
441*9880d681SAndroid Build Coastguard Worker  ret void
442*9880d681SAndroid Build Coastguard Worker}
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerdefine void @struct_with_protectable_arrays() sspstrong {
445*9880d681SAndroid Build Coastguard Workerentry:
446*9880d681SAndroid Build Coastguard Worker; Check to ensure that a structure which contains a small array followed by a
447*9880d681SAndroid Build Coastguard Worker; large array is assigned to the stack properly as a large object.
448*9880d681SAndroid Build Coastguard Worker; CHECK: struct_with_protectable_arrays:
449*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_small_char
450*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #68]
451*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_small_char
452*9880d681SAndroid Build Coastguard Worker; CHECK: bl get_struct_large_char2
453*9880d681SAndroid Build Coastguard Worker; CHECK: strb r0, [sp, #106]
454*9880d681SAndroid Build Coastguard Worker; CHECK: bl end_struct_large_char2
455*9880d681SAndroid Build Coastguard Worker  %a = alloca %struct.struct_small_char, align 1
456*9880d681SAndroid Build Coastguard Worker  %b = alloca %struct.struct_large_char2, align 1
457*9880d681SAndroid Build Coastguard Worker  %d1 = alloca %struct.struct_large_nonchar, align 8
458*9880d681SAndroid Build Coastguard Worker  %d2 = alloca %struct.struct_small_nonchar, align 2
459*9880d681SAndroid Build Coastguard Worker  %call = call signext i8 @get_struct_small_char()
460*9880d681SAndroid Build Coastguard Worker  %foo = getelementptr inbounds %struct.struct_small_char, %struct.struct_small_char* %a, i32 0, i32 0
461*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %foo, i32 0, i64 0
462*9880d681SAndroid Build Coastguard Worker  store i8 %call, i8* %arrayidx, align 1
463*9880d681SAndroid Build Coastguard Worker  call void @end_struct_small_char()
464*9880d681SAndroid Build Coastguard Worker  %call1 = call signext i8 @get_struct_large_char2()
465*9880d681SAndroid Build Coastguard Worker  %foo2 = getelementptr inbounds %struct.struct_large_char2, %struct.struct_large_char2* %b, i32 0, i32 1
466*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds [8 x i8], [8 x i8]* %foo2, i32 0, i64 0
467*9880d681SAndroid Build Coastguard Worker  store i8 %call1, i8* %arrayidx3, align 1
468*9880d681SAndroid Build Coastguard Worker  call void @end_struct_large_char2()
469*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.struct_large_char2* %b to %struct.struct_large_char*
470*9880d681SAndroid Build Coastguard Worker  %coerce.dive = getelementptr %struct.struct_large_char, %struct.struct_large_char* %0, i32 0, i32 0
471*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [8 x i8]* %coerce.dive to i64*
472*9880d681SAndroid Build Coastguard Worker  %2 = load i64, i64* %1, align 1
473*9880d681SAndroid Build Coastguard Worker  %coerce.dive4 = getelementptr %struct.struct_small_char, %struct.struct_small_char* %a, i32 0, i32 0
474*9880d681SAndroid Build Coastguard Worker  %3 = bitcast [2 x i8]* %coerce.dive4 to i16*
475*9880d681SAndroid Build Coastguard Worker  %4 = load i16, i16* %3, align 1
476*9880d681SAndroid Build Coastguard Worker  %coerce.dive5 = getelementptr %struct.struct_small_nonchar, %struct.struct_small_nonchar* %d2, i32 0, i32 0
477*9880d681SAndroid Build Coastguard Worker  %5 = bitcast [2 x i16]* %coerce.dive5 to i32*
478*9880d681SAndroid Build Coastguard Worker  %6 = load i32, i32* %5, align 1
479*9880d681SAndroid Build Coastguard Worker  call void @takes_all(i64 %2, i16 %4, %struct.struct_large_nonchar* byval align 4 %d1, i32 %6, i8* null, i8* null, i32* null, i16* null, i32* null, i32 0, i32 0, i32 0)
480*9880d681SAndroid Build Coastguard Worker  ret void
481*9880d681SAndroid Build Coastguard Worker}
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_scalar1()
484*9880d681SAndroid Build Coastguard Workerdeclare void @end_scalar1()
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_scalar2()
487*9880d681SAndroid Build Coastguard Workerdeclare void @end_scalar2()
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_scalar3()
490*9880d681SAndroid Build Coastguard Workerdeclare void @end_scalar3()
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_addrof()
493*9880d681SAndroid Build Coastguard Workerdeclare void @end_addrof()
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Workerdeclare signext i16 @get_small_nonchar()
496*9880d681SAndroid Build Coastguard Workerdeclare void @end_small_nonchar()
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_large_nonchar()
499*9880d681SAndroid Build Coastguard Workerdeclare void @end_large_nonchar()
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Workerdeclare signext i8 @get_small_char()
502*9880d681SAndroid Build Coastguard Workerdeclare void @end_small_char()
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerdeclare signext i8 @get_large_char()
505*9880d681SAndroid Build Coastguard Workerdeclare void @end_large_char()
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Workerdeclare signext i8 @get_struct_large_char()
508*9880d681SAndroid Build Coastguard Workerdeclare void @end_struct_large_char()
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Workerdeclare signext i8 @get_struct_large_char2()
511*9880d681SAndroid Build Coastguard Workerdeclare void @end_struct_large_char2()
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Workerdeclare signext i8 @get_struct_small_char()
514*9880d681SAndroid Build Coastguard Workerdeclare void @end_struct_small_char()
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Workerdeclare i32 @get_struct_large_nonchar()
517*9880d681SAndroid Build Coastguard Workerdeclare void @end_struct_large_nonchar()
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Workerdeclare signext i16 @get_struct_small_nonchar()
520*9880d681SAndroid Build Coastguard Workerdeclare void @end_struct_small_nonchar()
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Workerdeclare void @takes_all(i64, i16, %struct.struct_large_nonchar* byval align 8, i32, i8*, i8*, i32*, i16*, i32*, i32, i32, i32)
523