30 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 39 register unsigned int i;
40 register void **p_argv;
42 register ffi_type **p_arg;
47 if ( ecif->
cif->flags == FFI_TYPE_STRUCT ) {
49 *(
void **) argp = ecif->
rvalue;
55 for (i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types; (i != 0); i--, p_arg++, p_argv++)
66 if (z <
sizeof(
int)) {
68 switch ((*p_arg)->type)
71 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
74 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
77 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
80 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
82 memcpy(argp, *p_argv, (*p_arg)->size);
87 }
else if ( z ==
sizeof(
int)) {
88 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
96 return ALIGN(
MIN(stack - argp, 6*4), 8);
103 unsigned i, bytes = 0;
105 for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) {
106 if ((*ptr)->size == 0)
107 return FFI_BAD_TYPEDEF;
114 if (((*ptr)->alignment - 1) & bytes)
115 bytes =
ALIGN(bytes, (*ptr)->alignment);
117 bytes +=
ALIGN((*ptr)->size, 4);
121 bytes =
ALIGN(bytes, 8);
124 if (cif->rtype->type == FFI_TYPE_STRUCT) {
125 bytes +=
sizeof(
void*);
128 bytes =
ALIGN(bytes, 8);
134 switch (cif->rtype->type) {
137 case FFI_TYPE_DOUBLE:
138 cif->flags = (unsigned) cif->rtype->type;
140 case FFI_TYPE_SINT64:
141 case FFI_TYPE_UINT64:
142 cif->flags = (
unsigned) FFI_TYPE_SINT64;
144 case FFI_TYPE_STRUCT:
146 if (cif->rtype->size <= 4)
148 cif->flags = (unsigned)FFI_TYPE_INT;
149 else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8))
151 cif->flags = (unsigned)FFI_TYPE_DOUBLE;
154 cif->flags = (unsigned)FFI_TYPE_STRUCT;
157 cif->flags = (unsigned)FFI_TYPE_INT;
173 void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
177 int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT));
188 if ((rvalue ==
NULL ) && (cif->flags == FFI_TYPE_STRUCT))
190 else if (small_struct)
205 memcpy (rvalue, &temp, cif->rtype->size);
228 memcpy (__tramp, ffi_metag_trampoline,
sizeof(ffi_metag_trampoline));
229 *(
unsigned int*) &__tramp[40] = __ctx;
230 *(
unsigned int*) &__tramp[44] = __fun;
232 __builtin_meta2_cachewd(&__tramp[0], 1);
233 __builtin_meta2_cachewd(&__tramp[47], 1);
243 void (*fun)(ffi_cif*,
void*,
void**,
void*),
247 void (*closure_func)(ffi_closure*) =
NULL;
255 (
unsigned char*)&closure->tramp[0],
256 (
unsigned int)closure_func,
257 (
unsigned int)codeloc);
260 closure->user_data = user_data;
269 ffi_closure *closure;
278 arg_area = (
void**)
alloca (cif->nargs * sizeof (
void*));
289 (closure->fun) ( cif, *respp, arg_area, closure->user_data);
295 void **avalue, ffi_cif *cif,
298 register unsigned int i;
299 register void **p_argv;
301 register ffi_type **p_arg;
307 if ( cif->flags == FFI_TYPE_STRUCT ) {
309 *rvalue = *(
void **) argp;
314 for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) {
318 alignment = (*p_arg)->alignment;
321 if ((alignment - 1) & (unsigned)argp)
322 argp = (
char *)
ALIGN(argp, alignment);
325 *p_argv = (
void*) argp;
void FFI_HIDDEN ffi_closure_SYSV_inner(ffi_closure *closure, struct call_context *context, void *stack)
void ffi_call_SYSV(unsigned(*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, size_t, 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)
#define FFI_ASSERT_VALID_TYPE(x)
void ffi_prep_args(char *stack, extended_cif *ecif)
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
void ffi_closure_SYSV(ffi_closure *)