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