xref: /aosp_15_r20/external/libffi/testsuite/libffi.call/va_1.c (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* Area:		ffi_call
2*1fd5a2e1SPrashanth Swaminathan    Purpose:		Test passing struct in variable argument lists.
3*1fd5a2e1SPrashanth Swaminathan    Limitations:	none.
4*1fd5a2e1SPrashanth Swaminathan    PR:			none.
5*1fd5a2e1SPrashanth Swaminathan    Originator:	        ARM Ltd. */
6*1fd5a2e1SPrashanth Swaminathan 
7*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
8*1fd5a2e1SPrashanth Swaminathan /* { dg-output "" { xfail avr32*-*-* m68k-*-* alpha-*-* } } */
9*1fd5a2e1SPrashanth Swaminathan 
10*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
11*1fd5a2e1SPrashanth Swaminathan #include <stdarg.h>
12*1fd5a2e1SPrashanth Swaminathan 
13*1fd5a2e1SPrashanth Swaminathan struct small_tag
14*1fd5a2e1SPrashanth Swaminathan {
15*1fd5a2e1SPrashanth Swaminathan   unsigned char a;
16*1fd5a2e1SPrashanth Swaminathan   unsigned char b;
17*1fd5a2e1SPrashanth Swaminathan };
18*1fd5a2e1SPrashanth Swaminathan 
19*1fd5a2e1SPrashanth Swaminathan struct large_tag
20*1fd5a2e1SPrashanth Swaminathan {
21*1fd5a2e1SPrashanth Swaminathan   unsigned a;
22*1fd5a2e1SPrashanth Swaminathan   unsigned b;
23*1fd5a2e1SPrashanth Swaminathan   unsigned c;
24*1fd5a2e1SPrashanth Swaminathan   unsigned d;
25*1fd5a2e1SPrashanth Swaminathan   unsigned e;
26*1fd5a2e1SPrashanth Swaminathan };
27*1fd5a2e1SPrashanth Swaminathan 
28*1fd5a2e1SPrashanth Swaminathan static int
test_fn(int n,...)29*1fd5a2e1SPrashanth Swaminathan test_fn (int n, ...)
30*1fd5a2e1SPrashanth Swaminathan {
31*1fd5a2e1SPrashanth Swaminathan   va_list ap;
32*1fd5a2e1SPrashanth Swaminathan   struct small_tag s1;
33*1fd5a2e1SPrashanth Swaminathan   struct small_tag s2;
34*1fd5a2e1SPrashanth Swaminathan   struct large_tag l;
35*1fd5a2e1SPrashanth Swaminathan   unsigned char uc;
36*1fd5a2e1SPrashanth Swaminathan   signed char sc;
37*1fd5a2e1SPrashanth Swaminathan   unsigned short us;
38*1fd5a2e1SPrashanth Swaminathan   signed short ss;
39*1fd5a2e1SPrashanth Swaminathan   unsigned int ui;
40*1fd5a2e1SPrashanth Swaminathan   signed int si;
41*1fd5a2e1SPrashanth Swaminathan   unsigned long ul;
42*1fd5a2e1SPrashanth Swaminathan   signed long sl;
43*1fd5a2e1SPrashanth Swaminathan   float f;
44*1fd5a2e1SPrashanth Swaminathan   double d;
45*1fd5a2e1SPrashanth Swaminathan 
46*1fd5a2e1SPrashanth Swaminathan   va_start (ap, n);
47*1fd5a2e1SPrashanth Swaminathan   s1 = va_arg (ap, struct small_tag);
48*1fd5a2e1SPrashanth Swaminathan   l = va_arg (ap, struct large_tag);
49*1fd5a2e1SPrashanth Swaminathan   s2 = va_arg (ap, struct small_tag);
50*1fd5a2e1SPrashanth Swaminathan 
51*1fd5a2e1SPrashanth Swaminathan   uc = va_arg (ap, unsigned);
52*1fd5a2e1SPrashanth Swaminathan   sc = va_arg (ap, signed);
53*1fd5a2e1SPrashanth Swaminathan 
54*1fd5a2e1SPrashanth Swaminathan   us = va_arg (ap, unsigned);
55*1fd5a2e1SPrashanth Swaminathan   ss = va_arg (ap, signed);
56*1fd5a2e1SPrashanth Swaminathan 
57*1fd5a2e1SPrashanth Swaminathan   ui = va_arg (ap, unsigned int);
58*1fd5a2e1SPrashanth Swaminathan   si = va_arg (ap, signed int);
59*1fd5a2e1SPrashanth Swaminathan 
60*1fd5a2e1SPrashanth Swaminathan   ul = va_arg (ap, unsigned long);
61*1fd5a2e1SPrashanth Swaminathan   sl = va_arg (ap, signed long);
62*1fd5a2e1SPrashanth Swaminathan 
63*1fd5a2e1SPrashanth Swaminathan   f = va_arg (ap, double);	/* C standard promotes float->double
64*1fd5a2e1SPrashanth Swaminathan 				   when anonymous */
65*1fd5a2e1SPrashanth Swaminathan   d = va_arg (ap, double);
66*1fd5a2e1SPrashanth Swaminathan 
67*1fd5a2e1SPrashanth Swaminathan   printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n",
68*1fd5a2e1SPrashanth Swaminathan 	  s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
69*1fd5a2e1SPrashanth Swaminathan 	  s2.a, s2.b,
70*1fd5a2e1SPrashanth Swaminathan 	  uc, sc,
71*1fd5a2e1SPrashanth Swaminathan 	  us, ss,
72*1fd5a2e1SPrashanth Swaminathan 	  ui, si,
73*1fd5a2e1SPrashanth Swaminathan 	  ul, sl,
74*1fd5a2e1SPrashanth Swaminathan 	  f, d);
75*1fd5a2e1SPrashanth Swaminathan   va_end (ap);
76*1fd5a2e1SPrashanth Swaminathan   return n + 1;
77*1fd5a2e1SPrashanth Swaminathan }
78*1fd5a2e1SPrashanth Swaminathan 
79*1fd5a2e1SPrashanth Swaminathan int
main(void)80*1fd5a2e1SPrashanth Swaminathan main (void)
81*1fd5a2e1SPrashanth Swaminathan {
82*1fd5a2e1SPrashanth Swaminathan   ffi_cif cif;
83*1fd5a2e1SPrashanth Swaminathan   void* args[15];
84*1fd5a2e1SPrashanth Swaminathan   ffi_type* arg_types[15];
85*1fd5a2e1SPrashanth Swaminathan 
86*1fd5a2e1SPrashanth Swaminathan   ffi_type s_type;
87*1fd5a2e1SPrashanth Swaminathan   ffi_type *s_type_elements[3];
88*1fd5a2e1SPrashanth Swaminathan 
89*1fd5a2e1SPrashanth Swaminathan   ffi_type l_type;
90*1fd5a2e1SPrashanth Swaminathan   ffi_type *l_type_elements[6];
91*1fd5a2e1SPrashanth Swaminathan 
92*1fd5a2e1SPrashanth Swaminathan   struct small_tag s1;
93*1fd5a2e1SPrashanth Swaminathan   struct small_tag s2;
94*1fd5a2e1SPrashanth Swaminathan   struct large_tag l1;
95*1fd5a2e1SPrashanth Swaminathan 
96*1fd5a2e1SPrashanth Swaminathan   int n;
97*1fd5a2e1SPrashanth Swaminathan   ffi_arg res;
98*1fd5a2e1SPrashanth Swaminathan 
99*1fd5a2e1SPrashanth Swaminathan   unsigned char uc;
100*1fd5a2e1SPrashanth Swaminathan   signed char sc;
101*1fd5a2e1SPrashanth Swaminathan   unsigned short us;
102*1fd5a2e1SPrashanth Swaminathan   signed short ss;
103*1fd5a2e1SPrashanth Swaminathan   unsigned int ui;
104*1fd5a2e1SPrashanth Swaminathan   signed int si;
105*1fd5a2e1SPrashanth Swaminathan   unsigned long ul;
106*1fd5a2e1SPrashanth Swaminathan   signed long sl;
107*1fd5a2e1SPrashanth Swaminathan   double d1;
108*1fd5a2e1SPrashanth Swaminathan   double f1;
109*1fd5a2e1SPrashanth Swaminathan 
110*1fd5a2e1SPrashanth Swaminathan   s_type.size = 0;
111*1fd5a2e1SPrashanth Swaminathan   s_type.alignment = 0;
112*1fd5a2e1SPrashanth Swaminathan   s_type.type = FFI_TYPE_STRUCT;
113*1fd5a2e1SPrashanth Swaminathan   s_type.elements = s_type_elements;
114*1fd5a2e1SPrashanth Swaminathan 
115*1fd5a2e1SPrashanth Swaminathan   s_type_elements[0] = &ffi_type_uchar;
116*1fd5a2e1SPrashanth Swaminathan   s_type_elements[1] = &ffi_type_uchar;
117*1fd5a2e1SPrashanth Swaminathan   s_type_elements[2] = NULL;
118*1fd5a2e1SPrashanth Swaminathan 
119*1fd5a2e1SPrashanth Swaminathan   l_type.size = 0;
120*1fd5a2e1SPrashanth Swaminathan   l_type.alignment = 0;
121*1fd5a2e1SPrashanth Swaminathan   l_type.type = FFI_TYPE_STRUCT;
122*1fd5a2e1SPrashanth Swaminathan   l_type.elements = l_type_elements;
123*1fd5a2e1SPrashanth Swaminathan 
124*1fd5a2e1SPrashanth Swaminathan   l_type_elements[0] = &ffi_type_uint;
125*1fd5a2e1SPrashanth Swaminathan   l_type_elements[1] = &ffi_type_uint;
126*1fd5a2e1SPrashanth Swaminathan   l_type_elements[2] = &ffi_type_uint;
127*1fd5a2e1SPrashanth Swaminathan   l_type_elements[3] = &ffi_type_uint;
128*1fd5a2e1SPrashanth Swaminathan   l_type_elements[4] = &ffi_type_uint;
129*1fd5a2e1SPrashanth Swaminathan   l_type_elements[5] = NULL;
130*1fd5a2e1SPrashanth Swaminathan 
131*1fd5a2e1SPrashanth Swaminathan   arg_types[0] = &ffi_type_sint;
132*1fd5a2e1SPrashanth Swaminathan   arg_types[1] = &s_type;
133*1fd5a2e1SPrashanth Swaminathan   arg_types[2] = &l_type;
134*1fd5a2e1SPrashanth Swaminathan   arg_types[3] = &s_type;
135*1fd5a2e1SPrashanth Swaminathan   arg_types[4] = &ffi_type_uchar;
136*1fd5a2e1SPrashanth Swaminathan   arg_types[5] = &ffi_type_schar;
137*1fd5a2e1SPrashanth Swaminathan   arg_types[6] = &ffi_type_ushort;
138*1fd5a2e1SPrashanth Swaminathan   arg_types[7] = &ffi_type_sshort;
139*1fd5a2e1SPrashanth Swaminathan   arg_types[8] = &ffi_type_uint;
140*1fd5a2e1SPrashanth Swaminathan   arg_types[9] = &ffi_type_sint;
141*1fd5a2e1SPrashanth Swaminathan   arg_types[10] = &ffi_type_ulong;
142*1fd5a2e1SPrashanth Swaminathan   arg_types[11] = &ffi_type_slong;
143*1fd5a2e1SPrashanth Swaminathan   arg_types[12] = &ffi_type_double;
144*1fd5a2e1SPrashanth Swaminathan   arg_types[13] = &ffi_type_double;
145*1fd5a2e1SPrashanth Swaminathan   arg_types[14] = NULL;
146*1fd5a2e1SPrashanth Swaminathan 
147*1fd5a2e1SPrashanth Swaminathan   CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK);
148*1fd5a2e1SPrashanth Swaminathan 
149*1fd5a2e1SPrashanth Swaminathan   s1.a = 5;
150*1fd5a2e1SPrashanth Swaminathan   s1.b = 6;
151*1fd5a2e1SPrashanth Swaminathan 
152*1fd5a2e1SPrashanth Swaminathan   l1.a = 10;
153*1fd5a2e1SPrashanth Swaminathan   l1.b = 11;
154*1fd5a2e1SPrashanth Swaminathan   l1.c = 12;
155*1fd5a2e1SPrashanth Swaminathan   l1.d = 13;
156*1fd5a2e1SPrashanth Swaminathan   l1.e = 14;
157*1fd5a2e1SPrashanth Swaminathan 
158*1fd5a2e1SPrashanth Swaminathan   s2.a = 7;
159*1fd5a2e1SPrashanth Swaminathan   s2.b = 8;
160*1fd5a2e1SPrashanth Swaminathan 
161*1fd5a2e1SPrashanth Swaminathan   n = 41;
162*1fd5a2e1SPrashanth Swaminathan 
163*1fd5a2e1SPrashanth Swaminathan   uc = 9;
164*1fd5a2e1SPrashanth Swaminathan   sc = 10;
165*1fd5a2e1SPrashanth Swaminathan   us = 11;
166*1fd5a2e1SPrashanth Swaminathan   ss = 12;
167*1fd5a2e1SPrashanth Swaminathan   ui = 13;
168*1fd5a2e1SPrashanth Swaminathan   si = 14;
169*1fd5a2e1SPrashanth Swaminathan   ul = 15;
170*1fd5a2e1SPrashanth Swaminathan   sl = 16;
171*1fd5a2e1SPrashanth Swaminathan   f1 = 2.12;
172*1fd5a2e1SPrashanth Swaminathan   d1 = 3.13;
173*1fd5a2e1SPrashanth Swaminathan 
174*1fd5a2e1SPrashanth Swaminathan   args[0] = &n;
175*1fd5a2e1SPrashanth Swaminathan   args[1] = &s1;
176*1fd5a2e1SPrashanth Swaminathan   args[2] = &l1;
177*1fd5a2e1SPrashanth Swaminathan   args[3] = &s2;
178*1fd5a2e1SPrashanth Swaminathan   args[4] = &uc;
179*1fd5a2e1SPrashanth Swaminathan   args[5] = &sc;
180*1fd5a2e1SPrashanth Swaminathan   args[6] = &us;
181*1fd5a2e1SPrashanth Swaminathan   args[7] = &ss;
182*1fd5a2e1SPrashanth Swaminathan   args[8] = &ui;
183*1fd5a2e1SPrashanth Swaminathan   args[9] = &si;
184*1fd5a2e1SPrashanth Swaminathan   args[10] = &ul;
185*1fd5a2e1SPrashanth Swaminathan   args[11] = &sl;
186*1fd5a2e1SPrashanth Swaminathan   args[12] = &f1;
187*1fd5a2e1SPrashanth Swaminathan   args[13] = &d1;
188*1fd5a2e1SPrashanth Swaminathan   args[14] = NULL;
189*1fd5a2e1SPrashanth Swaminathan 
190*1fd5a2e1SPrashanth Swaminathan   ffi_call(&cif, FFI_FN(test_fn), &res, args);
191*1fd5a2e1SPrashanth Swaminathan   /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */
192*1fd5a2e1SPrashanth Swaminathan   printf("res: %d\n", (int) res);
193*1fd5a2e1SPrashanth Swaminathan   /* { dg-output "\nres: 42" } */
194*1fd5a2e1SPrashanth Swaminathan 
195*1fd5a2e1SPrashanth Swaminathan   return 0;
196*1fd5a2e1SPrashanth Swaminathan }
197