55 #define ROUND_SIZE(size) (((size) + 15) & ~15) 58 #define FFI390_RET_VOID 0 59 #define FFI390_RET_STRUCT 1 60 #define FFI390_RET_FLOAT 2 61 #define FFI390_RET_DOUBLE 3 62 #define FFI390_RET_INT32 4 63 #define FFI390_RET_INT64 5 74 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) 78 unsigned long long *,
unsigned long *);
110 size_t size = arg->size;
114 while (arg->type == FFI_TYPE_STRUCT
115 && arg->elements[0] && !arg->elements[1])
116 arg = arg->elements[0];
123 return FFI_TYPE_UINT8;
126 return FFI_TYPE_UINT16;
129 if (arg->type == FFI_TYPE_FLOAT)
130 return FFI_TYPE_FLOAT;
132 return FFI_TYPE_UINT32;
135 if (arg->type == FFI_TYPE_DOUBLE)
136 return FFI_TYPE_DOUBLE;
138 return FFI_TYPE_UINT64;
145 return FFI_TYPE_POINTER;
180 int gpr_off = ecif->
cif->bytes;
183 unsigned long long *p_fpr = (
unsigned long long *)(stack + fpr_off);
184 unsigned long *p_gpr = (
unsigned long *)(stack + gpr_off);
185 unsigned char *p_struct = (
unsigned char *)p_gpr;
186 unsigned long *p_ov = (
unsigned long *)stack;
193 void **p_argv = ecif->
avalue;
200 p_gpr[n_gpr++] = (
unsigned long) ecif->
rvalue;
204 for (ptr = ecif->
cif->arg_types, i = ecif->
cif->nargs;
206 i--, ptr++, p_argv++)
209 int type = (*ptr)->type;
211 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE 214 type = FFI_TYPE_STRUCT;
218 if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX)
220 if (type == FFI_TYPE_COMPLEX)
221 type = FFI_TYPE_POINTER;
226 if (type == FFI_TYPE_POINTER)
229 memcpy (p_struct, (
char *)arg, (*ptr)->size);
237 case FFI_TYPE_DOUBLE:
239 p_fpr[n_fpr++] = *(
unsigned long long *) arg;
242 p_ov[n_ov++] = *(
unsigned long *) arg;
244 p_ov[n_ov++] = ((
unsigned long *) arg)[0],
245 p_ov[n_ov++] = ((
unsigned long *) arg)[1];
251 p_fpr[n_fpr++] = (
long long) *(
unsigned int *) arg << 32;
253 p_ov[n_ov++] = *(
unsigned int *) arg;
256 case FFI_TYPE_POINTER:
258 p_gpr[n_gpr++] = (
unsigned long)*(
unsigned char **) arg;
260 p_ov[n_ov++] = (
unsigned long)*(
unsigned char **) arg;
263 case FFI_TYPE_UINT64:
264 case FFI_TYPE_SINT64:
267 p_gpr[n_gpr++] = *(
unsigned long *) arg;
269 p_ov[n_ov++] = *(
unsigned long *) arg;
274 p_gpr[n_gpr++] = ((
unsigned long *) arg)[0],
275 p_gpr[n_gpr++] = ((
unsigned long *) arg)[1];
277 p_ov[n_ov++] = ((
unsigned long *) arg)[0],
278 p_ov[n_ov++] = ((
unsigned long *) arg)[1];
282 case FFI_TYPE_UINT32:
284 p_gpr[n_gpr++] = *(
unsigned int *) arg;
286 p_ov[n_ov++] = *(
unsigned int *) arg;
290 case FFI_TYPE_SINT32:
292 p_gpr[n_gpr++] = *(
signed int *) arg;
294 p_ov[n_ov++] = *(
signed int *) arg;
297 case FFI_TYPE_UINT16:
299 p_gpr[n_gpr++] = *(
unsigned short *) arg;
301 p_ov[n_ov++] = *(
unsigned short *) arg;
304 case FFI_TYPE_SINT16:
306 p_gpr[n_gpr++] = *(
signed short *) arg;
308 p_ov[n_ov++] = *(
signed short *) arg;
313 p_gpr[n_gpr++] = *(
unsigned char *) arg;
315 p_ov[n_ov++] = *(
unsigned char *) arg;
320 p_gpr[n_gpr++] = *(
signed char *) arg;
322 p_ov[n_ov++] = *(
signed char *) arg;
345 size_t struct_size = 0;
355 switch (cif->rtype->type)
363 case FFI_TYPE_STRUCT:
364 case FFI_TYPE_COMPLEX:
374 case FFI_TYPE_DOUBLE:
378 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE 386 case FFI_TYPE_UINT64:
387 case FFI_TYPE_SINT64:
391 case FFI_TYPE_POINTER:
393 case FFI_TYPE_UINT32:
394 case FFI_TYPE_SINT32:
395 case FFI_TYPE_UINT16:
396 case FFI_TYPE_SINT16:
414 for (ptr = cif->arg_types, i = cif->nargs;
418 int type = (*ptr)->type;
420 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE 423 type = FFI_TYPE_STRUCT;
427 if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX)
429 if (type == FFI_TYPE_COMPLEX)
430 type = FFI_TYPE_POINTER;
436 if (type == FFI_TYPE_POINTER)
446 case FFI_TYPE_DOUBLE:
450 n_ov +=
sizeof (double) /
sizeof (
long);
466 case FFI_TYPE_UINT64:
467 case FFI_TYPE_SINT64:
492 cif->bytes =
ROUND_SIZE (n_ov *
sizeof (
long)) + struct_size;
513 int ret_type = cif->flags;
533 ret_type, ecif.
rvalue, fn);
554 unsigned long *p_gpr,
555 unsigned long long *p_fpr,
558 unsigned long long ret_buffer;
560 void *rvalue = &ret_buffer;
573 p_arg = avalue =
alloca (closure->cif->nargs * sizeof (
void *));
580 rvalue = (
void *) p_gpr[n_gpr++];
584 for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
588 int deref_struct_pointer = 0;
589 int type = (*ptr)->type;
591 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE 594 type = FFI_TYPE_STRUCT;
598 if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX)
600 if (type == FFI_TYPE_COMPLEX)
601 type = FFI_TYPE_POINTER;
607 if (type == FFI_TYPE_POINTER)
608 deref_struct_pointer = 1;
612 if (type == FFI_TYPE_POINTER)
614 type = FFI_TYPE_UINT64;
616 type = FFI_TYPE_UINT32;
622 case FFI_TYPE_DOUBLE:
624 *p_arg = &p_fpr[n_fpr++];
626 *p_arg = &p_ov[n_ov],
627 n_ov +=
sizeof (double) /
sizeof (
long);
632 *p_arg = &p_fpr[n_fpr++];
634 *p_arg = (
char *)&p_ov[n_ov++] +
sizeof (
long) - 4;
637 case FFI_TYPE_UINT64:
638 case FFI_TYPE_SINT64:
641 *p_arg = &p_gpr[n_gpr++];
643 *p_arg = &p_ov[n_ov++];
648 *p_arg = &p_gpr[n_gpr], n_gpr += 2;
650 *p_arg = &p_ov[n_ov], n_ov += 2;
655 case FFI_TYPE_UINT32:
656 case FFI_TYPE_SINT32:
658 *p_arg = (
char *)&p_gpr[n_gpr++] +
sizeof (
long) - 4;
660 *p_arg = (
char *)&p_ov[n_ov++] +
sizeof (
long) - 4;
663 case FFI_TYPE_UINT16:
664 case FFI_TYPE_SINT16:
666 *p_arg = (
char *)&p_gpr[n_gpr++] +
sizeof (
long) - 2;
668 *p_arg = (
char *)&p_ov[n_ov++] +
sizeof (
long) - 2;
674 *p_arg = (
char *)&p_gpr[n_gpr++] +
sizeof (
long) - 1;
676 *p_arg = (
char *)&p_ov[n_ov++] +
sizeof (
long) - 1;
686 if (deref_struct_pointer)
687 *p_arg = *(
void **)*p_arg;
692 (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
695 switch (closure->cif->rtype->type)
699 case FFI_TYPE_STRUCT:
700 case FFI_TYPE_COMPLEX:
701 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE 708 p_fpr[0] = (
long long) *(
unsigned int *) rvalue << 32;
711 case FFI_TYPE_DOUBLE:
712 p_fpr[0] = *(
unsigned long long *) rvalue;
717 case FFI_TYPE_UINT64:
718 case FFI_TYPE_SINT64:
720 p_gpr[0] = *(
unsigned long *) rvalue;
722 p_gpr[0] = ((
unsigned long *) rvalue)[0],
723 p_gpr[1] = ((
unsigned long *) rvalue)[1];
727 case FFI_TYPE_POINTER:
728 case FFI_TYPE_UINT32:
729 case FFI_TYPE_UINT16:
731 p_gpr[0] = *(
unsigned long *) rvalue;
735 case FFI_TYPE_SINT32:
736 case FFI_TYPE_SINT16:
738 p_gpr[0] = *(
signed long *) rvalue;
760 void (*fun) (ffi_cif *,
void *,
void **,
void *),
768 *(
short *)&closure->tramp [0] = 0x0d10;
769 *(
short *)&closure->tramp [2] = 0x9801;
770 *(
short *)&closure->tramp [4] = 0x1006;
771 *(
short *)&closure->tramp [6] = 0x07f1;
772 *(
long *)&closure->tramp [8] = (
long)codeloc;
775 *(
short *)&closure->tramp [0] = 0x0d10;
776 *(
short *)&closure->tramp [2] = 0xeb01;
777 *(
short *)&closure->tramp [4] = 0x100e;
778 *(
short *)&closure->tramp [6] = 0x0004;
779 *(
short *)&closure->tramp [8] = 0x07f1;
780 *(
long *)&closure->tramp[16] = (long)codeloc;
785 closure->user_data = user_data;
void ffi_closure_helper_SYSV(ffi_closure *, unsigned long *, unsigned long long *, unsigned long *)
static int ffi_check_struct_type(ffi_type *arg)
void *PTR64 __attribute__((mode(DI)))
void ffi_call_SYSV(unsigned(*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, size_t, void(*fn)(void))
#define FFI_TYPE_LONGDOUBLE
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
#define FFI390_RET_DOUBLE
#define FFI390_RET_STRUCT
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
void ffi_closure_SYSV(ffi_closure *)