61 #define CIF_FLAGS_INT (1 << 0) 62 #define CIF_FLAGS_DINT (1 << 1) 80 void *struct_value_ptr;
82 regp = (
unsigned int *)stack;
83 stackp = (
char *)(regp + 8);
86 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT
88 struct_value_ptr = ecif->
rvalue;
90 struct_value_ptr =
NULL;
94 for (i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types; i != 0; i--, p_arg++)
101 a = (*p_arg)->alignment;
110 if (t == FFI_TYPE_STRUCT)
112 if (z ==
sizeof (
int) && a ==
sizeof (int) && regused < 8)
119 if (z >
sizeof (
int) && regused < 8 - 1)
135 if (argp == stackp && a >
sizeof (
int))
137 stackp = (
char *)
ALIGN(stackp, a);
144 *(
signed int *) argp = (
signed int) *(SINT8 *) *p_argv;
148 *(
unsigned int *) argp = (
unsigned int) *(UINT8 *) *p_argv;
151 case FFI_TYPE_SINT16:
152 *(
signed int *) argp = (
signed int) *(SINT16 *) *p_argv;
155 case FFI_TYPE_UINT16:
156 *(
unsigned int *) argp = (
unsigned int) *(UINT16 *) *p_argv;
161 case FFI_TYPE_UINT32:
162 case FFI_TYPE_SINT32:
163 case FFI_TYPE_POINTER:
164 *(
unsigned int *) argp = *(
unsigned int *) *p_argv;
167 case FFI_TYPE_DOUBLE:
168 case FFI_TYPE_UINT64:
169 case FFI_TYPE_SINT64:
170 case FFI_TYPE_STRUCT:
171 memcpy (argp, *p_argv, z);
179 if ((
sizeof (
int) - 1) & z)
180 z =
ALIGN(z,
sizeof (
int));
186 if (argp == (
char *)regp && regused < 8)
188 regp += z /
sizeof (int);
189 regused += z /
sizeof (int);
195 return struct_value_ptr;
203 switch (cif->rtype->type)
209 case FFI_TYPE_STRUCT:
210 if (cif->rtype->size == sizeof (
int) &&
211 cif->rtype->alignment == sizeof (
int))
217 case FFI_TYPE_DOUBLE:
218 case FFI_TYPE_SINT64:
219 case FFI_TYPE_UINT64:
232 ffi_call (ffi_cif *cif,
void (*fn) (),
void *rvalue,
void **avalue)
243 && cif->rtype->type == FFI_TYPE_STRUCT
244 && (cif->rtype->size != sizeof (
int)
245 || cif->rtype->alignment != sizeof (
int)))
273 unsigned int regused;
280 for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
287 a = (*p_arg)->alignment;
296 if (t == FFI_TYPE_STRUCT)
298 if (z ==
sizeof (
int) && a ==
sizeof (
int) && regused < 8)
305 if (z >
sizeof (
int) && regused < 8 - 1)
321 if (argp == stackp && a >
sizeof (
int))
323 stackp = (
char *)
ALIGN(stackp, a);
327 if (z <
sizeof (
int) && t != FFI_TYPE_STRUCT)
328 *p_argv = (
void *) (argp +
sizeof (int) - z);
330 *p_argv = (
void *) argp;
333 if ((
sizeof (
int) - 1) & z)
334 z =
ALIGN(z,
sizeof (
int));
340 if (argp == (
char *)regp && regused < 8)
342 regp += z /
sizeof (int);
343 regused += z /
sizeof (int);
358 arg_area = (
void**)
alloca (cif->nargs * sizeof (
void *));
362 (closure->fun) (cif, resp, arg_area, closure->user_data);
369 void (*fun)(ffi_cif*,
void*,
void**,
void*),
370 void *user_data,
void *codeloc)
372 unsigned int *tramp = (
unsigned int *) codeloc;
377 if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags)
383 tramp[0] = 0x5d400000 | (((
unsigned int)fn) >> 16);
385 tramp[1] = 0x5da00000 | ((
unsigned int)closure >> 16);
387 tramp[2] = 0x594a0000 | (((
unsigned int)fn) & 0xffff);
389 tramp[3] = 0xf400c40a;
391 tramp[4] = 0x59ad0000 | ((
unsigned int)closure & 0xffff);
396 closure->user_data = user_data;
#define FFI_TRAMPOLINE_SIZE
void ffi_cacheflush_OBSD(unsigned int, unsigned int)
void ffi_closure_struct_OBSD(ffi_closure *)
unsigned int ffi_closure_OBSD_inner(ffi_closure *, void *, unsigned int *, char *)
static void ffi_prep_closure_args_OBSD(ffi_cif *cif, void **avalue, unsigned int *regp, char *stackp)
void ffi_closure_OBSD(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)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
void ffi_call_OBSD(unsigned int, extended_cif *, unsigned int, void *, void(*fn)())
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)