xref: /aosp_15_r20/external/libffi/testsuite/libffi.call/huge_struct.c (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
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