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