1 /* Area: ffi_call, closure_call
2 Purpose: Check large structure returns.
5 Originator: Blake Chaffin 6/18/2007
8 /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
9 /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
10 /* { dg-options -Wformat=0 { target moxie*-*-elf } } */
14 typedef struct BigStruct
{
121 ui8_1
+ 1, si8_1
+ 1, ui16_1
+ 1, si16_1
+ 1, ui32_1
+ 1, si32_1
+ 1,
122 ui64_1
+ 1, si64_1
+ 1, f_1
+ 1, d_1
+ 1, ld_1
+ 1, (char*)((intptr_t)p_1
+ 1),
123 ui8_2
+ 2, si8_2
+ 2, ui16_2
+ 2, si16_2
+ 2, ui32_2
+ 2, si32_2
+ 2,
124 ui64_2
+ 2, si64_2
+ 2, f_2
+ 2, d_2
+ 2, ld_2
+ 2, (char*)((intptr_t)p_2
+ 2),
125 ui8_3
+ 3, si8_3
+ 3, ui16_3
+ 3, si16_3
+ 3, ui32_3
+ 3, si32_3
+ 3,
126 ui64_3
+ 3, si64_3
+ 3, f_3
+ 3, d_3
+ 3, ld_3
+ 3, (char*)((intptr_t)p_3
+ 3),
127 ui8_4
+ 4, si8_4
+ 4, ui16_4
+ 4, si16_4
+ 4, ui32_4
+ 4, si32_4
+ 4,
128 ui64_4
+ 4, si64_4
+ 4, f_4
+ 4, d_4
+ 4, ld_4
+ 4, (char*)((intptr_t)p_4
+ 4),
129 ui8_5
+ 5, si8_5
+ 5};
131 printf("%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
132 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
133 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
134 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx %" PRIu8
" %" PRId8
": "
135 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
136 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
137 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
138 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx %" PRIu8
" %" PRId8
"\n",
139 ui8_1
, si8_1
, ui16_1
, si16_1
, ui32_1
, si32_1
, ui64_1
, si64_1
, f_1
, d_1
, ld_1
, (unsigned long)p_1
,
140 ui8_2
, si8_2
, ui16_2
, si16_2
, ui32_2
, si32_2
, ui64_2
, si64_2
, f_2
, d_2
, ld_2
, (unsigned long)p_2
,
141 ui8_3
, si8_3
, ui16_3
, si16_3
, ui32_3
, si32_3
, ui64_3
, si64_3
, f_3
, d_3
, ld_3
, (unsigned long)p_3
,
142 ui8_4
, si8_4
, ui16_4
, si16_4
, ui32_4
, si32_4
, ui64_4
, si64_4
, f_4
, d_4
, ld_4
, (unsigned long)p_4
, ui8_5
, si8_5
,
143 retVal
.a
, retVal
.b
, retVal
.c
, retVal
.d
, retVal
.e
, retVal
.f
,
144 retVal
.g
, retVal
.h
, retVal
.i
, retVal
.j
, retVal
.k
, (unsigned long)retVal
.l
,
145 retVal
.m
, retVal
.n
, retVal
.o
, retVal
.p
, retVal
.q
, retVal
.r
,
146 retVal
.s
, retVal
.t
, retVal
.u
, retVal
.v
, retVal
.w
, (unsigned long)retVal
.x
,
147 retVal
.y
, retVal
.z
, retVal
.aa
, retVal
.bb
, retVal
.cc
, retVal
.dd
,
148 retVal
.ee
, retVal
.ff
, retVal
.gg
, retVal
.hh
, retVal
.ii
, (unsigned long)retVal
.jj
,
149 retVal
.kk
, retVal
.ll
, retVal
.mm
, retVal
.nn
, retVal
.oo
, retVal
.pp
,
150 retVal
.qq
, retVal
.rr
, retVal
.ss
, retVal
.tt
, retVal
.uu
, (unsigned long)retVal
.vv
, retVal
.ww
, retVal
.xx
);
156 cls_large_fn(ffi_cif
* cif __UNUSED__
, void* resp
, void** args
, void* userdata __UNUSED__
)
158 uint8_t ui8_1
= *(uint8_t*)args
[0];
159 int8_t si8_1
= *(int8_t*)args
[1];
160 uint16_t ui16_1
= *(uint16_t*)args
[2];
161 int16_t si16_1
= *(int16_t*)args
[3];
162 uint32_t ui32_1
= *(uint32_t*)args
[4];
163 int32_t si32_1
= *(int32_t*)args
[5];
164 uint64_t ui64_1
= *(uint64_t*)args
[6];
165 int64_t si64_1
= *(int64_t*)args
[7];
166 float f_1
= *(float*)args
[8];
167 double d_1
= *(double*)args
[9];
168 long double ld_1
= *(long double*)args
[10];
169 char* p_1
= *(char**)args
[11];
170 uint8_t ui8_2
= *(uint8_t*)args
[12];
171 int8_t si8_2
= *(int8_t*)args
[13];
172 uint16_t ui16_2
= *(uint16_t*)args
[14];
173 int16_t si16_2
= *(int16_t*)args
[15];
174 uint32_t ui32_2
= *(uint32_t*)args
[16];
175 int32_t si32_2
= *(int32_t*)args
[17];
176 uint64_t ui64_2
= *(uint64_t*)args
[18];
177 int64_t si64_2
= *(int64_t*)args
[19];
178 float f_2
= *(float*)args
[20];
179 double d_2
= *(double*)args
[21];
180 long double ld_2
= *(long double*)args
[22];
181 char* p_2
= *(char**)args
[23];
182 uint8_t ui8_3
= *(uint8_t*)args
[24];
183 int8_t si8_3
= *(int8_t*)args
[25];
184 uint16_t ui16_3
= *(uint16_t*)args
[26];
185 int16_t si16_3
= *(int16_t*)args
[27];
186 uint32_t ui32_3
= *(uint32_t*)args
[28];
187 int32_t si32_3
= *(int32_t*)args
[29];
188 uint64_t ui64_3
= *(uint64_t*)args
[30];
189 int64_t si64_3
= *(int64_t*)args
[31];
190 float f_3
= *(float*)args
[32];
191 double d_3
= *(double*)args
[33];
192 long double ld_3
= *(long double*)args
[34];
193 char* p_3
= *(char**)args
[35];
194 uint8_t ui8_4
= *(uint8_t*)args
[36];
195 int8_t si8_4
= *(int8_t*)args
[37];
196 uint16_t ui16_4
= *(uint16_t*)args
[38];
197 int16_t si16_4
= *(int16_t*)args
[39];
198 uint32_t ui32_4
= *(uint32_t*)args
[40];
199 int32_t si32_4
= *(int32_t*)args
[41];
200 uint64_t ui64_4
= *(uint64_t*)args
[42];
201 int64_t si64_4
= *(int64_t*)args
[43];
202 float f_4
= *(float*)args
[44];
203 double d_4
= *(double*)args
[45];
204 long double ld_4
= *(long double*)args
[46];
205 char* p_4
= *(char**)args
[47];
206 uint8_t ui8_5
= *(uint8_t*)args
[48];
207 int8_t si8_5
= *(int8_t*)args
[49];
209 *(BigStruct
*)resp
= test_large_fn(
210 ui8_1
, si8_1
, ui16_1
, si16_1
, ui32_1
, si32_1
, ui64_1
, si64_1
, f_1
, d_1
, ld_1
, p_1
,
211 ui8_2
, si8_2
, ui16_2
, si16_2
, ui32_2
, si32_2
, ui64_2
, si64_2
, f_2
, d_2
, ld_2
, p_2
,
212 ui8_3
, si8_3
, ui16_3
, si16_3
, ui32_3
, si32_3
, ui64_3
, si64_3
, f_3
, d_3
, ld_3
, p_3
,
213 ui8_4
, si8_4
, ui16_4
, si16_4
, ui32_4
, si32_4
, ui64_4
, si64_4
, f_4
, d_4
, ld_4
, p_4
,
218 main(int argc __UNUSED__
, const char** argv __UNUSED__
)
221 ffi_closure
*pcl
= ffi_closure_alloc(sizeof(ffi_closure
), &code
);
224 ffi_type
* argTypes
[51];
227 ffi_type ret_struct_type
;
228 ffi_type
* st_fields
[51];
242 char* p
= (char*)0x12345678;
244 memset (&retVal
, 0, sizeof(retVal
));
246 ret_struct_type
.size
= 0;
247 ret_struct_type
.alignment
= 0;
248 ret_struct_type
.type
= FFI_TYPE_STRUCT
;
249 ret_struct_type
.elements
= st_fields
;
251 st_fields
[0] = st_fields
[12] = st_fields
[24] = st_fields
[36] = st_fields
[48] = &ffi_type_uint8
;
252 st_fields
[1] = st_fields
[13] = st_fields
[25] = st_fields
[37] = st_fields
[49] = &ffi_type_sint8
;
253 st_fields
[2] = st_fields
[14] = st_fields
[26] = st_fields
[38] = &ffi_type_uint16
;
254 st_fields
[3] = st_fields
[15] = st_fields
[27] = st_fields
[39] = &ffi_type_sint16
;
255 st_fields
[4] = st_fields
[16] = st_fields
[28] = st_fields
[40] = &ffi_type_uint32
;
256 st_fields
[5] = st_fields
[17] = st_fields
[29] = st_fields
[41] = &ffi_type_sint32
;
257 st_fields
[6] = st_fields
[18] = st_fields
[30] = st_fields
[42] = &ffi_type_uint64
;
258 st_fields
[7] = st_fields
[19] = st_fields
[31] = st_fields
[43] = &ffi_type_sint64
;
259 st_fields
[8] = st_fields
[20] = st_fields
[32] = st_fields
[44] = &ffi_type_float
;
260 st_fields
[9] = st_fields
[21] = st_fields
[33] = st_fields
[45] = &ffi_type_double
;
261 st_fields
[10] = st_fields
[22] = st_fields
[34] = st_fields
[46] = &ffi_type_longdouble
;
262 st_fields
[11] = st_fields
[23] = st_fields
[35] = st_fields
[47] = &ffi_type_pointer
;
264 st_fields
[50] = NULL
;
266 argTypes
[0] = argTypes
[12] = argTypes
[24] = argTypes
[36] = argTypes
[48] = &ffi_type_uint8
;
267 argValues
[0] = argValues
[12] = argValues
[24] = argValues
[36] = argValues
[48] = &ui8
;
268 argTypes
[1] = argTypes
[13] = argTypes
[25] = argTypes
[37] = argTypes
[49] = &ffi_type_sint8
;
269 argValues
[1] = argValues
[13] = argValues
[25] = argValues
[37] = argValues
[49] = &si8
;
270 argTypes
[2] = argTypes
[14] = argTypes
[26] = argTypes
[38] = &ffi_type_uint16
;
271 argValues
[2] = argValues
[14] = argValues
[26] = argValues
[38] = &ui16
;
272 argTypes
[3] = argTypes
[15] = argTypes
[27] = argTypes
[39] = &ffi_type_sint16
;
273 argValues
[3] = argValues
[15] = argValues
[27] = argValues
[39] = &si16
;
274 argTypes
[4] = argTypes
[16] = argTypes
[28] = argTypes
[40] = &ffi_type_uint32
;
275 argValues
[4] = argValues
[16] = argValues
[28] = argValues
[40] = &ui32
;
276 argTypes
[5] = argTypes
[17] = argTypes
[29] = argTypes
[41] = &ffi_type_sint32
;
277 argValues
[5] = argValues
[17] = argValues
[29] = argValues
[41] = &si32
;
278 argTypes
[6] = argTypes
[18] = argTypes
[30] = argTypes
[42] = &ffi_type_uint64
;
279 argValues
[6] = argValues
[18] = argValues
[30] = argValues
[42] = &ui64
;
280 argTypes
[7] = argTypes
[19] = argTypes
[31] = argTypes
[43] = &ffi_type_sint64
;
281 argValues
[7] = argValues
[19] = argValues
[31] = argValues
[43] = &si64
;
282 argTypes
[8] = argTypes
[20] = argTypes
[32] = argTypes
[44] = &ffi_type_float
;
283 argValues
[8] = argValues
[20] = argValues
[32] = argValues
[44] = &f
;
284 argTypes
[9] = argTypes
[21] = argTypes
[33] = argTypes
[45] = &ffi_type_double
;
285 argValues
[9] = argValues
[21] = argValues
[33] = argValues
[45] = &d
;
286 argTypes
[10] = argTypes
[22] = argTypes
[34] = argTypes
[46] = &ffi_type_longdouble
;
287 argValues
[10] = argValues
[22] = argValues
[34] = argValues
[46] = &ld
;
288 argTypes
[11] = argTypes
[23] = argTypes
[35] = argTypes
[47] = &ffi_type_pointer
;
289 argValues
[11] = argValues
[23] = argValues
[35] = argValues
[47] = &p
;
292 argValues
[50] = NULL
;
294 CHECK(ffi_prep_cif(&cif
, FFI_DEFAULT_ABI
, 50, &ret_struct_type
, argTypes
) == FFI_OK
);
296 ffi_call(&cif
, FFI_FN(test_large_fn
), &retVal
, argValues
);
297 /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
298 printf("res: %" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
299 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
300 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
301 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx %" PRIu8
" %" PRId8
"\n",
302 retVal
.a
, retVal
.b
, retVal
.c
, retVal
.d
, retVal
.e
, retVal
.f
,
303 retVal
.g
, retVal
.h
, retVal
.i
, retVal
.j
, retVal
.k
, (unsigned long)retVal
.l
,
304 retVal
.m
, retVal
.n
, retVal
.o
, retVal
.p
, retVal
.q
, retVal
.r
,
305 retVal
.s
, retVal
.t
, retVal
.u
, retVal
.v
, retVal
.w
, (unsigned long)retVal
.x
,
306 retVal
.y
, retVal
.z
, retVal
.aa
, retVal
.bb
, retVal
.cc
, retVal
.dd
,
307 retVal
.ee
, retVal
.ff
, retVal
.gg
, retVal
.hh
, retVal
.ii
, (unsigned long)retVal
.jj
,
308 retVal
.kk
, retVal
.ll
, retVal
.mm
, retVal
.nn
, retVal
.oo
, retVal
.pp
,
309 retVal
.qq
, retVal
.rr
, retVal
.ss
, retVal
.tt
, retVal
.uu
, (unsigned long)retVal
.vv
, retVal
.ww
, retVal
.xx
);
310 /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
312 CHECK(ffi_prep_closure_loc(pcl
, &cif
, cls_large_fn
, NULL
, code
) == FFI_OK
);
314 retVal
= ((BigStruct(*)(
315 uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
316 uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
317 uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
318 uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
319 uint8_t, int8_t))(code
))(
320 ui8
, si8
, ui16
, si16
, ui32
, si32
, ui64
, si64
, f
, d
, ld
, p
,
321 ui8
, si8
, ui16
, si16
, ui32
, si32
, ui64
, si64
, f
, d
, ld
, p
,
322 ui8
, si8
, ui16
, si16
, ui32
, si32
, ui64
, si64
, f
, d
, ld
, p
,
323 ui8
, si8
, ui16
, si16
, ui32
, si32
, ui64
, si64
, f
, d
, ld
, p
,
325 /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
326 printf("res: %" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
327 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
328 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx "
329 "%" PRIu8
" %" PRId8
" %hu %hd %u %d %" PRIu64
" %" PRId64
" %.0f %.0f %.0Lf %#lx %" PRIu8
" %" PRId8
"\n",
330 retVal
.a
, retVal
.b
, retVal
.c
, retVal
.d
, retVal
.e
, retVal
.f
,
331 retVal
.g
, retVal
.h
, retVal
.i
, retVal
.j
, retVal
.k
, (unsigned long)retVal
.l
,
332 retVal
.m
, retVal
.n
, retVal
.o
, retVal
.p
, retVal
.q
, retVal
.r
,
333 retVal
.s
, retVal
.t
, retVal
.u
, retVal
.v
, retVal
.w
, (unsigned long)retVal
.x
,
334 retVal
.y
, retVal
.z
, retVal
.aa
, retVal
.bb
, retVal
.cc
, retVal
.dd
,
335 retVal
.ee
, retVal
.ff
, retVal
.gg
, retVal
.hh
, retVal
.ii
, (unsigned long)retVal
.jj
,
336 retVal
.kk
, retVal
.ll
, retVal
.mm
, retVal
.nn
, retVal
.oo
, retVal
.pp
,
337 retVal
.qq
, retVal
.rr
, retVal
.ss
, retVal
.tt
, retVal
.uu
, (unsigned long)retVal
.vv
, retVal
.ww
, retVal
.xx
);
338 /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */