48#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST
57 switch(cif->rtype->type) {
62 cif->flags = cif->rtype->type;
66 cif->flags = FFI_TYPE_UINT32;
71 cif->flags = FFI_TYPE_UINT64;
74 cif->flags = FFI_TYPE_STRUCT;
76 if (cif->rtype->size > 4 * 4) {
79 cif->flags = FFI_TYPE_STRUCT;
85 cif->flags = FFI_TYPE_UINT32;
92 cif->bytes =
ALIGN(cif->bytes, 16);
117 FFI_ASSERT (((
unsigned long) stack & 0x7) == 0);
120 addr = (
unsigned long*)stack;
123 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT && ecif->
cif->rtype->size > 16)
128 for (
i = ecif->
cif->nargs,
ptr = ecif->
cif->arg_types;
130 i--,
ptr++, p_argv.v++)
132 switch ((*ptr)->type)
135 *addr++ = **p_argv.sc;
138 *addr++ = **p_argv.uc;
140 case FFI_TYPE_SINT16:
141 *addr++ = **p_argv.ss;
143 case FFI_TYPE_UINT16:
144 *addr++ = **p_argv.us;
148 case FFI_TYPE_UINT32:
149 case FFI_TYPE_SINT32:
150 case FFI_TYPE_POINTER:
151 *addr++ = **p_argv.i;
153 case FFI_TYPE_DOUBLE:
154 case FFI_TYPE_UINT64:
155 case FFI_TYPE_SINT64:
156 if (((
unsigned long)addr & 4) != 0)
158 *(
unsigned long long*)addr = **p_argv.ll;
159 addr +=
sizeof(
unsigned long long) /
sizeof (addr);
162 case FFI_TYPE_STRUCT:
167 if (((
unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4)
170 offs = (
unsigned long) addr - (
unsigned long) stack;
179 addr += (
size + 3) / 4;
190void ffi_call(ffi_cif* cif,
void(*fn)(
void),
void *rvalue,
void **avalue)
193 unsigned long rsize = cif->rtype->size;
194 int flags = cif->flags;
206 if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue ==
NULL))
221 if (alloc !=
NULL && rvalue !=
NULL)
222 memcpy(rvalue, alloc, rsize);
231 void (*fun)(ffi_cif*,
void*,
void**,
void*),
245 closure->user_data = user_data;
254 ffi_type **arg_types;
264 int rtype = cif->rtype->type;
265 if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4)
272 arg_types = cif->arg_types;
273 avalue =
alloca(cif->nargs *
sizeof(
void *));
275 for (
i = 0;
i < cif->nargs;
i++)
277 if (arg_types[
i]->alignment == 8 && (areg & 1) != 0)
284 if (arg_types[
i]->
type == FFI_TYPE_STRUCT)
286 int numregs = ((arg_types[
i]->size + 3) & ~3) / 4;
291 avalue[
i] = &values[areg];
292 areg += (arg_types[
i]->size + 3) / 4;
295 (closure->fun)(cif, rvalue, avalue, closure->user_data);
void ffi_closure_SYSV(ffi_closure *)
void FFI_HIDDEN ffi_closure_SYSV_inner(ffi_closure *closure, struct call_context *context, void *stack)
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_TRAMPOLINE_SIZE
void ffi_prep_args(char *stack, extended_cif *ecif)
VALUE type(ANYARGS)
ANYARGS-ed function type.
const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN
void ffi_cacheflush(void *start, void *end)
#define FFI_REGISTER_NARGS