1*1fd5a2e1SPrashanth Swaminathan /* Area: ffi_call
2*1fd5a2e1SPrashanth Swaminathan Purpose: Check different structures.
3*1fd5a2e1SPrashanth Swaminathan Limitations: none.
4*1fd5a2e1SPrashanth Swaminathan PR: none.
5*1fd5a2e1SPrashanth Swaminathan Originator: Ronald Oussoren <[email protected]> 20030824 */
6*1fd5a2e1SPrashanth Swaminathan
7*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
8*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
9*1fd5a2e1SPrashanth Swaminathan
10*1fd5a2e1SPrashanth Swaminathan typedef struct Point {
11*1fd5a2e1SPrashanth Swaminathan float x;
12*1fd5a2e1SPrashanth Swaminathan float y;
13*1fd5a2e1SPrashanth Swaminathan } Point;
14*1fd5a2e1SPrashanth Swaminathan
15*1fd5a2e1SPrashanth Swaminathan typedef struct Size {
16*1fd5a2e1SPrashanth Swaminathan float h;
17*1fd5a2e1SPrashanth Swaminathan float w;
18*1fd5a2e1SPrashanth Swaminathan } Size;
19*1fd5a2e1SPrashanth Swaminathan
20*1fd5a2e1SPrashanth Swaminathan typedef struct Rect {
21*1fd5a2e1SPrashanth Swaminathan Point o;
22*1fd5a2e1SPrashanth Swaminathan Size s;
23*1fd5a2e1SPrashanth Swaminathan } Rect;
24*1fd5a2e1SPrashanth Swaminathan
doit(int o,char * s,Point p,Rect r,int last)25*1fd5a2e1SPrashanth Swaminathan int doit(int o, char* s, Point p, Rect r, int last)
26*1fd5a2e1SPrashanth Swaminathan {
27*1fd5a2e1SPrashanth Swaminathan printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
28*1fd5a2e1SPrashanth Swaminathan o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last);
29*1fd5a2e1SPrashanth Swaminathan return 42;
30*1fd5a2e1SPrashanth Swaminathan }
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan
main(void)33*1fd5a2e1SPrashanth Swaminathan int main(void)
34*1fd5a2e1SPrashanth Swaminathan {
35*1fd5a2e1SPrashanth Swaminathan ffi_type point_type;
36*1fd5a2e1SPrashanth Swaminathan ffi_type size_type;
37*1fd5a2e1SPrashanth Swaminathan ffi_type rect_type;
38*1fd5a2e1SPrashanth Swaminathan ffi_cif cif;
39*1fd5a2e1SPrashanth Swaminathan ffi_type* arglist[6];
40*1fd5a2e1SPrashanth Swaminathan void* values[6];
41*1fd5a2e1SPrashanth Swaminathan int r;
42*1fd5a2e1SPrashanth Swaminathan
43*1fd5a2e1SPrashanth Swaminathan /*
44*1fd5a2e1SPrashanth Swaminathan * First set up FFI types for the 3 struct types
45*1fd5a2e1SPrashanth Swaminathan */
46*1fd5a2e1SPrashanth Swaminathan
47*1fd5a2e1SPrashanth Swaminathan point_type.size = 0; /*sizeof(Point);*/
48*1fd5a2e1SPrashanth Swaminathan point_type.alignment = 0; /*__alignof__(Point);*/
49*1fd5a2e1SPrashanth Swaminathan point_type.type = FFI_TYPE_STRUCT;
50*1fd5a2e1SPrashanth Swaminathan point_type.elements = malloc(3 * sizeof(ffi_type*));
51*1fd5a2e1SPrashanth Swaminathan point_type.elements[0] = &ffi_type_float;
52*1fd5a2e1SPrashanth Swaminathan point_type.elements[1] = &ffi_type_float;
53*1fd5a2e1SPrashanth Swaminathan point_type.elements[2] = NULL;
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan size_type.size = 0;/* sizeof(Size);*/
56*1fd5a2e1SPrashanth Swaminathan size_type.alignment = 0;/* __alignof__(Size);*/
57*1fd5a2e1SPrashanth Swaminathan size_type.type = FFI_TYPE_STRUCT;
58*1fd5a2e1SPrashanth Swaminathan size_type.elements = malloc(3 * sizeof(ffi_type*));
59*1fd5a2e1SPrashanth Swaminathan size_type.elements[0] = &ffi_type_float;
60*1fd5a2e1SPrashanth Swaminathan size_type.elements[1] = &ffi_type_float;
61*1fd5a2e1SPrashanth Swaminathan size_type.elements[2] = NULL;
62*1fd5a2e1SPrashanth Swaminathan
63*1fd5a2e1SPrashanth Swaminathan rect_type.size = 0;/*sizeof(Rect);*/
64*1fd5a2e1SPrashanth Swaminathan rect_type.alignment =0;/* __alignof__(Rect);*/
65*1fd5a2e1SPrashanth Swaminathan rect_type.type = FFI_TYPE_STRUCT;
66*1fd5a2e1SPrashanth Swaminathan rect_type.elements = malloc(3 * sizeof(ffi_type*));
67*1fd5a2e1SPrashanth Swaminathan rect_type.elements[0] = &point_type;
68*1fd5a2e1SPrashanth Swaminathan rect_type.elements[1] = &size_type;
69*1fd5a2e1SPrashanth Swaminathan rect_type.elements[2] = NULL;
70*1fd5a2e1SPrashanth Swaminathan
71*1fd5a2e1SPrashanth Swaminathan /*
72*1fd5a2e1SPrashanth Swaminathan * Create a CIF
73*1fd5a2e1SPrashanth Swaminathan */
74*1fd5a2e1SPrashanth Swaminathan arglist[0] = &ffi_type_sint;
75*1fd5a2e1SPrashanth Swaminathan arglist[1] = &ffi_type_pointer;
76*1fd5a2e1SPrashanth Swaminathan arglist[2] = &point_type;
77*1fd5a2e1SPrashanth Swaminathan arglist[3] = &rect_type;
78*1fd5a2e1SPrashanth Swaminathan arglist[4] = &ffi_type_sint;
79*1fd5a2e1SPrashanth Swaminathan arglist[5] = NULL;
80*1fd5a2e1SPrashanth Swaminathan
81*1fd5a2e1SPrashanth Swaminathan r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
82*1fd5a2e1SPrashanth Swaminathan 5, &ffi_type_sint, arglist);
83*1fd5a2e1SPrashanth Swaminathan if (r != FFI_OK) {
84*1fd5a2e1SPrashanth Swaminathan abort();
85*1fd5a2e1SPrashanth Swaminathan }
86*1fd5a2e1SPrashanth Swaminathan
87*1fd5a2e1SPrashanth Swaminathan
88*1fd5a2e1SPrashanth Swaminathan /* And call the function through the CIF */
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth Swaminathan {
91*1fd5a2e1SPrashanth Swaminathan Point p = { 1.0, 2.0 };
92*1fd5a2e1SPrashanth Swaminathan Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } };
93*1fd5a2e1SPrashanth Swaminathan int o = 0;
94*1fd5a2e1SPrashanth Swaminathan int l = 42;
95*1fd5a2e1SPrashanth Swaminathan char* m = "myMethod";
96*1fd5a2e1SPrashanth Swaminathan ffi_arg result;
97*1fd5a2e1SPrashanth Swaminathan
98*1fd5a2e1SPrashanth Swaminathan values[0] = &o;
99*1fd5a2e1SPrashanth Swaminathan values[1] = &m;
100*1fd5a2e1SPrashanth Swaminathan values[2] = &p;
101*1fd5a2e1SPrashanth Swaminathan values[3] = &r;
102*1fd5a2e1SPrashanth Swaminathan values[4] = &l;
103*1fd5a2e1SPrashanth Swaminathan values[5] = NULL;
104*1fd5a2e1SPrashanth Swaminathan
105*1fd5a2e1SPrashanth Swaminathan printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
106*1fd5a2e1SPrashanth Swaminathan o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l);
107*1fd5a2e1SPrashanth Swaminathan
108*1fd5a2e1SPrashanth Swaminathan ffi_call(&cif, FFI_FN(doit), &result, values);
109*1fd5a2e1SPrashanth Swaminathan
110*1fd5a2e1SPrashanth Swaminathan printf ("The result is %d\n", (int)result);
111*1fd5a2e1SPrashanth Swaminathan
112*1fd5a2e1SPrashanth Swaminathan }
113*1fd5a2e1SPrashanth Swaminathan exit(0);
114*1fd5a2e1SPrashanth Swaminathan }
115