ยปCore Development>Code coverage>Modules/_ctypes/libffi/src/m32r/ffi.c

Python code coverage for Modules/_ctypes/libffi/src/m32r/ffi.c

#countcontent
1n/a/* -----------------------------------------------------------------------
2n/a ffi.c - Copyright (c) 2004 Renesas Technology
3n/a Copyright (c) 2008 Red Hat, Inc.
4n/a
5n/a M32R Foreign Function Interface
6n/a
7n/a Permission is hereby granted, free of charge, to any person obtaining
8n/a a copy of this software and associated documentation files (the
9n/a ``Software''), to deal in the Software without restriction, including
10n/a without limitation the rights to use, copy, modify, merge, publish,
11n/a distribute, sublicense, and/or sell copies of the Software, and to
12n/a permit persons to whom the Software is furnished to do so, subject to
13n/a the following conditions:
14n/a
15n/a The above copyright notice and this permission notice shall be included
16n/a in all copies or substantial portions of the Software.
17n/a
18n/a THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
19n/a OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20n/a MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21n/a IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
22n/a OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23n/a ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24n/a OTHER DEALINGS IN THE SOFTWARE.
25n/a ----------------------------------------------------------------------- */
26n/a
27n/a#include <ffi.h>
28n/a#include <ffi_common.h>
29n/a
30n/a#include <stdlib.h>
31n/a
32n/a/* ffi_prep_args is called by the assembly routine once stack
33n/a space has been allocated for the function's arguments. */
34n/a
35n/avoid ffi_prep_args(char *stack, extended_cif *ecif)
36n/a{
37n/a unsigned int i;
38n/a int tmp;
39n/a unsigned int avn;
40n/a void **p_argv;
41n/a char *argp;
42n/a ffi_type **p_arg;
43n/a
44n/a tmp = 0;
45n/a argp = stack;
46n/a
47n/a if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8)
48n/a {
49n/a *(void **) argp = ecif->rvalue;
50n/a argp += 4;
51n/a }
52n/a
53n/a avn = ecif->cif->nargs;
54n/a p_argv = ecif->avalue;
55n/a
56n/a for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
57n/a (i != 0) && (avn != 0);
58n/a i--, p_arg++)
59n/a {
60n/a size_t z;
61n/a
62n/a /* Align if necessary. */
63n/a if (((*p_arg)->alignment - 1) & (unsigned) argp)
64n/a argp = (char *) ALIGN (argp, (*p_arg)->alignment);
65n/a
66n/a if (avn != 0)
67n/a {
68n/a avn--;
69n/a z = (*p_arg)->size;
70n/a if (z < sizeof (int))
71n/a {
72n/a z = sizeof (int);
73n/a
74n/a switch ((*p_arg)->type)
75n/a {
76n/a case FFI_TYPE_SINT8:
77n/a *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
78n/a break;
79n/a
80n/a case FFI_TYPE_UINT8:
81n/a *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
82n/a break;
83n/a
84n/a case FFI_TYPE_SINT16:
85n/a *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
86n/a break;
87n/a
88n/a case FFI_TYPE_UINT16:
89n/a *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
90n/a break;
91n/a
92n/a case FFI_TYPE_STRUCT:
93n/a z = (*p_arg)->size;
94n/a if ((*p_arg)->alignment != 1)
95n/a memcpy (argp, *p_argv, z);
96n/a else
97n/a memcpy (argp + 4 - z, *p_argv, z);
98n/a z = sizeof (int);
99n/a break;
100n/a
101n/a default:
102n/a FFI_ASSERT(0);
103n/a }
104n/a }
105n/a else if (z == sizeof (int))
106n/a {
107n/a *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
108n/a }
109n/a else
110n/a {
111n/a if ((*p_arg)->type == FFI_TYPE_STRUCT)
112n/a {
113n/a if (z > 8)
114n/a {
115n/a *(unsigned int *) argp = (unsigned int)(void *)(* p_argv);
116n/a z = sizeof(void *);
117n/a }
118n/a else
119n/a {
120n/a memcpy(argp, *p_argv, z);
121n/a z = 8;
122n/a }
123n/a }
124n/a else
125n/a {
126n/a /* Double or long long 64bit. */
127n/a memcpy (argp, *p_argv, z);
128n/a }
129n/a }
130n/a p_argv++;
131n/a argp += z;
132n/a }
133n/a }
134n/a
135n/a return;
136n/a}
137n/a
138n/a/* Perform machine dependent cif processing. */
139n/affi_status
140n/affi_prep_cif_machdep(ffi_cif *cif)
141n/a{
142n/a /* Set the return type flag. */
143n/a switch (cif->rtype->type)
144n/a {
145n/a case FFI_TYPE_VOID:
146n/a cif->flags = (unsigned) cif->rtype->type;
147n/a break;
148n/a
149n/a case FFI_TYPE_STRUCT:
150n/a if (cif->rtype->size <= 4)
151n/a cif->flags = FFI_TYPE_INT;
152n/a
153n/a else if (cif->rtype->size <= 8)
154n/a cif->flags = FFI_TYPE_DOUBLE;
155n/a
156n/a else
157n/a cif->flags = (unsigned) cif->rtype->type;
158n/a break;
159n/a
160n/a case FFI_TYPE_SINT64:
161n/a case FFI_TYPE_UINT64:
162n/a case FFI_TYPE_DOUBLE:
163n/a cif->flags = FFI_TYPE_DOUBLE;
164n/a break;
165n/a
166n/a case FFI_TYPE_FLOAT:
167n/a default:
168n/a cif->flags = FFI_TYPE_INT;
169n/a break;
170n/a }
171n/a
172n/a return FFI_OK;
173n/a}
174n/a
175n/aextern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
176n/a unsigned, unsigned, unsigned *, void (*fn)(void));
177n/a
178n/avoid ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
179n/a{
180n/a extended_cif ecif;
181n/a
182n/a ecif.cif = cif;
183n/a ecif.avalue = avalue;
184n/a
185n/a /* If the return value is a struct and we don't have
186n/a a return value address then we need to make one. */
187n/a if ((rvalue == NULL) &&
188n/a (cif->rtype->type == FFI_TYPE_STRUCT))
189n/a {
190n/a ecif.rvalue = alloca (cif->rtype->size);
191n/a }
192n/a else
193n/a ecif.rvalue = rvalue;
194n/a
195n/a switch (cif->abi)
196n/a {
197n/a case FFI_SYSV:
198n/a ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
199n/a cif->flags, ecif.rvalue, fn);
200n/a if (cif->rtype->type == FFI_TYPE_STRUCT)
201n/a {
202n/a int size = cif->rtype->size;
203n/a int align = cif->rtype->alignment;
204n/a
205n/a if (size < 4)
206n/a {
207n/a if (align == 1)
208n/a *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8;
209n/a }
210n/a else if (4 < size && size < 8)
211n/a {
212n/a if (align == 1)
213n/a {
214n/a memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
215n/a }
216n/a else if (align == 2)
217n/a {
218n/a if (size & 1)
219n/a size += 1;
220n/a
221n/a if (size != 8)
222n/a memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
223n/a }
224n/a }
225n/a }
226n/a break;
227n/a
228n/a default:
229n/a FFI_ASSERT(0);
230n/a break;
231n/a }
232n/a}