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 *);
108ffi_check_struct_type (ffi_type *
arg)
114 while (
arg->type == FFI_TYPE_STRUCT
115 &&
arg->elements[0] && !
arg->elements[1])
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;
223 type = ffi_check_struct_type (*
ptr);
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;
432 type = ffi_check_struct_type (*
ptr);
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;
603 type = ffi_check_struct_type (*
ptr);
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_SYSV(ffi_closure *)
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
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
void ffi_prep_args(char *stack, extended_cif *ecif)
void *PTR64 __attribute__((mode(DI)))
VALUE type(ANYARGS)
ANYARGS-ed function type.
#define FFI390_RET_DOUBLE
#define FFI390_RET_STRUCT
void ffi_closure_helper_SYSV(ffi_closure *, unsigned long *, unsigned long long *, unsigned long *)