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

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

#countcontent
1n/a/* Area: ffi_call, closure_call
2n/a Purpose: Check pointer arguments across multiple hideous stack frames.
3n/a Limitations: none.
4n/a PR: none.
5n/a Originator: Blake Chaffin 6/7/2007 */
6n/a
7n/a/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
8n/a#include "ffitest.h"
9n/a
10n/astatic long dummyVar;
11n/a
12n/along dummy_func(
13n/a long double a1, char b1,
14n/a long double a2, char b2,
15n/a long double a3, char b3,
16n/a long double a4, char b4)
17n/a{
18n/a return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4;
19n/a}
20n/a
21n/avoid* cls_pointer_fn2(void* a1, void* a2)
22n/a{
23n/a long double trample1 = (intptr_t)a1 + (intptr_t)a2;
24n/a char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0];
25n/a long double trample3 = (intptr_t)trample1 + (intptr_t)a1;
26n/a char trample4 = trample2 + ((char*)&a1)[1];
27n/a long double trample5 = (intptr_t)trample3 + (intptr_t)a2;
28n/a char trample6 = trample4 + ((char*)&a2)[1];
29n/a long double trample7 = (intptr_t)trample5 + (intptr_t)trample1;
30n/a char trample8 = trample6 + trample2;
31n/a void* result;
32n/a
33n/a dummyVar = dummy_func(trample1, trample2, trample3, trample4,
34n/a trample5, trample6, trample7, trample8);
35n/a
36n/a result = (void*)((intptr_t)a1 + (intptr_t)a2);
37n/a
38n/a printf("0x%08x 0x%08x: 0x%08x\n",
39n/a (unsigned int)(uintptr_t) a1,
40n/a (unsigned int)(uintptr_t) a2,
41n/a (unsigned int)(uintptr_t) result);
42n/a
43n/a return result;
44n/a}
45n/a
46n/avoid* cls_pointer_fn1(void* a1, void* a2)
47n/a{
48n/a long double trample1 = (intptr_t)a1 + (intptr_t)a2;
49n/a char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0];
50n/a long double trample3 = (intptr_t)trample1 + (intptr_t)a1;
51n/a char trample4 = trample2 + ((char*)&a1)[1];
52n/a long double trample5 = (intptr_t)trample3 + (intptr_t)a2;
53n/a char trample6 = trample4 + ((char*)&a2)[1];
54n/a long double trample7 = (intptr_t)trample5 + (intptr_t)trample1;
55n/a char trample8 = trample6 + trample2;
56n/a void* result;
57n/a
58n/a dummyVar = dummy_func(trample1, trample2, trample3, trample4,
59n/a trample5, trample6, trample7, trample8);
60n/a
61n/a result = (void*)((intptr_t)a1 + (intptr_t)a2);
62n/a
63n/a printf("0x%08x 0x%08x: 0x%08x\n",
64n/a (unsigned int)(intptr_t) a1,
65n/a (unsigned int)(intptr_t) a2,
66n/a (unsigned int)(intptr_t) result);
67n/a
68n/a result = cls_pointer_fn2(result, a1);
69n/a
70n/a return result;
71n/a}
72n/a
73n/astatic void
74n/acls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp,
75n/a void** args, void* userdata __UNUSED__)
76n/a{
77n/a void* a1 = *(void**)(args[0]);
78n/a void* a2 = *(void**)(args[1]);
79n/a
80n/a long double trample1 = (intptr_t)a1 + (intptr_t)a2;
81n/a char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0];
82n/a long double trample3 = (intptr_t)trample1 + (intptr_t)a1;
83n/a char trample4 = trample2 + ((char*)&a1)[1];
84n/a long double trample5 = (intptr_t)trample3 + (intptr_t)a2;
85n/a char trample6 = trample4 + ((char*)&a2)[1];
86n/a long double trample7 = (intptr_t)trample5 + (intptr_t)trample1;
87n/a char trample8 = trample6 + trample2;
88n/a
89n/a dummyVar = dummy_func(trample1, trample2, trample3, trample4,
90n/a trample5, trample6, trample7, trample8);
91n/a
92n/a *(void**)resp = cls_pointer_fn1(a1, a2);
93n/a}
94n/a
95n/aint main (void)
96n/a{
97n/a ffi_cif cif;
98n/a void *code;
99n/a ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
100n/a void* args[3];
101n/a /* ffi_type cls_pointer_type; */
102n/a ffi_type* arg_types[3];
103n/a
104n/a/* cls_pointer_type.size = sizeof(void*);
105n/a cls_pointer_type.alignment = 0;
106n/a cls_pointer_type.type = FFI_TYPE_POINTER;
107n/a cls_pointer_type.elements = NULL;*/
108n/a
109n/a void* arg1 = (void*)0x01234567;
110n/a void* arg2 = (void*)0x89abcdef;
111n/a ffi_arg res = 0;
112n/a
113n/a arg_types[0] = &ffi_type_pointer;
114n/a arg_types[1] = &ffi_type_pointer;
115n/a arg_types[2] = NULL;
116n/a
117n/a CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
118n/a arg_types) == FFI_OK);
119n/a
120n/a args[0] = &arg1;
121n/a args[1] = &arg2;
122n/a args[2] = NULL;
123n/a
124n/a printf("\n");
125n/a ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args);
126n/a
127n/a printf("res: 0x%08x\n", (unsigned int) res);
128n/a /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
129n/a /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
130n/a /* { dg-output "\nres: 0x8bf258bd" } */
131n/a
132n/a CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
133n/a
134n/a res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
135n/a
136n/a printf("res: 0x%08x\n", (unsigned int) res);
137n/a /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
138n/a /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
139n/a /* { dg-output "\nres: 0x8bf258bd" } */
140n/a
141n/a exit(0);
142n/a}