32 #include <sys/cachectl.h> 37 #define CODE_ENDIAN(x) (x) 39 #define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) 57 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT)
59 *(
void **) argp = ecif->
rvalue;
65 for (i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types;
66 (i != 0); i--, p_arg++)
72 alignment = (((*p_arg)->alignment - 1) | 3) + 1;
75 if ((alignment - 1) & (unsigned) argp)
76 argp = (
char *)
ALIGN (argp, alignment);
83 switch ((*p_arg)->type)
86 *(
signed int *) argp = (
signed int) *(SINT8 *) (*p_argv);
90 *(
unsigned int *) argp = (
unsigned int) *(UINT8 *) (*p_argv);
94 *(
signed int *) argp = (
signed int) *(SINT16 *) (*p_argv);
98 *(
unsigned int *) argp = (
unsigned int) *(UINT16 *) (*p_argv);
101 case FFI_TYPE_STRUCT:
102 memcpy (argp, *p_argv, (*p_arg)->size);
109 else if (z ==
sizeof (
int))
111 *(
unsigned int *) argp = (
unsigned int) *(UINT32 *) (*p_argv);
115 if ((*p_arg)->type == FFI_TYPE_STRUCT)
117 memcpy (argp, *p_argv, z);
122 memcpy (argp, *p_argv, z);
137 switch (cif->rtype->type)
140 cif->flags = (unsigned) cif->rtype->type;
143 case FFI_TYPE_STRUCT:
144 cif->flags = (
unsigned) cif->rtype->type;
147 case FFI_TYPE_SINT64:
148 case FFI_TYPE_UINT64:
149 case FFI_TYPE_DOUBLE:
150 cif->flags = FFI_TYPE_DOUBLE;
155 cif->flags = FFI_TYPE_INT;
164 unsigned *,
void (*fn) (
void));
167 ffi_call (ffi_cif * cif,
void (*fn) (
void),
void *rvalue,
void **avalue)
176 if ((rvalue ==
NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
187 cif->flags, ecif.
rvalue, fn);
200 void **arg_area, **p_argv;
201 ffi_cif *cif = closure->cif;
202 char *argp = (
char *) args;
206 arg_area = (
void **)
alloca (cif->nargs * sizeof (
void *));
209 if (cif->flags == FFI_TYPE_STRUCT)
211 rvalue = *(
void **) argp;
217 for (i = 0, p_argt = cif->arg_types; i < cif->nargs;
218 i++, p_argt++, p_argv++)
224 alignment = (((*p_argt)->alignment - 1) | 3) + 1;
227 if ((alignment - 1) & (unsigned) argp)
228 argp = (
char *)
ALIGN (argp, alignment);
231 *p_argv = (
void *) argp;
235 (closure->fun) (cif, rvalue, arg_area, closure->user_data);
244 void (*fun) (ffi_cif *,
void *,
void **,
void *),
245 void *user_data,
void *codeloc)
264 closure->user_data = user_data;
int ffi_closure_inner_ARCompact(ffi_closure *closure, void *rvalue, ffi_arg *args)
#define FFI_TRAMPOLINE_SIZE
void ffi_closure_ARCompact(void)
void ffi_call_ARCompact(void(*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void(*fn)(void))
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)
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)