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