1*1fd5a2e1SPrashanth Swaminathan /* Area: ffi_call, closure_call
2*1fd5a2e1SPrashanth Swaminathan Purpose: Test doubles passed in variable argument lists.
3*1fd5a2e1SPrashanth Swaminathan Limitations: none.
4*1fd5a2e1SPrashanth Swaminathan PR: none.
5*1fd5a2e1SPrashanth Swaminathan Originator: Blake Chaffin 6/6/2007 */
6*1fd5a2e1SPrashanth Swaminathan
7*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
8*1fd5a2e1SPrashanth Swaminathan /* { dg-output "" { xfail avr32*-*-* } } */
9*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
10*1fd5a2e1SPrashanth Swaminathan
11*1fd5a2e1SPrashanth Swaminathan struct small_tag
12*1fd5a2e1SPrashanth Swaminathan {
13*1fd5a2e1SPrashanth Swaminathan unsigned char a;
14*1fd5a2e1SPrashanth Swaminathan unsigned char b;
15*1fd5a2e1SPrashanth Swaminathan };
16*1fd5a2e1SPrashanth Swaminathan
17*1fd5a2e1SPrashanth Swaminathan struct large_tag
18*1fd5a2e1SPrashanth Swaminathan {
19*1fd5a2e1SPrashanth Swaminathan unsigned a;
20*1fd5a2e1SPrashanth Swaminathan unsigned b;
21*1fd5a2e1SPrashanth Swaminathan unsigned c;
22*1fd5a2e1SPrashanth Swaminathan unsigned d;
23*1fd5a2e1SPrashanth Swaminathan unsigned e;
24*1fd5a2e1SPrashanth Swaminathan };
25*1fd5a2e1SPrashanth Swaminathan
26*1fd5a2e1SPrashanth Swaminathan static void
test_fn(ffi_cif * cif __UNUSED__,void * resp,void ** args,void * userdata __UNUSED__)27*1fd5a2e1SPrashanth Swaminathan test_fn (ffi_cif* cif __UNUSED__, void* resp,
28*1fd5a2e1SPrashanth Swaminathan void** args, void* userdata __UNUSED__)
29*1fd5a2e1SPrashanth Swaminathan {
30*1fd5a2e1SPrashanth Swaminathan int n = *(int*)args[0];
31*1fd5a2e1SPrashanth Swaminathan struct small_tag s1 = * (struct small_tag *) args[1];
32*1fd5a2e1SPrashanth Swaminathan struct large_tag l1 = * (struct large_tag *) args[2];
33*1fd5a2e1SPrashanth Swaminathan struct small_tag s2 = * (struct small_tag *) args[3];
34*1fd5a2e1SPrashanth Swaminathan
35*1fd5a2e1SPrashanth Swaminathan printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b,
36*1fd5a2e1SPrashanth Swaminathan l1.a, l1.b, l1.c, l1.d, l1.e,
37*1fd5a2e1SPrashanth Swaminathan s2.a, s2.b);
38*1fd5a2e1SPrashanth Swaminathan * (ffi_arg*) resp = 42;
39*1fd5a2e1SPrashanth Swaminathan }
40*1fd5a2e1SPrashanth Swaminathan
41*1fd5a2e1SPrashanth Swaminathan int
main(void)42*1fd5a2e1SPrashanth Swaminathan main (void)
43*1fd5a2e1SPrashanth Swaminathan {
44*1fd5a2e1SPrashanth Swaminathan ffi_cif cif;
45*1fd5a2e1SPrashanth Swaminathan void *code;
46*1fd5a2e1SPrashanth Swaminathan ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code);
47*1fd5a2e1SPrashanth Swaminathan ffi_type* arg_types[5];
48*1fd5a2e1SPrashanth Swaminathan
49*1fd5a2e1SPrashanth Swaminathan ffi_arg res = 0;
50*1fd5a2e1SPrashanth Swaminathan
51*1fd5a2e1SPrashanth Swaminathan ffi_type s_type;
52*1fd5a2e1SPrashanth Swaminathan ffi_type *s_type_elements[3];
53*1fd5a2e1SPrashanth Swaminathan
54*1fd5a2e1SPrashanth Swaminathan ffi_type l_type;
55*1fd5a2e1SPrashanth Swaminathan ffi_type *l_type_elements[6];
56*1fd5a2e1SPrashanth Swaminathan
57*1fd5a2e1SPrashanth Swaminathan struct small_tag s1;
58*1fd5a2e1SPrashanth Swaminathan struct small_tag s2;
59*1fd5a2e1SPrashanth Swaminathan struct large_tag l1;
60*1fd5a2e1SPrashanth Swaminathan
61*1fd5a2e1SPrashanth Swaminathan int si;
62*1fd5a2e1SPrashanth Swaminathan
63*1fd5a2e1SPrashanth Swaminathan s_type.size = 0;
64*1fd5a2e1SPrashanth Swaminathan s_type.alignment = 0;
65*1fd5a2e1SPrashanth Swaminathan s_type.type = FFI_TYPE_STRUCT;
66*1fd5a2e1SPrashanth Swaminathan s_type.elements = s_type_elements;
67*1fd5a2e1SPrashanth Swaminathan
68*1fd5a2e1SPrashanth Swaminathan s_type_elements[0] = &ffi_type_uchar;
69*1fd5a2e1SPrashanth Swaminathan s_type_elements[1] = &ffi_type_uchar;
70*1fd5a2e1SPrashanth Swaminathan s_type_elements[2] = NULL;
71*1fd5a2e1SPrashanth Swaminathan
72*1fd5a2e1SPrashanth Swaminathan l_type.size = 0;
73*1fd5a2e1SPrashanth Swaminathan l_type.alignment = 0;
74*1fd5a2e1SPrashanth Swaminathan l_type.type = FFI_TYPE_STRUCT;
75*1fd5a2e1SPrashanth Swaminathan l_type.elements = l_type_elements;
76*1fd5a2e1SPrashanth Swaminathan
77*1fd5a2e1SPrashanth Swaminathan l_type_elements[0] = &ffi_type_uint;
78*1fd5a2e1SPrashanth Swaminathan l_type_elements[1] = &ffi_type_uint;
79*1fd5a2e1SPrashanth Swaminathan l_type_elements[2] = &ffi_type_uint;
80*1fd5a2e1SPrashanth Swaminathan l_type_elements[3] = &ffi_type_uint;
81*1fd5a2e1SPrashanth Swaminathan l_type_elements[4] = &ffi_type_uint;
82*1fd5a2e1SPrashanth Swaminathan l_type_elements[5] = NULL;
83*1fd5a2e1SPrashanth Swaminathan
84*1fd5a2e1SPrashanth Swaminathan arg_types[0] = &ffi_type_sint;
85*1fd5a2e1SPrashanth Swaminathan arg_types[1] = &s_type;
86*1fd5a2e1SPrashanth Swaminathan arg_types[2] = &l_type;
87*1fd5a2e1SPrashanth Swaminathan arg_types[3] = &s_type;
88*1fd5a2e1SPrashanth Swaminathan arg_types[4] = NULL;
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint,
91*1fd5a2e1SPrashanth Swaminathan arg_types) == FFI_OK);
92*1fd5a2e1SPrashanth Swaminathan
93*1fd5a2e1SPrashanth Swaminathan si = 4;
94*1fd5a2e1SPrashanth Swaminathan s1.a = 5;
95*1fd5a2e1SPrashanth Swaminathan s1.b = 6;
96*1fd5a2e1SPrashanth Swaminathan
97*1fd5a2e1SPrashanth Swaminathan s2.a = 20;
98*1fd5a2e1SPrashanth Swaminathan s2.b = 21;
99*1fd5a2e1SPrashanth Swaminathan
100*1fd5a2e1SPrashanth Swaminathan l1.a = 10;
101*1fd5a2e1SPrashanth Swaminathan l1.b = 11;
102*1fd5a2e1SPrashanth Swaminathan l1.c = 12;
103*1fd5a2e1SPrashanth Swaminathan l1.d = 13;
104*1fd5a2e1SPrashanth Swaminathan l1.e = 14;
105*1fd5a2e1SPrashanth Swaminathan
106*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK);
107*1fd5a2e1SPrashanth Swaminathan
108*1fd5a2e1SPrashanth Swaminathan res = ((int (*)(int, ...))(code))(si, s1, l1, s2);
109*1fd5a2e1SPrashanth Swaminathan /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */
110*1fd5a2e1SPrashanth Swaminathan printf("res: %d\n", (int) res);
111*1fd5a2e1SPrashanth Swaminathan /* { dg-output "\nres: 42" } */
112*1fd5a2e1SPrashanth Swaminathan
113*1fd5a2e1SPrashanth Swaminathan exit(0);
114*1fd5a2e1SPrashanth Swaminathan }
115