ยปCore Development>Code coverage>Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c

Python code coverage for Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c

#countcontent
1n/a/* -----------------------------------------------------------------------
2n/a ffi_darwin.c
3n/a
4n/a Copyright (C) 1998 Geoffrey Keating
5n/a Copyright (C) 2001 John Hornkvist
6n/a Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
7n/a
8n/a FFI support for Darwin and AIX.
9n/a
10n/a Permission is hereby granted, free of charge, to any person obtaining
11n/a a copy of this software and associated documentation files (the
12n/a ``Software''), to deal in the Software without restriction, including
13n/a without limitation the rights to use, copy, modify, merge, publish,
14n/a distribute, sublicense, and/or sell copies of the Software, and to
15n/a permit persons to whom the Software is furnished to do so, subject to
16n/a the following conditions:
17n/a
18n/a The above copyright notice and this permission notice shall be included
19n/a in all copies or substantial portions of the Software.
20n/a
21n/a THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
22n/a OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23n/a MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24n/a IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
25n/a OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26n/a ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27n/a OTHER DEALINGS IN THE SOFTWARE.
28n/a ----------------------------------------------------------------------- */
29n/a
30n/a#include <ffi.h>
31n/a#include <ffi_common.h>
32n/a
33n/a#include <stdlib.h>
34n/a
35n/aextern void ffi_closure_ASM (void);
36n/a
37n/aenum {
38n/a /* The assembly depends on these exact flags.
39n/a For Darwin64 (when FLAG_RETURNS_STRUCT is set):
40n/a FLAG_RETURNS_FP indicates that the structure embeds FP data.
41n/a FLAG_RETURNS_128BITS signals a special struct size that is not
42n/a expanded for float content. */
43n/a FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */
44n/a FLAG_RETURNS_NOTHING = 1 << (31-30),
45n/a FLAG_RETURNS_FP = 1 << (31-29),
46n/a FLAG_RETURNS_64BITS = 1 << (31-28),
47n/a
48n/a FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */
49n/a
50n/a FLAG_ARG_NEEDS_COPY = 1 << (31- 7),
51n/a FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
52n/a FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
53n/a FLAG_RETVAL_REFERENCE = 1 << (31- 4)
54n/a};
55n/a
56n/a/* About the DARWIN ABI. */
57n/aenum {
58n/a NUM_GPR_ARG_REGISTERS = 8,
59n/a NUM_FPR_ARG_REGISTERS = 13,
60n/a LINKAGE_AREA_GPRS = 6
61n/a};
62n/a
63n/aenum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */
64n/a
65n/a/* ffi_prep_args is called by the assembly routine once stack space
66n/a has been allocated for the function's arguments.
67n/a
68n/a m32/m64
69n/a
70n/a The stack layout we want looks like this:
71n/a
72n/a | Return address from ffi_call_DARWIN | higher addresses
73n/a |--------------------------------------------|
74n/a | Previous backchain pointer 4/8 | stack pointer here
75n/a |--------------------------------------------|<+ <<< on entry to
76n/a | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN
77n/a |--------------------------------------------| |
78n/a | When we have any FP activity... the | |
79n/a | FPRs occupy NUM_FPR_ARG_REGISTERS slots | |
80n/a | here fp13 .. fp1 from high to low addr. | |
81n/a ~ ~ ~
82n/a | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
83n/a |--------------------------------------------| |
84n/a | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
85n/a |--------------------------------------------| | stack |
86n/a | Reserved 2*4/8 | | grows |
87n/a |--------------------------------------------| | down V
88n/a | Space for callee's LR 4/8 | |
89n/a |--------------------------------------------| | lower addresses
90n/a | Saved CR [low word for m64] 4/8 | |
91n/a |--------------------------------------------| | stack pointer here
92n/a | Current backchain pointer 4/8 |-/ during
93n/a |--------------------------------------------| <<< ffi_call_DARWIN
94n/a
95n/a */
96n/a
97n/a#if defined(POWERPC_DARWIN64)
98n/astatic void
99n/adarwin64_pass_struct_by_value
100n/a (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **);
101n/a#endif
102n/a
103n/a/* This depends on GPR_SIZE = sizeof (unsigned long) */
104n/a
105n/avoid
106n/affi_prep_args (extended_cif *ecif, unsigned long *const stack)
107n/a{
108n/a const unsigned bytes = ecif->cif->bytes;
109n/a const unsigned flags = ecif->cif->flags;
110n/a const unsigned nargs = ecif->cif->nargs;
111n/a#if !defined(POWERPC_DARWIN64)
112n/a const ffi_abi abi = ecif->cif->abi;
113n/a#endif
114n/a
115n/a /* 'stacktop' points at the previous backchain pointer. */
116n/a unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long));
117n/a
118n/a /* 'fpr_base' points at the space for fpr1, and grows upwards as
119n/a we use FPR registers. */
120n/a double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS;
121n/a int gp_count = 0, fparg_count = 0;
122n/a
123n/a /* 'next_arg' grows up as we put parameters in it. */
124n/a unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */
125n/a
126n/a int i;
127n/a double double_tmp;
128n/a void **p_argv = ecif->avalue;
129n/a unsigned long gprvalue;
130n/a ffi_type** ptr = ecif->cif->arg_types;
131n/a#if !defined(POWERPC_DARWIN64)
132n/a char *dest_cpy;
133n/a#endif
134n/a unsigned size_al = 0;
135n/a
136n/a /* Check that everything starts aligned properly. */
137n/a FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0);
138n/a FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0);
139n/a FFI_ASSERT((bytes & 0xF) == 0);
140n/a
141n/a /* Deal with return values that are actually pass-by-reference.
142n/a Rule:
143n/a Return values are referenced by r3, so r4 is the first parameter. */
144n/a
145n/a if (flags & FLAG_RETVAL_REFERENCE)
146n/a *next_arg++ = (unsigned long) (char *) ecif->rvalue;
147n/a
148n/a /* Now for the arguments. */
149n/a for (i = nargs; i > 0; i--, ptr++, p_argv++)
150n/a {
151n/a switch ((*ptr)->type)
152n/a {
153n/a /* If a floating-point parameter appears before all of the general-
154n/a purpose registers are filled, the corresponding GPRs that match
155n/a the size of the floating-point parameter are skipped. */
156n/a case FFI_TYPE_FLOAT:
157n/a double_tmp = *(float *) *p_argv;
158n/a if (fparg_count < NUM_FPR_ARG_REGISTERS)
159n/a *fpr_base++ = double_tmp;
160n/a#if defined(POWERPC_DARWIN)
161n/a *(float *)next_arg = *(float *) *p_argv;
162n/a#else
163n/a *(double *)next_arg = double_tmp;
164n/a#endif
165n/a next_arg++;
166n/a gp_count++;
167n/a fparg_count++;
168n/a FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
169n/a break;
170n/a
171n/a case FFI_TYPE_DOUBLE:
172n/a double_tmp = *(double *) *p_argv;
173n/a if (fparg_count < NUM_FPR_ARG_REGISTERS)
174n/a *fpr_base++ = double_tmp;
175n/a *(double *)next_arg = double_tmp;
176n/a#ifdef POWERPC64
177n/a next_arg++;
178n/a gp_count++;
179n/a#else
180n/a next_arg += 2;
181n/a gp_count += 2;
182n/a#endif
183n/a fparg_count++;
184n/a FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
185n/a break;
186n/a
187n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
188n/a
189n/a case FFI_TYPE_LONGDOUBLE:
190n/a# if defined(POWERPC64) && !defined(POWERPC_DARWIN64)
191n/a /* ??? This will exceed the regs count when the value starts at fp13
192n/a and it will not put the extra bit on the stack. */
193n/a if (fparg_count < NUM_FPR_ARG_REGISTERS)
194n/a *(long double *) fpr_base++ = *(long double *) *p_argv;
195n/a else
196n/a *(long double *) next_arg = *(long double *) *p_argv;
197n/a next_arg += 2;
198n/a fparg_count += 2;
199n/a# else
200n/a double_tmp = ((double *) *p_argv)[0];
201n/a if (fparg_count < NUM_FPR_ARG_REGISTERS)
202n/a *fpr_base++ = double_tmp;
203n/a *(double *) next_arg = double_tmp;
204n/a# if defined(POWERPC_DARWIN64)
205n/a next_arg++;
206n/a gp_count++;
207n/a# else
208n/a next_arg += 2;
209n/a gp_count += 2;
210n/a# endif
211n/a fparg_count++;
212n/a double_tmp = ((double *) *p_argv)[1];
213n/a if (fparg_count < NUM_FPR_ARG_REGISTERS)
214n/a *fpr_base++ = double_tmp;
215n/a *(double *) next_arg = double_tmp;
216n/a# if defined(POWERPC_DARWIN64)
217n/a next_arg++;
218n/a gp_count++;
219n/a# else
220n/a next_arg += 2;
221n/a gp_count += 2;
222n/a# endif
223n/a fparg_count++;
224n/a# endif
225n/a FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
226n/a break;
227n/a#endif
228n/a case FFI_TYPE_UINT64:
229n/a case FFI_TYPE_SINT64:
230n/a#ifdef POWERPC64
231n/a gprvalue = *(long long *) *p_argv;
232n/a goto putgpr;
233n/a#else
234n/a *(long long *) next_arg = *(long long *) *p_argv;
235n/a next_arg += 2;
236n/a gp_count += 2;
237n/a#endif
238n/a break;
239n/a case FFI_TYPE_POINTER:
240n/a gprvalue = *(unsigned long *) *p_argv;
241n/a goto putgpr;
242n/a case FFI_TYPE_UINT8:
243n/a gprvalue = *(unsigned char *) *p_argv;
244n/a goto putgpr;
245n/a case FFI_TYPE_SINT8:
246n/a gprvalue = *(signed char *) *p_argv;
247n/a goto putgpr;
248n/a case FFI_TYPE_UINT16:
249n/a gprvalue = *(unsigned short *) *p_argv;
250n/a goto putgpr;
251n/a case FFI_TYPE_SINT16:
252n/a gprvalue = *(signed short *) *p_argv;
253n/a goto putgpr;
254n/a
255n/a case FFI_TYPE_STRUCT:
256n/a size_al = (*ptr)->size;
257n/a#if defined(POWERPC_DARWIN64)
258n/a next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment);
259n/a darwin64_pass_struct_by_value (*ptr, (char *) *p_argv,
260n/a (unsigned) size_al,
261n/a (unsigned int *) &fparg_count,
262n/a &fpr_base, &next_arg);
263n/a#else
264n/a dest_cpy = (char *) next_arg;
265n/a
266n/a /* If the first member of the struct is a double, then include enough
267n/a padding in the struct size to align it to double-word. */
268n/a if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
269n/a size_al = ALIGN((*ptr)->size, 8);
270n/a
271n/a# if defined(POWERPC64)
272n/a FFI_ASSERT (abi != FFI_DARWIN);
273n/a memcpy ((char *) dest_cpy, (char *) *p_argv, size_al);
274n/a next_arg += (size_al + 7) / 8;
275n/a# else
276n/a /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
277n/a SI 4 bytes) are aligned as if they were those modes.
278n/a Structures with 3 byte in size are padded upwards. */
279n/a if (size_al < 3 && abi == FFI_DARWIN)
280n/a dest_cpy += 4 - size_al;
281n/a
282n/a memcpy((char *) dest_cpy, (char *) *p_argv, size_al);
283n/a next_arg += (size_al + 3) / 4;
284n/a# endif
285n/a#endif
286n/a break;
287n/a
288n/a case FFI_TYPE_INT:
289n/a case FFI_TYPE_SINT32:
290n/a gprvalue = *(signed int *) *p_argv;
291n/a goto putgpr;
292n/a
293n/a case FFI_TYPE_UINT32:
294n/a gprvalue = *(unsigned int *) *p_argv;
295n/a putgpr:
296n/a *next_arg++ = gprvalue;
297n/a gp_count++;
298n/a break;
299n/a default:
300n/a break;
301n/a }
302n/a }
303n/a
304n/a /* Check that we didn't overrun the stack... */
305n/a /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
306n/a FFI_ASSERT((unsigned *)fpr_base
307n/a <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
308n/a FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */
309n/a}
310n/a
311n/a#if defined(POWERPC_DARWIN64)
312n/a
313n/a/* See if we can put some of the struct into fprs.
314n/a This should not be called for structures of size 16 bytes, since these are not
315n/a broken out this way. */
316n/astatic void
317n/adarwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr)
318n/a{
319n/a int i;
320n/a
321n/a FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
322n/a
323n/a for (i = 0; s->elements[i] != NULL; i++)
324n/a {
325n/a ffi_type *p = s->elements[i];
326n/a switch (p->type)
327n/a {
328n/a case FFI_TYPE_STRUCT:
329n/a darwin64_scan_struct_for_floats (p, nfpr);
330n/a break;
331n/a case FFI_TYPE_LONGDOUBLE:
332n/a (*nfpr) += 2;
333n/a break;
334n/a case FFI_TYPE_DOUBLE:
335n/a case FFI_TYPE_FLOAT:
336n/a (*nfpr) += 1;
337n/a break;
338n/a default:
339n/a break;
340n/a }
341n/a }
342n/a}
343n/a
344n/astatic int
345n/adarwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
346n/a{
347n/a unsigned struct_offset=0, i;
348n/a
349n/a for (i = 0; s->elements[i] != NULL; i++)
350n/a {
351n/a char *item_base;
352n/a ffi_type *p = s->elements[i];
353n/a /* Find the start of this item (0 for the first one). */
354n/a if (i > 0)
355n/a struct_offset = ALIGN(struct_offset, p->alignment);
356n/a
357n/a item_base = src + struct_offset;
358n/a
359n/a switch (p->type)
360n/a {
361n/a case FFI_TYPE_STRUCT:
362n/a if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr))
363n/a return 1;
364n/a break;
365n/a case FFI_TYPE_LONGDOUBLE:
366n/a if (*nfpr >= NUM_FPR_ARG_REGISTERS)
367n/a return 1;
368n/a (*nfpr) += 1;
369n/a item_base += 8;
370n/a /* FALL THROUGH */
371n/a case FFI_TYPE_DOUBLE:
372n/a if (*nfpr >= NUM_FPR_ARG_REGISTERS)
373n/a return 1;
374n/a (*nfpr) += 1;
375n/a break;
376n/a case FFI_TYPE_FLOAT:
377n/a if (*nfpr >= NUM_FPR_ARG_REGISTERS)
378n/a return 1;
379n/a (*nfpr) += 1;
380n/a break;
381n/a default:
382n/a /* If we try and place any item, that is non-float, once we've
383n/a exceeded the 8 GPR mark, then we can't fit the struct. */
384n/a if ((unsigned long)item_base >= 8*8)
385n/a return 1;
386n/a break;
387n/a }
388n/a /* now count the size of what we just used. */
389n/a struct_offset += p->size;
390n/a }
391n/a return 0;
392n/a}
393n/a
394n/a/* Can this struct be returned by value? */
395n/aint
396n/adarwin64_struct_ret_by_value_p (ffi_type *s)
397n/a{
398n/a unsigned nfp = 0;
399n/a
400n/a FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT);
401n/a
402n/a /* The largest structure we can return is 8long + 13 doubles. */
403n/a if (s->size > 168)
404n/a return 0;
405n/a
406n/a /* We can't pass more than 13 floats. */
407n/a darwin64_scan_struct_for_floats (s, &nfp);
408n/a if (nfp > 13)
409n/a return 0;
410n/a
411n/a /* If there are not too many floats, and the struct is
412n/a small enough to accommodate in the GPRs, then it must be OK. */
413n/a if (s->size <= 64)
414n/a return 1;
415n/a
416n/a /* Well, we have to look harder. */
417n/a nfp = 0;
418n/a if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp))
419n/a return 0;
420n/a
421n/a return 1;
422n/a}
423n/a
424n/avoid
425n/adarwin64_pass_struct_floats (ffi_type *s, char *src,
426n/a unsigned *nfpr, double **fprs)
427n/a{
428n/a int i;
429n/a double *fpr_base = *fprs;
430n/a unsigned struct_offset = 0;
431n/a
432n/a /* We don't assume anything about the alignment of the source. */
433n/a for (i = 0; s->elements[i] != NULL; i++)
434n/a {
435n/a char *item_base;
436n/a ffi_type *p = s->elements[i];
437n/a /* Find the start of this item (0 for the first one). */
438n/a if (i > 0)
439n/a struct_offset = ALIGN(struct_offset, p->alignment);
440n/a item_base = src + struct_offset;
441n/a
442n/a switch (p->type)
443n/a {
444n/a case FFI_TYPE_STRUCT:
445n/a darwin64_pass_struct_floats (p, item_base, nfpr,
446n/a &fpr_base);
447n/a break;
448n/a case FFI_TYPE_LONGDOUBLE:
449n/a if (*nfpr < NUM_FPR_ARG_REGISTERS)
450n/a *fpr_base++ = *(double *)item_base;
451n/a (*nfpr) += 1;
452n/a item_base += 8;
453n/a /* FALL THROUGH */
454n/a case FFI_TYPE_DOUBLE:
455n/a if (*nfpr < NUM_FPR_ARG_REGISTERS)
456n/a *fpr_base++ = *(double *)item_base;
457n/a (*nfpr) += 1;
458n/a break;
459n/a case FFI_TYPE_FLOAT:
460n/a if (*nfpr < NUM_FPR_ARG_REGISTERS)
461n/a *fpr_base++ = (double) *(float *)item_base;
462n/a (*nfpr) += 1;
463n/a break;
464n/a default:
465n/a break;
466n/a }
467n/a /* now count the size of what we just used. */
468n/a struct_offset += p->size;
469n/a }
470n/a /* Update the scores. */
471n/a *fprs = fpr_base;
472n/a}
473n/a
474n/a/* Darwin64 special rules.
475n/a Break out a struct into params and float registers. */
476n/astatic void
477n/adarwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size,
478n/a unsigned *nfpr, double **fprs, unsigned long **arg)
479n/a{
480n/a unsigned long *next_arg = *arg;
481n/a char *dest_cpy = (char *)next_arg;
482n/a
483n/a FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
484n/a
485n/a if (!size)
486n/a return;
487n/a
488n/a /* First... special cases. */
489n/a if (size < 3
490n/a || (size == 4
491n/a && s->elements[0]
492n/a && s->elements[0]->type != FFI_TYPE_FLOAT))
493n/a {
494n/a /* Must be at least one GPR, padding is unspecified in value,
495n/a let's make it zero. */
496n/a *next_arg = 0UL;
497n/a dest_cpy += 8 - size;
498n/a memcpy ((char *) dest_cpy, src, size);
499n/a next_arg++;
500n/a }
501n/a else if (size == 16)
502n/a {
503n/a memcpy ((char *) dest_cpy, src, size);
504n/a next_arg += 2;
505n/a }
506n/a else
507n/a {
508n/a /* now the general case, we consider embedded floats. */
509n/a memcpy ((char *) dest_cpy, src, size);
510n/a darwin64_pass_struct_floats (s, src, nfpr, fprs);
511n/a next_arg += (size+7)/8;
512n/a }
513n/a
514n/a *arg = next_arg;
515n/a}
516n/a
517n/adouble *
518n/adarwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf)
519n/a{
520n/a int i;
521n/a unsigned struct_offset = 0;
522n/a
523n/a /* We don't assume anything about the alignment of the source. */
524n/a for (i = 0; s->elements[i] != NULL; i++)
525n/a {
526n/a char *item_base;
527n/a ffi_type *p = s->elements[i];
528n/a /* Find the start of this item (0 for the first one). */
529n/a if (i > 0)
530n/a struct_offset = ALIGN(struct_offset, p->alignment);
531n/a item_base = dest + struct_offset;
532n/a
533n/a switch (p->type)
534n/a {
535n/a case FFI_TYPE_STRUCT:
536n/a fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf);
537n/a break;
538n/a case FFI_TYPE_LONGDOUBLE:
539n/a if (*nf < NUM_FPR_ARG_REGISTERS)
540n/a {
541n/a *(double *)item_base = *fprs++ ;
542n/a (*nf) += 1;
543n/a }
544n/a item_base += 8;
545n/a /* FALL THROUGH */
546n/a case FFI_TYPE_DOUBLE:
547n/a if (*nf < NUM_FPR_ARG_REGISTERS)
548n/a {
549n/a *(double *)item_base = *fprs++ ;
550n/a (*nf) += 1;
551n/a }
552n/a break;
553n/a case FFI_TYPE_FLOAT:
554n/a if (*nf < NUM_FPR_ARG_REGISTERS)
555n/a {
556n/a *(float *)item_base = (float) *fprs++ ;
557n/a (*nf) += 1;
558n/a }
559n/a break;
560n/a default:
561n/a break;
562n/a }
563n/a /* now count the size of what we just used. */
564n/a struct_offset += p->size;
565n/a }
566n/a return fprs;
567n/a}
568n/a
569n/a#endif
570n/a
571n/a/* Adjust the size of S to be correct for Darwin.
572n/a On Darwin m32, the first field of a structure has natural alignment.
573n/a On Darwin m64, all fields have natural alignment. */
574n/a
575n/astatic void
576n/adarwin_adjust_aggregate_sizes (ffi_type *s)
577n/a{
578n/a int i;
579n/a
580n/a if (s->type != FFI_TYPE_STRUCT)
581n/a return;
582n/a
583n/a s->size = 0;
584n/a for (i = 0; s->elements[i] != NULL; i++)
585n/a {
586n/a ffi_type *p;
587n/a int align;
588n/a
589n/a p = s->elements[i];
590n/a if (p->type == FFI_TYPE_STRUCT)
591n/a darwin_adjust_aggregate_sizes (p);
592n/a#if defined(POWERPC_DARWIN64)
593n/a /* Natural alignment for all items. */
594n/a align = p->alignment;
595n/a#else
596n/a /* Natural alignment for the first item... */
597n/a if (i == 0)
598n/a align = p->alignment;
599n/a else if (p->alignment == 16 || p->alignment < 4)
600n/a /* .. subsequent items with vector or align < 4 have natural align. */
601n/a align = p->alignment;
602n/a else
603n/a /* .. or align is 4. */
604n/a align = 4;
605n/a#endif
606n/a /* Pad, if necessary, before adding the current item. */
607n/a s->size = ALIGN(s->size, align) + p->size;
608n/a }
609n/a
610n/a s->size = ALIGN(s->size, s->alignment);
611n/a
612n/a /* This should not be necessary on m64, but harmless. */
613n/a if (s->elements[0]->type == FFI_TYPE_UINT64
614n/a || s->elements[0]->type == FFI_TYPE_SINT64
615n/a || s->elements[0]->type == FFI_TYPE_DOUBLE
616n/a || s->elements[0]->alignment == 8)
617n/a s->alignment = s->alignment > 8 ? s->alignment : 8;
618n/a /* Do not add additional tail padding. */
619n/a}
620n/a
621n/a/* Adjust the size of S to be correct for AIX.
622n/a Word-align double unless it is the first member of a structure. */
623n/a
624n/astatic void
625n/aaix_adjust_aggregate_sizes (ffi_type *s)
626n/a{
627n/a int i;
628n/a
629n/a if (s->type != FFI_TYPE_STRUCT)
630n/a return;
631n/a
632n/a s->size = 0;
633n/a for (i = 0; s->elements[i] != NULL; i++)
634n/a {
635n/a ffi_type *p;
636n/a int align;
637n/a
638n/a p = s->elements[i];
639n/a aix_adjust_aggregate_sizes (p);
640n/a align = p->alignment;
641n/a if (i != 0 && p->type == FFI_TYPE_DOUBLE)
642n/a align = 4;
643n/a s->size = ALIGN(s->size, align) + p->size;
644n/a }
645n/a
646n/a s->size = ALIGN(s->size, s->alignment);
647n/a
648n/a if (s->elements[0]->type == FFI_TYPE_UINT64
649n/a || s->elements[0]->type == FFI_TYPE_SINT64
650n/a || s->elements[0]->type == FFI_TYPE_DOUBLE
651n/a || s->elements[0]->alignment == 8)
652n/a s->alignment = s->alignment > 8 ? s->alignment : 8;
653n/a /* Do not add additional tail padding. */
654n/a}
655n/a
656n/a/* Perform machine dependent cif processing. */
657n/affi_status
658n/affi_prep_cif_machdep (ffi_cif *cif)
659n/a{
660n/a /* All this is for the DARWIN ABI. */
661n/a unsigned i;
662n/a ffi_type **ptr;
663n/a unsigned bytes;
664n/a unsigned fparg_count = 0, intarg_count = 0;
665n/a unsigned flags = 0;
666n/a unsigned size_al = 0;
667n/a
668n/a /* All the machine-independent calculation of cif->bytes will be wrong.
669n/a All the calculation of structure sizes will also be wrong.
670n/a Redo the calculation for DARWIN. */
671n/a
672n/a if (cif->abi == FFI_DARWIN)
673n/a {
674n/a darwin_adjust_aggregate_sizes (cif->rtype);
675n/a for (i = 0; i < cif->nargs; i++)
676n/a darwin_adjust_aggregate_sizes (cif->arg_types[i]);
677n/a }
678n/a
679n/a if (cif->abi == FFI_AIX)
680n/a {
681n/a aix_adjust_aggregate_sizes (cif->rtype);
682n/a for (i = 0; i < cif->nargs; i++)
683n/a aix_adjust_aggregate_sizes (cif->arg_types[i]);
684n/a }
685n/a
686n/a /* Space for the frame pointer, callee's LR, CR, etc, and for
687n/a the asm's temp regs. */
688n/a
689n/a bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long);
690n/a
691n/a /* Return value handling.
692n/a The rules m32 are as follows:
693n/a - 32-bit (or less) integer values are returned in gpr3;
694n/a - structures of size <= 4 bytes also returned in gpr3;
695n/a - 64-bit integer values [??? and structures between 5 and 8 bytes] are
696n/a returned in gpr3 and gpr4;
697n/a - Single/double FP values are returned in fpr1;
698n/a - Long double FP (if not equivalent to double) values are returned in
699n/a fpr1 and fpr2;
700n/a m64:
701n/a - 64-bit or smaller integral values are returned in GPR3
702n/a - Single/double FP values are returned in fpr1;
703n/a - Long double FP values are returned in fpr1 and fpr2;
704n/a m64 Structures:
705n/a - If the structure could be accommodated in registers were it to be the
706n/a first argument to a routine, then it is returned in those registers.
707n/a m32/m64 structures otherwise:
708n/a - Larger structures values are allocated space and a pointer is passed
709n/a as the first argument. */
710n/a switch (cif->rtype->type)
711n/a {
712n/a
713n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
714n/a case FFI_TYPE_LONGDOUBLE:
715n/a flags |= FLAG_RETURNS_128BITS;
716n/a flags |= FLAG_RETURNS_FP;
717n/a break;
718n/a#endif
719n/a
720n/a case FFI_TYPE_DOUBLE:
721n/a flags |= FLAG_RETURNS_64BITS;
722n/a /* Fall through. */
723n/a case FFI_TYPE_FLOAT:
724n/a flags |= FLAG_RETURNS_FP;
725n/a break;
726n/a
727n/a case FFI_TYPE_UINT64:
728n/a case FFI_TYPE_SINT64:
729n/a#ifdef POWERPC64
730n/a case FFI_TYPE_POINTER:
731n/a#endif
732n/a flags |= FLAG_RETURNS_64BITS;
733n/a break;
734n/a
735n/a case FFI_TYPE_STRUCT:
736n/a#if defined(POWERPC_DARWIN64)
737n/a {
738n/a /* Can we fit the struct into regs? */
739n/a if (darwin64_struct_ret_by_value_p (cif->rtype))
740n/a {
741n/a unsigned nfpr = 0;
742n/a flags |= FLAG_RETURNS_STRUCT;
743n/a if (cif->rtype->size != 16)
744n/a darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ;
745n/a else
746n/a flags |= FLAG_RETURNS_128BITS;
747n/a /* Will be 0 for 16byte struct. */
748n/a if (nfpr)
749n/a flags |= FLAG_RETURNS_FP;
750n/a }
751n/a else /* By ref. */
752n/a {
753n/a flags |= FLAG_RETVAL_REFERENCE;
754n/a flags |= FLAG_RETURNS_NOTHING;
755n/a intarg_count++;
756n/a }
757n/a }
758n/a#elif defined(DARWIN_PPC)
759n/a if (cif->rtype->size <= 4)
760n/a flags |= FLAG_RETURNS_STRUCT;
761n/a else /* else by reference. */
762n/a {
763n/a flags |= FLAG_RETVAL_REFERENCE;
764n/a flags |= FLAG_RETURNS_NOTHING;
765n/a intarg_count++;
766n/a }
767n/a#else /* assume we pass by ref. */
768n/a flags |= FLAG_RETVAL_REFERENCE;
769n/a flags |= FLAG_RETURNS_NOTHING;
770n/a intarg_count++;
771n/a#endif
772n/a break;
773n/a case FFI_TYPE_VOID:
774n/a flags |= FLAG_RETURNS_NOTHING;
775n/a break;
776n/a
777n/a default:
778n/a /* Returns 32-bit integer, or similar. Nothing to do here. */
779n/a break;
780n/a }
781n/a
782n/a /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
783n/a first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
784n/a goes on the stack.
785n/a ??? Structures are passed as a pointer to a copy of the structure.
786n/a Stuff on the stack needs to keep proper alignment.
787n/a For m64 the count is effectively of half-GPRs. */
788n/a for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
789n/a {
790n/a unsigned align_words;
791n/a switch ((*ptr)->type)
792n/a {
793n/a case FFI_TYPE_FLOAT:
794n/a case FFI_TYPE_DOUBLE:
795n/a fparg_count++;
796n/a#if !defined(POWERPC_DARWIN64)
797n/a /* If this FP arg is going on the stack, it must be
798n/a 8-byte-aligned. */
799n/a if (fparg_count > NUM_FPR_ARG_REGISTERS
800n/a && (intarg_count & 0x01) != 0)
801n/a intarg_count++;
802n/a#endif
803n/a break;
804n/a
805n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
806n/a case FFI_TYPE_LONGDOUBLE:
807n/a fparg_count += 2;
808n/a /* If this FP arg is going on the stack, it must be
809n/a 16-byte-aligned. */
810n/a if (fparg_count >= NUM_FPR_ARG_REGISTERS)
811n/a#if defined (POWERPC64)
812n/a intarg_count = ALIGN(intarg_count, 2);
813n/a#else
814n/a intarg_count = ALIGN(intarg_count, 4);
815n/a#endif
816n/a break;
817n/a#endif
818n/a
819n/a case FFI_TYPE_UINT64:
820n/a case FFI_TYPE_SINT64:
821n/a#if defined(POWERPC64)
822n/a intarg_count++;
823n/a#else
824n/a /* 'long long' arguments are passed as two words, but
825n/a either both words must fit in registers or both go
826n/a on the stack. If they go on the stack, they must
827n/a be 8-byte-aligned. */
828n/a if (intarg_count == NUM_GPR_ARG_REGISTERS-1
829n/a || (intarg_count >= NUM_GPR_ARG_REGISTERS
830n/a && (intarg_count & 0x01) != 0))
831n/a intarg_count++;
832n/a intarg_count += 2;
833n/a#endif
834n/a break;
835n/a
836n/a case FFI_TYPE_STRUCT:
837n/a size_al = (*ptr)->size;
838n/a#if defined(POWERPC_DARWIN64)
839n/a align_words = (*ptr)->alignment >> 3;
840n/a if (align_words)
841n/a intarg_count = ALIGN(intarg_count, align_words);
842n/a /* Base size of the struct. */
843n/a intarg_count += (size_al + 7) / 8;
844n/a /* If 16 bytes then don't worry about floats. */
845n/a if (size_al != 16)
846n/a /* Scan through for floats to be placed in regs. */
847n/a darwin64_scan_struct_for_floats (*ptr, &fparg_count) ;
848n/a#else
849n/a align_words = (*ptr)->alignment >> 2;
850n/a if (align_words)
851n/a intarg_count = ALIGN(intarg_count, align_words);
852n/a /* If the first member of the struct is a double, then align
853n/a the struct to double-word.
854n/a if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
855n/a size_al = ALIGN((*ptr)->size, 8); */
856n/a# ifdef POWERPC64
857n/a intarg_count += (size_al + 7) / 8;
858n/a# else
859n/a intarg_count += (size_al + 3) / 4;
860n/a# endif
861n/a#endif
862n/a break;
863n/a
864n/a default:
865n/a /* Everything else is passed as a 4-byte word in a GPR, either
866n/a the object itself or a pointer to it. */
867n/a intarg_count++;
868n/a break;
869n/a }
870n/a }
871n/a
872n/a if (fparg_count != 0)
873n/a flags |= FLAG_FP_ARGUMENTS;
874n/a
875n/a#if defined(POWERPC_DARWIN64)
876n/a /* Space to image the FPR registers, if needed - which includes when they might be
877n/a used in a struct return. */
878n/a if (fparg_count != 0
879n/a || ((flags & FLAG_RETURNS_STRUCT)
880n/a && (flags & FLAG_RETURNS_FP)))
881n/a bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
882n/a#else
883n/a /* Space for the FPR registers, if needed. */
884n/a if (fparg_count != 0)
885n/a bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
886n/a#endif
887n/a
888n/a /* Stack space. */
889n/a#ifdef POWERPC64
890n/a if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS)
891n/a bytes += (intarg_count + fparg_count) * sizeof(long);
892n/a#else
893n/a if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS)
894n/a bytes += (intarg_count + 2 * fparg_count) * sizeof(long);
895n/a#endif
896n/a else
897n/a bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
898n/a
899n/a /* The stack space allocated needs to be a multiple of 16 bytes. */
900n/a bytes = ALIGN(bytes, 16) ;
901n/a
902n/a cif->flags = flags;
903n/a cif->bytes = bytes;
904n/a
905n/a return FFI_OK;
906n/a}
907n/a
908n/aextern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
909n/a void (*fn)(void), void (*fn2)(void));
910n/a
911n/aextern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
912n/a void (*fn)(void), void (*fn2)(void), ffi_type*);
913n/a
914n/avoid
915n/affi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
916n/a{
917n/a extended_cif ecif;
918n/a
919n/a ecif.cif = cif;
920n/a ecif.avalue = avalue;
921n/a
922n/a /* If the return value is a struct and we don't have a return
923n/a value address then we need to make one. */
924n/a
925n/a if ((rvalue == NULL) &&
926n/a (cif->rtype->type == FFI_TYPE_STRUCT))
927n/a {
928n/a ecif.rvalue = alloca (cif->rtype->size);
929n/a }
930n/a else
931n/a ecif.rvalue = rvalue;
932n/a
933n/a switch (cif->abi)
934n/a {
935n/a case FFI_AIX:
936n/a ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
937n/a FFI_FN(ffi_prep_args));
938n/a break;
939n/a case FFI_DARWIN:
940n/a ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
941n/a FFI_FN(ffi_prep_args), cif->rtype);
942n/a break;
943n/a default:
944n/a FFI_ASSERT(0);
945n/a break;
946n/a }
947n/a}
948n/a
949n/astatic void flush_icache(char *);
950n/astatic void flush_range(char *, int);
951n/a
952n/a/* The layout of a function descriptor. A C function pointer really
953n/a points to one of these. */
954n/a
955n/atypedef struct aix_fd_struct {
956n/a void *code_pointer;
957n/a void *toc;
958n/a} aix_fd;
959n/a
960n/a/* here I'd like to add the stack frame layout we use in darwin_closure.S
961n/a and aix_closure.S
962n/a
963n/a m32/m64
964n/a
965n/a The stack layout looks like this:
966n/a
967n/a | Additional params... | | Higher address
968n/a ~ ~ ~
969n/a | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
970n/a |--------------------------------------------| |
971n/a | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
972n/a |--------------------------------------------| |
973n/a | Reserved 2*4/8 | |
974n/a |--------------------------------------------| |
975n/a | Space for callee's LR 4/8 | |
976n/a |--------------------------------------------| |
977n/a | Saved CR [low word for m64] 4/8 | |
978n/a |--------------------------------------------| |
979n/a | Current backchain pointer 4/8 |-/ Parent's frame.
980n/a |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM
981n/a | Result Bytes 16 | |
982n/a |--------------------------------------------| |
983n/a ~ padding to 16-byte alignment ~ ~
984n/a |--------------------------------------------| |
985n/a | NUM_FPR_ARG_REGISTERS slots | |
986n/a | here fp13 .. fp1 13*8 | |
987n/a |--------------------------------------------| |
988n/a | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS
989n/a |--------------------------------------------| |
990n/a | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
991n/a |--------------------------------------------| | stack |
992n/a | Reserved [compiler,binder] 2*4/8 | | grows |
993n/a |--------------------------------------------| | down V
994n/a | Space for callee's LR 4/8 | |
995n/a |--------------------------------------------| | lower addresses
996n/a | Saved CR [low word for m64] 4/8 | |
997n/a |--------------------------------------------| | stack pointer here
998n/a | Current backchain pointer 4/8 |-/ during
999n/a |--------------------------------------------| <<< ffi_closure_ASM.
1000n/a
1001n/a*/
1002n/a
1003n/affi_status
1004n/affi_prep_closure_loc (ffi_closure* closure,
1005n/a ffi_cif* cif,
1006n/a void (*fun)(ffi_cif*, void*, void**, void*),
1007n/a void *user_data,
1008n/a void *codeloc)
1009n/a{
1010n/a unsigned int *tramp;
1011n/a struct ffi_aix_trampoline_struct *tramp_aix;
1012n/a aix_fd *fd;
1013n/a
1014n/a switch (cif->abi)
1015n/a {
1016n/a case FFI_DARWIN:
1017n/a
1018n/a FFI_ASSERT (cif->abi == FFI_DARWIN);
1019n/a
1020n/a tramp = (unsigned int *) &closure->tramp[0];
1021n/a#if defined(POWERPC_DARWIN64)
1022n/a tramp[0] = 0x7c0802a6; /* mflr r0 */
1023n/a tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */
1024n/a /* We put the addresses here. */
1025n/a tramp[6] = 0x7d6802a6; /*L1: mflr r11 */
1026n/a tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */
1027n/a tramp[8] = 0x7c0803a6; /* mtlr r0 */
1028n/a tramp[9] = 0x7d8903a6; /* mtctr r12 */
1029n/a tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */
1030n/a tramp[11] = 0x4e800420; /* bctr */
1031n/a
1032n/a *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */
1033n/a *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */
1034n/a#else
1035n/a tramp[0] = 0x7c0802a6; /* mflr r0 */
1036n/a tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */
1037n/a tramp[4] = 0x7d6802a6; /* mflr r11 */
1038n/a tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */
1039n/a tramp[6] = 0x7c0803a6; /* mtlr r0 */
1040n/a tramp[7] = 0x7d8903a6; /* mtctr r12 */
1041n/a tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */
1042n/a tramp[9] = 0x4e800420; /* bctr */
1043n/a tramp[2] = (unsigned long) ffi_closure_ASM; /* function */
1044n/a tramp[3] = (unsigned long) codeloc; /* context */
1045n/a#endif
1046n/a closure->cif = cif;
1047n/a closure->fun = fun;
1048n/a closure->user_data = user_data;
1049n/a
1050n/a /* Flush the icache. Only necessary on Darwin. */
1051n/a flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
1052n/a
1053n/a break;
1054n/a
1055n/a case FFI_AIX:
1056n/a
1057n/a tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp);
1058n/a fd = (aix_fd *)(void *)ffi_closure_ASM;
1059n/a
1060n/a FFI_ASSERT (cif->abi == FFI_AIX);
1061n/a
1062n/a tramp_aix->code_pointer = fd->code_pointer;
1063n/a tramp_aix->toc = fd->toc;
1064n/a tramp_aix->static_chain = codeloc;
1065n/a closure->cif = cif;
1066n/a closure->fun = fun;
1067n/a closure->user_data = user_data;
1068n/a break;
1069n/a
1070n/a default:
1071n/a return FFI_BAD_ABI;
1072n/a break;
1073n/a }
1074n/a return FFI_OK;
1075n/a}
1076n/a
1077n/astatic void
1078n/aflush_icache(char *addr)
1079n/a{
1080n/a#ifndef _AIX
1081n/a __asm__ volatile (
1082n/a "dcbf 0,%0\n"
1083n/a "\tsync\n"
1084n/a "\ticbi 0,%0\n"
1085n/a "\tsync\n"
1086n/a "\tisync"
1087n/a : : "r"(addr) : "memory");
1088n/a#endif
1089n/a}
1090n/a
1091n/astatic void
1092n/aflush_range(char * addr1, int size)
1093n/a{
1094n/a#define MIN_LINE_SIZE 32
1095n/a int i;
1096n/a for (i = 0; i < size; i += MIN_LINE_SIZE)
1097n/a flush_icache(addr1+i);
1098n/a flush_icache(addr1+size-1);
1099n/a}
1100n/a
1101n/atypedef union
1102n/a{
1103n/a float f;
1104n/a double d;
1105n/a} ffi_dblfl;
1106n/a
1107n/affi_type *
1108n/affi_closure_helper_DARWIN (ffi_closure *, void *,
1109n/a unsigned long *, ffi_dblfl *);
1110n/a
1111n/a/* Basically the trampoline invokes ffi_closure_ASM, and on
1112n/a entry, r11 holds the address of the closure.
1113n/a After storing the registers that could possibly contain
1114n/a parameters to be passed into the stack frame and setting
1115n/a up space for a return value, ffi_closure_ASM invokes the
1116n/a following helper function to do most of the work. */
1117n/a
1118n/affi_type *
1119n/affi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
1120n/a unsigned long *pgr, ffi_dblfl *pfr)
1121n/a{
1122n/a /* rvalue is the pointer to space for return value in closure assembly
1123n/a pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM
1124n/a pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */
1125n/a
1126n/a typedef double ldbits[2];
1127n/a
1128n/a union ldu
1129n/a {
1130n/a ldbits lb;
1131n/a long double ld;
1132n/a };
1133n/a
1134n/a void ** avalue;
1135n/a ffi_type ** arg_types;
1136n/a long i, avn;
1137n/a ffi_cif * cif;
1138n/a ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
1139n/a unsigned size_al;
1140n/a#if defined(POWERPC_DARWIN64)
1141n/a unsigned fpsused = 0;
1142n/a#endif
1143n/a
1144n/a cif = closure->cif;
1145n/a avalue = alloca (cif->nargs * sizeof(void *));
1146n/a
1147n/a if (cif->rtype->type == FFI_TYPE_STRUCT)
1148n/a {
1149n/a#if defined(POWERPC_DARWIN64)
1150n/a if (!darwin64_struct_ret_by_value_p (cif->rtype))
1151n/a {
1152n/a /* Won't fit into the regs - return by ref. */
1153n/a rvalue = (void *) *pgr;
1154n/a pgr++;
1155n/a }
1156n/a#elif defined(DARWIN_PPC)
1157n/a if (cif->rtype->size > 4)
1158n/a {
1159n/a rvalue = (void *) *pgr;
1160n/a pgr++;
1161n/a }
1162n/a#else /* assume we return by ref. */
1163n/a rvalue = (void *) *pgr;
1164n/a pgr++;
1165n/a#endif
1166n/a }
1167n/a
1168n/a i = 0;
1169n/a avn = cif->nargs;
1170n/a arg_types = cif->arg_types;
1171n/a
1172n/a /* Grab the addresses of the arguments from the stack frame. */
1173n/a while (i < avn)
1174n/a {
1175n/a switch (arg_types[i]->type)
1176n/a {
1177n/a case FFI_TYPE_SINT8:
1178n/a case FFI_TYPE_UINT8:
1179n/a#if defined(POWERPC64)
1180n/a avalue[i] = (char *) pgr + 7;
1181n/a#else
1182n/a avalue[i] = (char *) pgr + 3;
1183n/a#endif
1184n/a pgr++;
1185n/a break;
1186n/a
1187n/a case FFI_TYPE_SINT16:
1188n/a case FFI_TYPE_UINT16:
1189n/a#if defined(POWERPC64)
1190n/a avalue[i] = (char *) pgr + 6;
1191n/a#else
1192n/a avalue[i] = (char *) pgr + 2;
1193n/a#endif
1194n/a pgr++;
1195n/a break;
1196n/a
1197n/a case FFI_TYPE_SINT32:
1198n/a case FFI_TYPE_UINT32:
1199n/a#if defined(POWERPC64)
1200n/a avalue[i] = (char *) pgr + 4;
1201n/a#else
1202n/a case FFI_TYPE_POINTER:
1203n/a avalue[i] = pgr;
1204n/a#endif
1205n/a pgr++;
1206n/a break;
1207n/a
1208n/a case FFI_TYPE_STRUCT:
1209n/a size_al = arg_types[i]->size;
1210n/a#if defined(POWERPC_DARWIN64)
1211n/a pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment);
1212n/a if (size_al < 3 || size_al == 4)
1213n/a {
1214n/a avalue[i] = ((char *)pgr)+8-size_al;
1215n/a if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT
1216n/a && fpsused < NUM_FPR_ARG_REGISTERS)
1217n/a {
1218n/a *(float *)pgr = (float) *(double *)pfr;
1219n/a pfr++;
1220n/a fpsused++;
1221n/a }
1222n/a }
1223n/a else
1224n/a {
1225n/a if (size_al != 16)
1226n/a pfr = (ffi_dblfl *)
1227n/a darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr,
1228n/a (double *)pfr, &fpsused);
1229n/a avalue[i] = pgr;
1230n/a }
1231n/a pgr += (size_al + 7) / 8;
1232n/a#else
1233n/a /* If the first member of the struct is a double, then align
1234n/a the struct to double-word. */
1235n/a if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
1236n/a size_al = ALIGN(arg_types[i]->size, 8);
1237n/a# if defined(POWERPC64)
1238n/a FFI_ASSERT (cif->abi != FFI_DARWIN);
1239n/a avalue[i] = pgr;
1240n/a pgr += (size_al + 7) / 8;
1241n/a# else
1242n/a /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
1243n/a SI 4 bytes) are aligned as if they were those modes. */
1244n/a if (size_al < 3 && cif->abi == FFI_DARWIN)
1245n/a avalue[i] = (char*) pgr + 4 - size_al;
1246n/a else
1247n/a avalue[i] = pgr;
1248n/a pgr += (size_al + 3) / 4;
1249n/a# endif
1250n/a#endif
1251n/a break;
1252n/a
1253n/a case FFI_TYPE_SINT64:
1254n/a case FFI_TYPE_UINT64:
1255n/a#if defined(POWERPC64)
1256n/a case FFI_TYPE_POINTER:
1257n/a avalue[i] = pgr;
1258n/a pgr++;
1259n/a break;
1260n/a#else
1261n/a /* Long long ints are passed in two gpr's. */
1262n/a avalue[i] = pgr;
1263n/a pgr += 2;
1264n/a break;
1265n/a#endif
1266n/a
1267n/a case FFI_TYPE_FLOAT:
1268n/a /* A float value consumes a GPR.
1269n/a There are 13 64bit floating point registers. */
1270n/a if (pfr < end_pfr)
1271n/a {
1272n/a double temp = pfr->d;
1273n/a pfr->f = (float) temp;
1274n/a avalue[i] = pfr;
1275n/a pfr++;
1276n/a }
1277n/a else
1278n/a {
1279n/a avalue[i] = pgr;
1280n/a }
1281n/a pgr++;
1282n/a break;
1283n/a
1284n/a case FFI_TYPE_DOUBLE:
1285n/a /* A double value consumes two GPRs.
1286n/a There are 13 64bit floating point registers. */
1287n/a if (pfr < end_pfr)
1288n/a {
1289n/a avalue[i] = pfr;
1290n/a pfr++;
1291n/a }
1292n/a else
1293n/a {
1294n/a avalue[i] = pgr;
1295n/a }
1296n/a#ifdef POWERPC64
1297n/a pgr++;
1298n/a#else
1299n/a pgr += 2;
1300n/a#endif
1301n/a break;
1302n/a
1303n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
1304n/a
1305n/a case FFI_TYPE_LONGDOUBLE:
1306n/a#ifdef POWERPC64
1307n/a if (pfr + 1 < end_pfr)
1308n/a {
1309n/a avalue[i] = pfr;
1310n/a pfr += 2;
1311n/a }
1312n/a else
1313n/a {
1314n/a if (pfr < end_pfr)
1315n/a {
1316n/a *pgr = *(unsigned long *) pfr;
1317n/a pfr++;
1318n/a }
1319n/a avalue[i] = pgr;
1320n/a }
1321n/a pgr += 2;
1322n/a#else /* POWERPC64 */
1323n/a /* A long double value consumes four GPRs and two FPRs.
1324n/a There are 13 64bit floating point registers. */
1325n/a if (pfr + 1 < end_pfr)
1326n/a {
1327n/a avalue[i] = pfr;
1328n/a pfr += 2;
1329n/a }
1330n/a /* Here we have the situation where one part of the long double
1331n/a is stored in fpr13 and the other part is already on the stack.
1332n/a We use a union to pass the long double to avalue[i]. */
1333n/a else if (pfr + 1 == end_pfr)
1334n/a {
1335n/a union ldu temp_ld;
1336n/a memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits));
1337n/a memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits));
1338n/a avalue[i] = &temp_ld.ld;
1339n/a pfr++;
1340n/a }
1341n/a else
1342n/a {
1343n/a avalue[i] = pgr;
1344n/a }
1345n/a pgr += 4;
1346n/a#endif /* POWERPC64 */
1347n/a break;
1348n/a#endif
1349n/a default:
1350n/a FFI_ASSERT(0);
1351n/a }
1352n/a i++;
1353n/a }
1354n/a
1355n/a (closure->fun) (cif, rvalue, avalue, closure->user_data);
1356n/a
1357n/a /* Tell ffi_closure_ASM to perform return type promotions. */
1358n/a return cif->rtype;
1359n/a}