xref: /aosp_15_r20/external/libffi/testsuite/libffi.call/pr1172638.c (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* Area:	ffi_call
2*1fd5a2e1SPrashanth Swaminathan    Purpose:	Reproduce bug found in python ctypes
3*1fd5a2e1SPrashanth Swaminathan    Limitations:	none.
4*1fd5a2e1SPrashanth Swaminathan    PR:		Fedora 1174037  */
5*1fd5a2e1SPrashanth Swaminathan 
6*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
7*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
8*1fd5a2e1SPrashanth Swaminathan 
9*1fd5a2e1SPrashanth Swaminathan typedef struct {
10*1fd5a2e1SPrashanth Swaminathan   long x;
11*1fd5a2e1SPrashanth Swaminathan   long y;
12*1fd5a2e1SPrashanth Swaminathan } POINT;
13*1fd5a2e1SPrashanth Swaminathan 
14*1fd5a2e1SPrashanth Swaminathan typedef struct {
15*1fd5a2e1SPrashanth Swaminathan   long left;
16*1fd5a2e1SPrashanth Swaminathan   long top;
17*1fd5a2e1SPrashanth Swaminathan   long right;
18*1fd5a2e1SPrashanth Swaminathan   long bottom;
19*1fd5a2e1SPrashanth Swaminathan } RECT;
20*1fd5a2e1SPrashanth Swaminathan 
pr_test(int i __UNUSED__,RECT ar __UNUSED__,RECT * br __UNUSED__,POINT cp __UNUSED__,RECT dr __UNUSED__,RECT * er __UNUSED__,POINT fp,RECT gr __UNUSED__)21*1fd5a2e1SPrashanth Swaminathan static RECT ABI_ATTR pr_test(int i __UNUSED__, RECT ar __UNUSED__,
22*1fd5a2e1SPrashanth Swaminathan 			     RECT* br __UNUSED__, POINT cp __UNUSED__,
23*1fd5a2e1SPrashanth Swaminathan 			     RECT dr __UNUSED__, RECT *er __UNUSED__,
24*1fd5a2e1SPrashanth Swaminathan 			     POINT fp, RECT gr __UNUSED__)
25*1fd5a2e1SPrashanth Swaminathan {
26*1fd5a2e1SPrashanth Swaminathan   RECT result;
27*1fd5a2e1SPrashanth Swaminathan 
28*1fd5a2e1SPrashanth Swaminathan   result.left = fp.x;
29*1fd5a2e1SPrashanth Swaminathan   result.right = fp.y;
30*1fd5a2e1SPrashanth Swaminathan   result.top = fp.x;
31*1fd5a2e1SPrashanth Swaminathan   result.bottom = fp.y;
32*1fd5a2e1SPrashanth Swaminathan 
33*1fd5a2e1SPrashanth Swaminathan   return result;
34*1fd5a2e1SPrashanth Swaminathan }
35*1fd5a2e1SPrashanth Swaminathan 
main(void)36*1fd5a2e1SPrashanth Swaminathan int main (void)
37*1fd5a2e1SPrashanth Swaminathan {
38*1fd5a2e1SPrashanth Swaminathan   ffi_cif cif;
39*1fd5a2e1SPrashanth Swaminathan   ffi_type *args[MAX_ARGS];
40*1fd5a2e1SPrashanth Swaminathan   void *values[MAX_ARGS];
41*1fd5a2e1SPrashanth Swaminathan   ffi_type point_type, rect_type;
42*1fd5a2e1SPrashanth Swaminathan   ffi_type *point_type_elements[3];
43*1fd5a2e1SPrashanth Swaminathan   ffi_type *rect_type_elements[5];
44*1fd5a2e1SPrashanth Swaminathan 
45*1fd5a2e1SPrashanth Swaminathan   int i;
46*1fd5a2e1SPrashanth Swaminathan   POINT cp, fp;
47*1fd5a2e1SPrashanth Swaminathan   RECT ar, br, dr, er, gr;
48*1fd5a2e1SPrashanth Swaminathan   RECT *p1, *p2;
49*1fd5a2e1SPrashanth Swaminathan 
50*1fd5a2e1SPrashanth Swaminathan   /* This is a hack to get a properly aligned result buffer */
51*1fd5a2e1SPrashanth Swaminathan   RECT *rect_result =
52*1fd5a2e1SPrashanth Swaminathan     (RECT *) malloc (sizeof(RECT));
53*1fd5a2e1SPrashanth Swaminathan 
54*1fd5a2e1SPrashanth Swaminathan   point_type.size = 0;
55*1fd5a2e1SPrashanth Swaminathan   point_type.alignment = 0;
56*1fd5a2e1SPrashanth Swaminathan   point_type.type = FFI_TYPE_STRUCT;
57*1fd5a2e1SPrashanth Swaminathan   point_type.elements = point_type_elements;
58*1fd5a2e1SPrashanth Swaminathan   point_type_elements[0] = &ffi_type_slong;
59*1fd5a2e1SPrashanth Swaminathan   point_type_elements[1] = &ffi_type_slong;
60*1fd5a2e1SPrashanth Swaminathan   point_type_elements[2] = NULL;
61*1fd5a2e1SPrashanth Swaminathan 
62*1fd5a2e1SPrashanth Swaminathan   rect_type.size = 0;
63*1fd5a2e1SPrashanth Swaminathan   rect_type.alignment = 0;
64*1fd5a2e1SPrashanth Swaminathan   rect_type.type = FFI_TYPE_STRUCT;
65*1fd5a2e1SPrashanth Swaminathan   rect_type.elements = rect_type_elements;
66*1fd5a2e1SPrashanth Swaminathan   rect_type_elements[0] = &ffi_type_slong;
67*1fd5a2e1SPrashanth Swaminathan   rect_type_elements[1] = &ffi_type_slong;
68*1fd5a2e1SPrashanth Swaminathan   rect_type_elements[2] = &ffi_type_slong;
69*1fd5a2e1SPrashanth Swaminathan   rect_type_elements[3] = &ffi_type_slong;
70*1fd5a2e1SPrashanth Swaminathan   rect_type_elements[4] = NULL;
71*1fd5a2e1SPrashanth Swaminathan 
72*1fd5a2e1SPrashanth Swaminathan   args[0] = &ffi_type_sint;
73*1fd5a2e1SPrashanth Swaminathan   args[1] = &rect_type;
74*1fd5a2e1SPrashanth Swaminathan   args[2] = &ffi_type_pointer;
75*1fd5a2e1SPrashanth Swaminathan   args[3] = &point_type;
76*1fd5a2e1SPrashanth Swaminathan   args[4] = &rect_type;
77*1fd5a2e1SPrashanth Swaminathan   args[5] = &ffi_type_pointer;
78*1fd5a2e1SPrashanth Swaminathan   args[6] = &point_type;
79*1fd5a2e1SPrashanth Swaminathan   args[7] = &rect_type;
80*1fd5a2e1SPrashanth Swaminathan 
81*1fd5a2e1SPrashanth Swaminathan   /* Initialize the cif */
82*1fd5a2e1SPrashanth Swaminathan   CHECK(ffi_prep_cif(&cif, ABI_NUM, 8, &rect_type, args) == FFI_OK);
83*1fd5a2e1SPrashanth Swaminathan 
84*1fd5a2e1SPrashanth Swaminathan   i = 1;
85*1fd5a2e1SPrashanth Swaminathan   ar.left = 2;
86*1fd5a2e1SPrashanth Swaminathan   ar.right = 3;
87*1fd5a2e1SPrashanth Swaminathan   ar.top = 4;
88*1fd5a2e1SPrashanth Swaminathan   ar.bottom = 5;
89*1fd5a2e1SPrashanth Swaminathan   br.left = 6;
90*1fd5a2e1SPrashanth Swaminathan   br.right = 7;
91*1fd5a2e1SPrashanth Swaminathan   br.top = 8;
92*1fd5a2e1SPrashanth Swaminathan   br.bottom = 9;
93*1fd5a2e1SPrashanth Swaminathan   cp.x = 10;
94*1fd5a2e1SPrashanth Swaminathan   cp.y = 11;
95*1fd5a2e1SPrashanth Swaminathan   dr.left = 12;
96*1fd5a2e1SPrashanth Swaminathan   dr.right = 13;
97*1fd5a2e1SPrashanth Swaminathan   dr.top = 14;
98*1fd5a2e1SPrashanth Swaminathan   dr.bottom = 15;
99*1fd5a2e1SPrashanth Swaminathan   er.left = 16;
100*1fd5a2e1SPrashanth Swaminathan   er.right = 17;
101*1fd5a2e1SPrashanth Swaminathan   er.top = 18;
102*1fd5a2e1SPrashanth Swaminathan   er.bottom = 19;
103*1fd5a2e1SPrashanth Swaminathan   fp.x = 20;
104*1fd5a2e1SPrashanth Swaminathan   fp.y = 21;
105*1fd5a2e1SPrashanth Swaminathan   gr.left = 22;
106*1fd5a2e1SPrashanth Swaminathan   gr.right = 23;
107*1fd5a2e1SPrashanth Swaminathan   gr.top = 24;
108*1fd5a2e1SPrashanth Swaminathan   gr.bottom = 25;
109*1fd5a2e1SPrashanth Swaminathan 
110*1fd5a2e1SPrashanth Swaminathan   values[0] = &i;
111*1fd5a2e1SPrashanth Swaminathan   values[1] = &ar;
112*1fd5a2e1SPrashanth Swaminathan   p1 = &br;
113*1fd5a2e1SPrashanth Swaminathan   values[2] = &p1;
114*1fd5a2e1SPrashanth Swaminathan   values[3] = &cp;
115*1fd5a2e1SPrashanth Swaminathan   values[4] = &dr;
116*1fd5a2e1SPrashanth Swaminathan   p2 = &er;
117*1fd5a2e1SPrashanth Swaminathan   values[5] = &p2;
118*1fd5a2e1SPrashanth Swaminathan   values[6] = &fp;
119*1fd5a2e1SPrashanth Swaminathan   values[7] = &gr;
120*1fd5a2e1SPrashanth Swaminathan 
121*1fd5a2e1SPrashanth Swaminathan   ffi_call (&cif, FFI_FN(pr_test), rect_result, values);
122*1fd5a2e1SPrashanth Swaminathan 
123*1fd5a2e1SPrashanth Swaminathan   CHECK(rect_result->top == 20);
124*1fd5a2e1SPrashanth Swaminathan 
125*1fd5a2e1SPrashanth Swaminathan   free (rect_result);
126*1fd5a2e1SPrashanth Swaminathan   exit(0);
127*1fd5a2e1SPrashanth Swaminathan }
128