1*1fd5a2e1SPrashanth Swaminathan /* Area: ffi_call, closure_call
2*1fd5a2e1SPrashanth Swaminathan Purpose: Check large structure returns.
3*1fd5a2e1SPrashanth Swaminathan Limitations: none.
4*1fd5a2e1SPrashanth Swaminathan PR: none.
5*1fd5a2e1SPrashanth Swaminathan Originator: Blake Chaffin 6/18/2007
6*1fd5a2e1SPrashanth Swaminathan */
7*1fd5a2e1SPrashanth Swaminathan
8*1fd5a2e1SPrashanth Swaminathan /* { dg-excess-errors "" { target x86_64-*-mingw* x86_64-*-cygwin* } } */
9*1fd5a2e1SPrashanth Swaminathan /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
10*1fd5a2e1SPrashanth Swaminathan /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
11*1fd5a2e1SPrashanth Swaminathan /* { dg-options -Wformat=0 { target moxie*-*-elf } } */
12*1fd5a2e1SPrashanth Swaminathan /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
13*1fd5a2e1SPrashanth Swaminathan
14*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
15*1fd5a2e1SPrashanth Swaminathan
16*1fd5a2e1SPrashanth Swaminathan typedef struct BigStruct{
17*1fd5a2e1SPrashanth Swaminathan uint8_t a;
18*1fd5a2e1SPrashanth Swaminathan int8_t b;
19*1fd5a2e1SPrashanth Swaminathan uint16_t c;
20*1fd5a2e1SPrashanth Swaminathan int16_t d;
21*1fd5a2e1SPrashanth Swaminathan uint32_t e;
22*1fd5a2e1SPrashanth Swaminathan int32_t f;
23*1fd5a2e1SPrashanth Swaminathan uint64_t g;
24*1fd5a2e1SPrashanth Swaminathan int64_t h;
25*1fd5a2e1SPrashanth Swaminathan float i;
26*1fd5a2e1SPrashanth Swaminathan double j;
27*1fd5a2e1SPrashanth Swaminathan long double k;
28*1fd5a2e1SPrashanth Swaminathan char* l;
29*1fd5a2e1SPrashanth Swaminathan uint8_t m;
30*1fd5a2e1SPrashanth Swaminathan int8_t n;
31*1fd5a2e1SPrashanth Swaminathan uint16_t o;
32*1fd5a2e1SPrashanth Swaminathan int16_t p;
33*1fd5a2e1SPrashanth Swaminathan uint32_t q;
34*1fd5a2e1SPrashanth Swaminathan int32_t r;
35*1fd5a2e1SPrashanth Swaminathan uint64_t s;
36*1fd5a2e1SPrashanth Swaminathan int64_t t;
37*1fd5a2e1SPrashanth Swaminathan float u;
38*1fd5a2e1SPrashanth Swaminathan double v;
39*1fd5a2e1SPrashanth Swaminathan long double w;
40*1fd5a2e1SPrashanth Swaminathan char* x;
41*1fd5a2e1SPrashanth Swaminathan uint8_t y;
42*1fd5a2e1SPrashanth Swaminathan int8_t z;
43*1fd5a2e1SPrashanth Swaminathan uint16_t aa;
44*1fd5a2e1SPrashanth Swaminathan int16_t bb;
45*1fd5a2e1SPrashanth Swaminathan uint32_t cc;
46*1fd5a2e1SPrashanth Swaminathan int32_t dd;
47*1fd5a2e1SPrashanth Swaminathan uint64_t ee;
48*1fd5a2e1SPrashanth Swaminathan int64_t ff;
49*1fd5a2e1SPrashanth Swaminathan float gg;
50*1fd5a2e1SPrashanth Swaminathan double hh;
51*1fd5a2e1SPrashanth Swaminathan long double ii;
52*1fd5a2e1SPrashanth Swaminathan char* jj;
53*1fd5a2e1SPrashanth Swaminathan uint8_t kk;
54*1fd5a2e1SPrashanth Swaminathan int8_t ll;
55*1fd5a2e1SPrashanth Swaminathan uint16_t mm;
56*1fd5a2e1SPrashanth Swaminathan int16_t nn;
57*1fd5a2e1SPrashanth Swaminathan uint32_t oo;
58*1fd5a2e1SPrashanth Swaminathan int32_t pp;
59*1fd5a2e1SPrashanth Swaminathan uint64_t qq;
60*1fd5a2e1SPrashanth Swaminathan int64_t rr;
61*1fd5a2e1SPrashanth Swaminathan float ss;
62*1fd5a2e1SPrashanth Swaminathan double tt;
63*1fd5a2e1SPrashanth Swaminathan long double uu;
64*1fd5a2e1SPrashanth Swaminathan char* vv;
65*1fd5a2e1SPrashanth Swaminathan uint8_t ww;
66*1fd5a2e1SPrashanth Swaminathan int8_t xx;
67*1fd5a2e1SPrashanth Swaminathan } BigStruct;
68*1fd5a2e1SPrashanth Swaminathan
69*1fd5a2e1SPrashanth Swaminathan BigStruct
test_large_fn(uint8_t ui8_1,int8_t si8_1,uint16_t ui16_1,int16_t si16_1,uint32_t ui32_1,int32_t si32_1,uint64_t ui64_1,int64_t si64_1,float f_1,double d_1,long double ld_1,char * p_1,uint8_t ui8_2,int8_t si8_2,uint16_t ui16_2,int16_t si16_2,uint32_t ui32_2,int32_t si32_2,uint64_t ui64_2,int64_t si64_2,float f_2,double d_2,long double ld_2,char * p_2,uint8_t ui8_3,int8_t si8_3,uint16_t ui16_3,int16_t si16_3,uint32_t ui32_3,int32_t si32_3,uint64_t ui64_3,int64_t si64_3,float f_3,double d_3,long double ld_3,char * p_3,uint8_t ui8_4,int8_t si8_4,uint16_t ui16_4,int16_t si16_4,uint32_t ui32_4,int32_t si32_4,uint64_t ui64_4,int64_t si64_4,float f_4,double d_4,long double ld_4,char * p_4,uint8_t ui8_5,int8_t si8_5)70*1fd5a2e1SPrashanth Swaminathan test_large_fn(
71*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_1,
72*1fd5a2e1SPrashanth Swaminathan int8_t si8_1,
73*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_1,
74*1fd5a2e1SPrashanth Swaminathan int16_t si16_1,
75*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_1,
76*1fd5a2e1SPrashanth Swaminathan int32_t si32_1,
77*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_1,
78*1fd5a2e1SPrashanth Swaminathan int64_t si64_1,
79*1fd5a2e1SPrashanth Swaminathan float f_1,
80*1fd5a2e1SPrashanth Swaminathan double d_1,
81*1fd5a2e1SPrashanth Swaminathan long double ld_1,
82*1fd5a2e1SPrashanth Swaminathan char* p_1,
83*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_2,
84*1fd5a2e1SPrashanth Swaminathan int8_t si8_2,
85*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_2,
86*1fd5a2e1SPrashanth Swaminathan int16_t si16_2,
87*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_2,
88*1fd5a2e1SPrashanth Swaminathan int32_t si32_2,
89*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_2,
90*1fd5a2e1SPrashanth Swaminathan int64_t si64_2,
91*1fd5a2e1SPrashanth Swaminathan float f_2,
92*1fd5a2e1SPrashanth Swaminathan double d_2,
93*1fd5a2e1SPrashanth Swaminathan long double ld_2,
94*1fd5a2e1SPrashanth Swaminathan char* p_2,
95*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_3,
96*1fd5a2e1SPrashanth Swaminathan int8_t si8_3,
97*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_3,
98*1fd5a2e1SPrashanth Swaminathan int16_t si16_3,
99*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_3,
100*1fd5a2e1SPrashanth Swaminathan int32_t si32_3,
101*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_3,
102*1fd5a2e1SPrashanth Swaminathan int64_t si64_3,
103*1fd5a2e1SPrashanth Swaminathan float f_3,
104*1fd5a2e1SPrashanth Swaminathan double d_3,
105*1fd5a2e1SPrashanth Swaminathan long double ld_3,
106*1fd5a2e1SPrashanth Swaminathan char* p_3,
107*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_4,
108*1fd5a2e1SPrashanth Swaminathan int8_t si8_4,
109*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_4,
110*1fd5a2e1SPrashanth Swaminathan int16_t si16_4,
111*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_4,
112*1fd5a2e1SPrashanth Swaminathan int32_t si32_4,
113*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_4,
114*1fd5a2e1SPrashanth Swaminathan int64_t si64_4,
115*1fd5a2e1SPrashanth Swaminathan float f_4,
116*1fd5a2e1SPrashanth Swaminathan double d_4,
117*1fd5a2e1SPrashanth Swaminathan long double ld_4,
118*1fd5a2e1SPrashanth Swaminathan char* p_4,
119*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_5,
120*1fd5a2e1SPrashanth Swaminathan int8_t si8_5)
121*1fd5a2e1SPrashanth Swaminathan {
122*1fd5a2e1SPrashanth Swaminathan BigStruct retVal = {
123*1fd5a2e1SPrashanth Swaminathan ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1,
124*1fd5a2e1SPrashanth Swaminathan ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1),
125*1fd5a2e1SPrashanth Swaminathan ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2,
126*1fd5a2e1SPrashanth Swaminathan ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2),
127*1fd5a2e1SPrashanth Swaminathan ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3,
128*1fd5a2e1SPrashanth Swaminathan ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3),
129*1fd5a2e1SPrashanth Swaminathan ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4,
130*1fd5a2e1SPrashanth Swaminathan ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4),
131*1fd5a2e1SPrashanth Swaminathan ui8_5 + 5, si8_5 + 5};
132*1fd5a2e1SPrashanth Swaminathan
133*1fd5a2e1SPrashanth Swaminathan printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
134*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
135*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
136*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": "
137*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
138*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
139*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
140*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
141*1fd5a2e1SPrashanth Swaminathan 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,
142*1fd5a2e1SPrashanth Swaminathan 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,
143*1fd5a2e1SPrashanth Swaminathan 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,
144*1fd5a2e1SPrashanth Swaminathan 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,
145*1fd5a2e1SPrashanth Swaminathan retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
146*1fd5a2e1SPrashanth Swaminathan retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
147*1fd5a2e1SPrashanth Swaminathan retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
148*1fd5a2e1SPrashanth Swaminathan retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
149*1fd5a2e1SPrashanth Swaminathan retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
150*1fd5a2e1SPrashanth Swaminathan retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
151*1fd5a2e1SPrashanth Swaminathan retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
152*1fd5a2e1SPrashanth Swaminathan retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
153*1fd5a2e1SPrashanth Swaminathan
154*1fd5a2e1SPrashanth Swaminathan return retVal;
155*1fd5a2e1SPrashanth Swaminathan }
156*1fd5a2e1SPrashanth Swaminathan
157*1fd5a2e1SPrashanth Swaminathan static void
cls_large_fn(ffi_cif * cif __UNUSED__,void * resp,void ** args,void * userdata __UNUSED__)158*1fd5a2e1SPrashanth Swaminathan cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
159*1fd5a2e1SPrashanth Swaminathan {
160*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_1 = *(uint8_t*)args[0];
161*1fd5a2e1SPrashanth Swaminathan int8_t si8_1 = *(int8_t*)args[1];
162*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_1 = *(uint16_t*)args[2];
163*1fd5a2e1SPrashanth Swaminathan int16_t si16_1 = *(int16_t*)args[3];
164*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_1 = *(uint32_t*)args[4];
165*1fd5a2e1SPrashanth Swaminathan int32_t si32_1 = *(int32_t*)args[5];
166*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_1 = *(uint64_t*)args[6];
167*1fd5a2e1SPrashanth Swaminathan int64_t si64_1 = *(int64_t*)args[7];
168*1fd5a2e1SPrashanth Swaminathan float f_1 = *(float*)args[8];
169*1fd5a2e1SPrashanth Swaminathan double d_1 = *(double*)args[9];
170*1fd5a2e1SPrashanth Swaminathan long double ld_1 = *(long double*)args[10];
171*1fd5a2e1SPrashanth Swaminathan char* p_1 = *(char**)args[11];
172*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_2 = *(uint8_t*)args[12];
173*1fd5a2e1SPrashanth Swaminathan int8_t si8_2 = *(int8_t*)args[13];
174*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_2 = *(uint16_t*)args[14];
175*1fd5a2e1SPrashanth Swaminathan int16_t si16_2 = *(int16_t*)args[15];
176*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_2 = *(uint32_t*)args[16];
177*1fd5a2e1SPrashanth Swaminathan int32_t si32_2 = *(int32_t*)args[17];
178*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_2 = *(uint64_t*)args[18];
179*1fd5a2e1SPrashanth Swaminathan int64_t si64_2 = *(int64_t*)args[19];
180*1fd5a2e1SPrashanth Swaminathan float f_2 = *(float*)args[20];
181*1fd5a2e1SPrashanth Swaminathan double d_2 = *(double*)args[21];
182*1fd5a2e1SPrashanth Swaminathan long double ld_2 = *(long double*)args[22];
183*1fd5a2e1SPrashanth Swaminathan char* p_2 = *(char**)args[23];
184*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_3 = *(uint8_t*)args[24];
185*1fd5a2e1SPrashanth Swaminathan int8_t si8_3 = *(int8_t*)args[25];
186*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_3 = *(uint16_t*)args[26];
187*1fd5a2e1SPrashanth Swaminathan int16_t si16_3 = *(int16_t*)args[27];
188*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_3 = *(uint32_t*)args[28];
189*1fd5a2e1SPrashanth Swaminathan int32_t si32_3 = *(int32_t*)args[29];
190*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_3 = *(uint64_t*)args[30];
191*1fd5a2e1SPrashanth Swaminathan int64_t si64_3 = *(int64_t*)args[31];
192*1fd5a2e1SPrashanth Swaminathan float f_3 = *(float*)args[32];
193*1fd5a2e1SPrashanth Swaminathan double d_3 = *(double*)args[33];
194*1fd5a2e1SPrashanth Swaminathan long double ld_3 = *(long double*)args[34];
195*1fd5a2e1SPrashanth Swaminathan char* p_3 = *(char**)args[35];
196*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_4 = *(uint8_t*)args[36];
197*1fd5a2e1SPrashanth Swaminathan int8_t si8_4 = *(int8_t*)args[37];
198*1fd5a2e1SPrashanth Swaminathan uint16_t ui16_4 = *(uint16_t*)args[38];
199*1fd5a2e1SPrashanth Swaminathan int16_t si16_4 = *(int16_t*)args[39];
200*1fd5a2e1SPrashanth Swaminathan uint32_t ui32_4 = *(uint32_t*)args[40];
201*1fd5a2e1SPrashanth Swaminathan int32_t si32_4 = *(int32_t*)args[41];
202*1fd5a2e1SPrashanth Swaminathan uint64_t ui64_4 = *(uint64_t*)args[42];
203*1fd5a2e1SPrashanth Swaminathan int64_t si64_4 = *(int64_t*)args[43];
204*1fd5a2e1SPrashanth Swaminathan float f_4 = *(float*)args[44];
205*1fd5a2e1SPrashanth Swaminathan double d_4 = *(double*)args[45];
206*1fd5a2e1SPrashanth Swaminathan long double ld_4 = *(long double*)args[46];
207*1fd5a2e1SPrashanth Swaminathan char* p_4 = *(char**)args[47];
208*1fd5a2e1SPrashanth Swaminathan uint8_t ui8_5 = *(uint8_t*)args[48];
209*1fd5a2e1SPrashanth Swaminathan int8_t si8_5 = *(int8_t*)args[49];
210*1fd5a2e1SPrashanth Swaminathan
211*1fd5a2e1SPrashanth Swaminathan *(BigStruct*)resp = test_large_fn(
212*1fd5a2e1SPrashanth Swaminathan ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1,
213*1fd5a2e1SPrashanth Swaminathan ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2,
214*1fd5a2e1SPrashanth Swaminathan ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3,
215*1fd5a2e1SPrashanth Swaminathan ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4,
216*1fd5a2e1SPrashanth Swaminathan ui8_5, si8_5);
217*1fd5a2e1SPrashanth Swaminathan }
218*1fd5a2e1SPrashanth Swaminathan
219*1fd5a2e1SPrashanth Swaminathan int
main(int argc __UNUSED__,const char ** argv __UNUSED__)220*1fd5a2e1SPrashanth Swaminathan main(int argc __UNUSED__, const char** argv __UNUSED__)
221*1fd5a2e1SPrashanth Swaminathan {
222*1fd5a2e1SPrashanth Swaminathan void *code;
223*1fd5a2e1SPrashanth Swaminathan ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
224*1fd5a2e1SPrashanth Swaminathan
225*1fd5a2e1SPrashanth Swaminathan ffi_cif cif;
226*1fd5a2e1SPrashanth Swaminathan ffi_type* argTypes[51];
227*1fd5a2e1SPrashanth Swaminathan void* argValues[51];
228*1fd5a2e1SPrashanth Swaminathan
229*1fd5a2e1SPrashanth Swaminathan ffi_type ret_struct_type;
230*1fd5a2e1SPrashanth Swaminathan ffi_type* st_fields[51];
231*1fd5a2e1SPrashanth Swaminathan BigStruct retVal;
232*1fd5a2e1SPrashanth Swaminathan
233*1fd5a2e1SPrashanth Swaminathan uint8_t ui8 = 1;
234*1fd5a2e1SPrashanth Swaminathan int8_t si8 = 2;
235*1fd5a2e1SPrashanth Swaminathan uint16_t ui16 = 3;
236*1fd5a2e1SPrashanth Swaminathan int16_t si16 = 4;
237*1fd5a2e1SPrashanth Swaminathan uint32_t ui32 = 5;
238*1fd5a2e1SPrashanth Swaminathan int32_t si32 = 6;
239*1fd5a2e1SPrashanth Swaminathan uint64_t ui64 = 7;
240*1fd5a2e1SPrashanth Swaminathan int64_t si64 = 8;
241*1fd5a2e1SPrashanth Swaminathan float f = 9;
242*1fd5a2e1SPrashanth Swaminathan double d = 10;
243*1fd5a2e1SPrashanth Swaminathan long double ld = 11;
244*1fd5a2e1SPrashanth Swaminathan char* p = (char*)0x12345678;
245*1fd5a2e1SPrashanth Swaminathan
246*1fd5a2e1SPrashanth Swaminathan memset (&retVal, 0, sizeof(retVal));
247*1fd5a2e1SPrashanth Swaminathan
248*1fd5a2e1SPrashanth Swaminathan ret_struct_type.size = 0;
249*1fd5a2e1SPrashanth Swaminathan ret_struct_type.alignment = 0;
250*1fd5a2e1SPrashanth Swaminathan ret_struct_type.type = FFI_TYPE_STRUCT;
251*1fd5a2e1SPrashanth Swaminathan ret_struct_type.elements = st_fields;
252*1fd5a2e1SPrashanth Swaminathan
253*1fd5a2e1SPrashanth Swaminathan st_fields[0] = st_fields[12] = st_fields[24] = st_fields[36] = st_fields[48] = &ffi_type_uint8;
254*1fd5a2e1SPrashanth Swaminathan st_fields[1] = st_fields[13] = st_fields[25] = st_fields[37] = st_fields[49] = &ffi_type_sint8;
255*1fd5a2e1SPrashanth Swaminathan st_fields[2] = st_fields[14] = st_fields[26] = st_fields[38] = &ffi_type_uint16;
256*1fd5a2e1SPrashanth Swaminathan st_fields[3] = st_fields[15] = st_fields[27] = st_fields[39] = &ffi_type_sint16;
257*1fd5a2e1SPrashanth Swaminathan st_fields[4] = st_fields[16] = st_fields[28] = st_fields[40] = &ffi_type_uint32;
258*1fd5a2e1SPrashanth Swaminathan st_fields[5] = st_fields[17] = st_fields[29] = st_fields[41] = &ffi_type_sint32;
259*1fd5a2e1SPrashanth Swaminathan st_fields[6] = st_fields[18] = st_fields[30] = st_fields[42] = &ffi_type_uint64;
260*1fd5a2e1SPrashanth Swaminathan st_fields[7] = st_fields[19] = st_fields[31] = st_fields[43] = &ffi_type_sint64;
261*1fd5a2e1SPrashanth Swaminathan st_fields[8] = st_fields[20] = st_fields[32] = st_fields[44] = &ffi_type_float;
262*1fd5a2e1SPrashanth Swaminathan st_fields[9] = st_fields[21] = st_fields[33] = st_fields[45] = &ffi_type_double;
263*1fd5a2e1SPrashanth Swaminathan st_fields[10] = st_fields[22] = st_fields[34] = st_fields[46] = &ffi_type_longdouble;
264*1fd5a2e1SPrashanth Swaminathan st_fields[11] = st_fields[23] = st_fields[35] = st_fields[47] = &ffi_type_pointer;
265*1fd5a2e1SPrashanth Swaminathan
266*1fd5a2e1SPrashanth Swaminathan st_fields[50] = NULL;
267*1fd5a2e1SPrashanth Swaminathan
268*1fd5a2e1SPrashanth Swaminathan argTypes[0] = argTypes[12] = argTypes[24] = argTypes[36] = argTypes[48] = &ffi_type_uint8;
269*1fd5a2e1SPrashanth Swaminathan argValues[0] = argValues[12] = argValues[24] = argValues[36] = argValues[48] = &ui8;
270*1fd5a2e1SPrashanth Swaminathan argTypes[1] = argTypes[13] = argTypes[25] = argTypes[37] = argTypes[49] = &ffi_type_sint8;
271*1fd5a2e1SPrashanth Swaminathan argValues[1] = argValues[13] = argValues[25] = argValues[37] = argValues[49] = &si8;
272*1fd5a2e1SPrashanth Swaminathan argTypes[2] = argTypes[14] = argTypes[26] = argTypes[38] = &ffi_type_uint16;
273*1fd5a2e1SPrashanth Swaminathan argValues[2] = argValues[14] = argValues[26] = argValues[38] = &ui16;
274*1fd5a2e1SPrashanth Swaminathan argTypes[3] = argTypes[15] = argTypes[27] = argTypes[39] = &ffi_type_sint16;
275*1fd5a2e1SPrashanth Swaminathan argValues[3] = argValues[15] = argValues[27] = argValues[39] = &si16;
276*1fd5a2e1SPrashanth Swaminathan argTypes[4] = argTypes[16] = argTypes[28] = argTypes[40] = &ffi_type_uint32;
277*1fd5a2e1SPrashanth Swaminathan argValues[4] = argValues[16] = argValues[28] = argValues[40] = &ui32;
278*1fd5a2e1SPrashanth Swaminathan argTypes[5] = argTypes[17] = argTypes[29] = argTypes[41] = &ffi_type_sint32;
279*1fd5a2e1SPrashanth Swaminathan argValues[5] = argValues[17] = argValues[29] = argValues[41] = &si32;
280*1fd5a2e1SPrashanth Swaminathan argTypes[6] = argTypes[18] = argTypes[30] = argTypes[42] = &ffi_type_uint64;
281*1fd5a2e1SPrashanth Swaminathan argValues[6] = argValues[18] = argValues[30] = argValues[42] = &ui64;
282*1fd5a2e1SPrashanth Swaminathan argTypes[7] = argTypes[19] = argTypes[31] = argTypes[43] = &ffi_type_sint64;
283*1fd5a2e1SPrashanth Swaminathan argValues[7] = argValues[19] = argValues[31] = argValues[43] = &si64;
284*1fd5a2e1SPrashanth Swaminathan argTypes[8] = argTypes[20] = argTypes[32] = argTypes[44] = &ffi_type_float;
285*1fd5a2e1SPrashanth Swaminathan argValues[8] = argValues[20] = argValues[32] = argValues[44] = &f;
286*1fd5a2e1SPrashanth Swaminathan argTypes[9] = argTypes[21] = argTypes[33] = argTypes[45] = &ffi_type_double;
287*1fd5a2e1SPrashanth Swaminathan argValues[9] = argValues[21] = argValues[33] = argValues[45] = &d;
288*1fd5a2e1SPrashanth Swaminathan argTypes[10] = argTypes[22] = argTypes[34] = argTypes[46] = &ffi_type_longdouble;
289*1fd5a2e1SPrashanth Swaminathan argValues[10] = argValues[22] = argValues[34] = argValues[46] = &ld;
290*1fd5a2e1SPrashanth Swaminathan argTypes[11] = argTypes[23] = argTypes[35] = argTypes[47] = &ffi_type_pointer;
291*1fd5a2e1SPrashanth Swaminathan argValues[11] = argValues[23] = argValues[35] = argValues[47] = &p;
292*1fd5a2e1SPrashanth Swaminathan
293*1fd5a2e1SPrashanth Swaminathan argTypes[50] = NULL;
294*1fd5a2e1SPrashanth Swaminathan argValues[50] = NULL;
295*1fd5a2e1SPrashanth Swaminathan
296*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK);
297*1fd5a2e1SPrashanth Swaminathan
298*1fd5a2e1SPrashanth Swaminathan ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues);
299*1fd5a2e1SPrashanth Swaminathan /* { 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" } */
300*1fd5a2e1SPrashanth Swaminathan printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
301*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
302*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
303*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
304*1fd5a2e1SPrashanth Swaminathan retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
305*1fd5a2e1SPrashanth Swaminathan retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
306*1fd5a2e1SPrashanth Swaminathan retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
307*1fd5a2e1SPrashanth Swaminathan retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
308*1fd5a2e1SPrashanth Swaminathan retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
309*1fd5a2e1SPrashanth Swaminathan retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
310*1fd5a2e1SPrashanth Swaminathan retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
311*1fd5a2e1SPrashanth Swaminathan retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
312*1fd5a2e1SPrashanth Swaminathan /* { 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" } */
313*1fd5a2e1SPrashanth Swaminathan
314*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK);
315*1fd5a2e1SPrashanth Swaminathan
316*1fd5a2e1SPrashanth Swaminathan retVal = ((BigStruct(*)(
317*1fd5a2e1SPrashanth Swaminathan uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
318*1fd5a2e1SPrashanth Swaminathan uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
319*1fd5a2e1SPrashanth Swaminathan uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
320*1fd5a2e1SPrashanth Swaminathan uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
321*1fd5a2e1SPrashanth Swaminathan uint8_t, int8_t))(code))(
322*1fd5a2e1SPrashanth Swaminathan ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
323*1fd5a2e1SPrashanth Swaminathan ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
324*1fd5a2e1SPrashanth Swaminathan ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
325*1fd5a2e1SPrashanth Swaminathan ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
326*1fd5a2e1SPrashanth Swaminathan ui8, si8);
327*1fd5a2e1SPrashanth Swaminathan /* { 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" } */
328*1fd5a2e1SPrashanth Swaminathan printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
329*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
330*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
331*1fd5a2e1SPrashanth Swaminathan "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
332*1fd5a2e1SPrashanth Swaminathan retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
333*1fd5a2e1SPrashanth Swaminathan retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
334*1fd5a2e1SPrashanth Swaminathan retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
335*1fd5a2e1SPrashanth Swaminathan retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
336*1fd5a2e1SPrashanth Swaminathan retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
337*1fd5a2e1SPrashanth Swaminathan retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
338*1fd5a2e1SPrashanth Swaminathan retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
339*1fd5a2e1SPrashanth Swaminathan retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
340*1fd5a2e1SPrashanth Swaminathan /* { 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" } */
341*1fd5a2e1SPrashanth Swaminathan
342*1fd5a2e1SPrashanth Swaminathan return 0;
343*1fd5a2e1SPrashanth Swaminathan }
344