Daily bump.
[official-gcc.git] / libffi / testsuite / libffi.call / huge_struct.c
blob187c42cc33492dd7f1a37f2f534c44c05f770373
1 /* Area: ffi_call, closure_call
2 Purpose: Check large structure returns.
3 Limitations: none.
4 PR: none.
5 Originator: Blake Chaffin 6/18/2007
6 */
8 /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
9 /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
10 /* { dg-options -Wformat=0 { target moxie*-*-elf } } */
12 #include "ffitest.h"
14 typedef struct BigStruct{
15 uint8_t a;
16 int8_t b;
17 uint16_t c;
18 int16_t d;
19 uint32_t e;
20 int32_t f;
21 uint64_t g;
22 int64_t h;
23 float i;
24 double j;
25 long double k;
26 char* l;
27 uint8_t m;
28 int8_t n;
29 uint16_t o;
30 int16_t p;
31 uint32_t q;
32 int32_t r;
33 uint64_t s;
34 int64_t t;
35 float u;
36 double v;
37 long double w;
38 char* x;
39 uint8_t y;
40 int8_t z;
41 uint16_t aa;
42 int16_t bb;
43 uint32_t cc;
44 int32_t dd;
45 uint64_t ee;
46 int64_t ff;
47 float gg;
48 double hh;
49 long double ii;
50 char* jj;
51 uint8_t kk;
52 int8_t ll;
53 uint16_t mm;
54 int16_t nn;
55 uint32_t oo;
56 int32_t pp;
57 uint64_t qq;
58 int64_t rr;
59 float ss;
60 double tt;
61 long double uu;
62 char* vv;
63 uint8_t ww;
64 int8_t xx;
65 } BigStruct;
67 BigStruct
68 test_large_fn(
69 uint8_t ui8_1,
70 int8_t si8_1,
71 uint16_t ui16_1,
72 int16_t si16_1,
73 uint32_t ui32_1,
74 int32_t si32_1,
75 uint64_t ui64_1,
76 int64_t si64_1,
77 float f_1,
78 double d_1,
79 long double ld_1,
80 char* p_1,
81 uint8_t ui8_2,
82 int8_t si8_2,
83 uint16_t ui16_2,
84 int16_t si16_2,
85 uint32_t ui32_2,
86 int32_t si32_2,
87 uint64_t ui64_2,
88 int64_t si64_2,
89 float f_2,
90 double d_2,
91 long double ld_2,
92 char* p_2,
93 uint8_t ui8_3,
94 int8_t si8_3,
95 uint16_t ui16_3,
96 int16_t si16_3,
97 uint32_t ui32_3,
98 int32_t si32_3,
99 uint64_t ui64_3,
100 int64_t si64_3,
101 float f_3,
102 double d_3,
103 long double ld_3,
104 char* p_3,
105 uint8_t ui8_4,
106 int8_t si8_4,
107 uint16_t ui16_4,
108 int16_t si16_4,
109 uint32_t ui32_4,
110 int32_t si32_4,
111 uint64_t ui64_4,
112 int64_t si64_4,
113 float f_4,
114 double d_4,
115 long double ld_4,
116 char* p_4,
117 uint8_t ui8_5,
118 int8_t si8_5)
120 BigStruct retVal = {
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);
152 return retVal;
155 static void
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,
214 ui8_5, si8_5);
218 main(int argc __UNUSED__, const char** argv __UNUSED__)
220 void *code;
221 ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
223 ffi_cif cif;
224 ffi_type* argTypes[51];
225 void* argValues[51];
227 ffi_type ret_struct_type;
228 ffi_type* st_fields[51];
229 BigStruct retVal;
231 uint8_t ui8 = 1;
232 int8_t si8 = 2;
233 uint16_t ui16 = 3;
234 int16_t si16 = 4;
235 uint32_t ui32 = 5;
236 int32_t si32 = 6;
237 uint64_t ui64 = 7;
238 int64_t si64 = 8;
239 float f = 9;
240 double d = 10;
241 long double ld = 11;
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;
291 argTypes[50] = NULL;
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,
324 ui8, si8);
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" } */
340 return 0;