1 /* -----------------------------------------------------------------------
4 m68k Foreign Function Interface
5 ----------------------------------------------------------------------- */
8 #include <ffi_common.h>
12 /* ffi_prep_args is called by the assembly routine once stack space has
13 been allocated for the function's arguments. */
16 ffi_prep_args (void *stack
, extended_cif
*ecif
)
24 void *struct_value_ptr
;
29 if (ecif
->cif
->rtype
->type
== FFI_TYPE_STRUCT
30 && ecif
->cif
->rtype
->size
> 8)
31 struct_value_ptr
= ecif
->rvalue
;
33 struct_value_ptr
= NULL
;
35 avn
= ecif
->cif
->nargs
;
36 p_argv
= ecif
->avalue
;
38 for (i
= ecif
->cif
->nargs
, p_arg
= ecif
->cif
->arg_types
;
44 /* Align if necessary. */
45 if (((*p_arg
)->alignment
- 1) & (unsigned) argp
)
46 argp
= (char *) ALIGN (argp
, (*p_arg
)->alignment
);
54 switch ((*p_arg
)->type
)
57 *(signed int *) argp
= (signed int) *(SINT8
*) *p_argv
;
61 *(unsigned int *) argp
= (unsigned int) *(UINT8
*) *p_argv
;
65 *(signed int *) argp
= (signed int) *(SINT16
*) *p_argv
;
69 *(unsigned int *) argp
= (unsigned int) *(UINT16
*) *p_argv
;
73 memcpy (argp
+ sizeof (int) - z
, *p_argv
, z
);
82 memcpy (argp
, *p_argv
, z
);
88 return struct_value_ptr
;
91 #define CIF_FLAGS_INT 1
92 #define CIF_FLAGS_DINT 2
93 #define CIF_FLAGS_FLOAT 4
94 #define CIF_FLAGS_DOUBLE 8
95 #define CIF_FLAGS_LDOUBLE 16
96 #define CIF_FLAGS_POINTER 32
97 #define CIF_FLAGS_STRUCT 64
99 /* Perform machine dependent cif processing */
101 ffi_prep_cif_machdep (ffi_cif
*cif
)
103 /* Set the return type flag */
104 switch (cif
->rtype
->type
)
110 case FFI_TYPE_STRUCT
:
111 if (cif
->rtype
->size
> 4 && cif
->rtype
->size
<= 8)
112 cif
->flags
= CIF_FLAGS_DINT
;
113 else if (cif
->rtype
->size
<= 4)
114 cif
->flags
= CIF_FLAGS_STRUCT
;
120 cif
->flags
= CIF_FLAGS_FLOAT
;
123 case FFI_TYPE_DOUBLE
:
124 cif
->flags
= CIF_FLAGS_DOUBLE
;
127 case FFI_TYPE_LONGDOUBLE
:
128 cif
->flags
= CIF_FLAGS_LDOUBLE
;
131 case FFI_TYPE_POINTER
:
132 cif
->flags
= CIF_FLAGS_POINTER
;
135 case FFI_TYPE_SINT64
:
136 case FFI_TYPE_UINT64
:
137 cif
->flags
= CIF_FLAGS_DINT
;
141 cif
->flags
= CIF_FLAGS_INT
;
148 extern void ffi_call_SYSV (void *(*) (void *, extended_cif
*),
150 unsigned, unsigned, unsigned,
151 void *, void (*fn
) ());
154 ffi_call (ffi_cif
*cif
, void (*fn
) (), void *rvalue
, void **avalue
)
159 ecif
.avalue
= avalue
;
161 /* If the return value is a struct and we don't have a return value
162 address then we need to make one. */
165 && cif
->rtype
->type
== FFI_TYPE_STRUCT
166 && cif
->rtype
->size
> 8)
167 ecif
.rvalue
= alloca (cif
->rtype
->size
);
169 ecif
.rvalue
= rvalue
;
175 ffi_call_SYSV (ffi_prep_args
, &ecif
, cif
->bytes
,
176 cif
->flags
, cif
->rtype
->size
* 8,