ยปCore Development>Code coverage>Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c

Python code coverage for Modules/_ctypes/libffi/testsuite/libffi.call/va_1.c

#countcontent
1n/a/* Area: ffi_call
2n/a Purpose: Test passing struct in variable argument lists.
3n/a Limitations: none.
4n/a PR: none.
5n/a Originator: ARM Ltd. */
6n/a
7n/a/* { dg-do run } */
8n/a/* { dg-output "" { xfail avr32*-*-* } } */
9n/a
10n/a#include "ffitest.h"
11n/a#include <stdarg.h>
12n/a
13n/astruct small_tag
14n/a{
15n/a unsigned char a;
16n/a unsigned char b;
17n/a};
18n/a
19n/astruct large_tag
20n/a{
21n/a unsigned a;
22n/a unsigned b;
23n/a unsigned c;
24n/a unsigned d;
25n/a unsigned e;
26n/a};
27n/a
28n/astatic int
29n/atest_fn (int n, ...)
30n/a{
31n/a va_list ap;
32n/a struct small_tag s1;
33n/a struct small_tag s2;
34n/a struct large_tag l;
35n/a unsigned char uc;
36n/a signed char sc;
37n/a unsigned short us;
38n/a signed short ss;
39n/a unsigned int ui;
40n/a signed int si;
41n/a unsigned long ul;
42n/a signed long sl;
43n/a float f;
44n/a double d;
45n/a
46n/a va_start (ap, n);
47n/a s1 = va_arg (ap, struct small_tag);
48n/a l = va_arg (ap, struct large_tag);
49n/a s2 = va_arg (ap, struct small_tag);
50n/a
51n/a uc = va_arg (ap, unsigned);
52n/a sc = va_arg (ap, signed);
53n/a
54n/a us = va_arg (ap, unsigned);
55n/a ss = va_arg (ap, signed);
56n/a
57n/a ui = va_arg (ap, unsigned int);
58n/a si = va_arg (ap, signed int);
59n/a
60n/a ul = va_arg (ap, unsigned long);
61n/a sl = va_arg (ap, signed long);
62n/a
63n/a f = va_arg (ap, double); /* C standard promotes float->double
64n/a when anonymous */
65n/a d = va_arg (ap, double);
66n/a
67n/a printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n",
68n/a s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
69n/a s2.a, s2.b,
70n/a uc, sc,
71n/a us, ss,
72n/a ui, si,
73n/a ul, sl,
74n/a f, d);
75n/a va_end (ap);
76n/a return n + 1;
77n/a}
78n/a
79n/aint
80n/amain (void)
81n/a{
82n/a ffi_cif cif;
83n/a void* args[15];
84n/a ffi_type* arg_types[15];
85n/a
86n/a ffi_type s_type;
87n/a ffi_type *s_type_elements[3];
88n/a
89n/a ffi_type l_type;
90n/a ffi_type *l_type_elements[6];
91n/a
92n/a struct small_tag s1;
93n/a struct small_tag s2;
94n/a struct large_tag l1;
95n/a
96n/a int n;
97n/a ffi_arg res;
98n/a
99n/a unsigned char uc;
100n/a signed char sc;
101n/a unsigned short us;
102n/a signed short ss;
103n/a unsigned int ui;
104n/a signed int si;
105n/a unsigned long ul;
106n/a signed long sl;
107n/a double d1;
108n/a double f1;
109n/a
110n/a s_type.size = 0;
111n/a s_type.alignment = 0;
112n/a s_type.type = FFI_TYPE_STRUCT;
113n/a s_type.elements = s_type_elements;
114n/a
115n/a s_type_elements[0] = &ffi_type_uchar;
116n/a s_type_elements[1] = &ffi_type_uchar;
117n/a s_type_elements[2] = NULL;
118n/a
119n/a l_type.size = 0;
120n/a l_type.alignment = 0;
121n/a l_type.type = FFI_TYPE_STRUCT;
122n/a l_type.elements = l_type_elements;
123n/a
124n/a l_type_elements[0] = &ffi_type_uint;
125n/a l_type_elements[1] = &ffi_type_uint;
126n/a l_type_elements[2] = &ffi_type_uint;
127n/a l_type_elements[3] = &ffi_type_uint;
128n/a l_type_elements[4] = &ffi_type_uint;
129n/a l_type_elements[5] = NULL;
130n/a
131n/a arg_types[0] = &ffi_type_sint;
132n/a arg_types[1] = &s_type;
133n/a arg_types[2] = &l_type;
134n/a arg_types[3] = &s_type;
135n/a arg_types[4] = &ffi_type_uchar;
136n/a arg_types[5] = &ffi_type_schar;
137n/a arg_types[6] = &ffi_type_ushort;
138n/a arg_types[7] = &ffi_type_sshort;
139n/a arg_types[8] = &ffi_type_uint;
140n/a arg_types[9] = &ffi_type_sint;
141n/a arg_types[10] = &ffi_type_ulong;
142n/a arg_types[11] = &ffi_type_slong;
143n/a arg_types[12] = &ffi_type_double;
144n/a arg_types[13] = &ffi_type_double;
145n/a arg_types[14] = NULL;
146n/a
147n/a CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK);
148n/a
149n/a s1.a = 5;
150n/a s1.b = 6;
151n/a
152n/a l1.a = 10;
153n/a l1.b = 11;
154n/a l1.c = 12;
155n/a l1.d = 13;
156n/a l1.e = 14;
157n/a
158n/a s2.a = 7;
159n/a s2.b = 8;
160n/a
161n/a n = 41;
162n/a
163n/a uc = 9;
164n/a sc = 10;
165n/a us = 11;
166n/a ss = 12;
167n/a ui = 13;
168n/a si = 14;
169n/a ul = 15;
170n/a sl = 16;
171n/a f1 = 2.12;
172n/a d1 = 3.13;
173n/a
174n/a args[0] = &n;
175n/a args[1] = &s1;
176n/a args[2] = &l1;
177n/a args[3] = &s2;
178n/a args[4] = &uc;
179n/a args[5] = &sc;
180n/a args[6] = &us;
181n/a args[7] = &ss;
182n/a args[8] = &ui;
183n/a args[9] = &si;
184n/a args[10] = &ul;
185n/a args[11] = &sl;
186n/a args[12] = &f1;
187n/a args[13] = &d1;
188n/a args[14] = NULL;
189n/a
190n/a ffi_call(&cif, FFI_FN(test_fn), &res, args);
191n/a /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */
192n/a printf("res: %d\n", (int) res);
193n/a /* { dg-output "\nres: 42" } */
194n/a
195n/a return 0;
196n/a}