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