aboutsummaryrefslogtreecommitdiff
path: root/libffi/src
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-02-13 16:18:13 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-02-13 16:18:13 +0000
commit30255340f644e560f84b0563a1bd3d97ef38c069 (patch)
tree71b968dc5cf8824d0de4f4ad075137f6d9b67a74 /libffi/src
parent662dae0db08b878a49f7a11cc35f8441fe7428b3 (diff)
downloadgcc-30255340f644e560f84b0563a1bd3d97ef38c069.zip
gcc-30255340f644e560f84b0563a1bd3d97ef38c069.tar.gz
gcc-30255340f644e560f84b0563a1bd3d97ef38c069.tar.bz2
re PR libffi/60073 (64-bit libffi.call/cls_double_va.c FAILs after recent modification)
PR libffi/60073 * src/sparc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. (FFI_EXTRA_CIF_FIELDS): Likewise. (FFI_NATIVE_RAW_API): Move around. * src/sparc/ffi.c (ffi_prep_cif_machdep_core): New function from... (ffi_prep_cif_machdep): ...here. Call ffi_prep_cif_machdep_core. (ffi_prep_cif_machdep_var): New function. (ffi_closure_sparc_inner_v9): Do not pass anonymous FP arguments in FP registers. * doc/libffi.texi (Introduction): Fix inaccuracy. From-SVN: r207763
Diffstat (limited to 'libffi/src')
-rw-r--r--libffi/src/sparc/ffi.c29
-rw-r--r--libffi/src/sparc/ffitarget.h7
2 files changed, 28 insertions, 8 deletions
diff --git a/libffi/src/sparc/ffi.c b/libffi/src/sparc/ffi.c
index 1ac5d46..a4ee84ec 100644
--- a/libffi/src/sparc/ffi.c
+++ b/libffi/src/sparc/ffi.c
@@ -249,7 +249,7 @@ int ffi_prep_args_v9(char *stack, extended_cif *ecif)
}
/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+static ffi_status ffi_prep_cif_machdep_core(ffi_cif *cif)
{
int wordsize;
@@ -334,6 +334,19 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
return FFI_OK;
}
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+ cif->nfixedargs = cif->nargs;
+ return ffi_prep_cif_machdep_core (cif);
+}
+
+ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs,
+ unsigned int ntotalargs)
+{
+ cif->nfixedargs = nfixedargs;
+ return ffi_prep_cif_machdep_core (cif);
+}
+
int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt)
{
ffi_type **ptr = &arg->elements[0];
@@ -604,8 +617,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
/* Copy the caller's structure return address so that the closure
returns the data directly to the caller. */
- if (cif->flags == FFI_TYPE_VOID
- && cif->rtype->type == FFI_TYPE_STRUCT)
+ if (cif->flags == FFI_TYPE_VOID && cif->rtype->type == FFI_TYPE_STRUCT)
{
rvalue = (void *) gpr[0];
/* Skip the structure return address. */
@@ -619,6 +631,10 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
/* Grab the addresses of the arguments from the stack frame. */
for (i = 0; i < cif->nargs; i++)
{
+ /* If the function is variadic, FP arguments are passed in FP
+ registers only if the corresponding parameter is named. */
+ const int named = (i < cif->nfixedargs);
+
if (arg_types[i]->type == FFI_TYPE_STRUCT)
{
if (arg_types[i]->size > 16)
@@ -633,7 +649,9 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
0,
(char *) &gpr[argn],
(char *) &gpr[argn],
- (char *) &fpr[argn]);
+ named
+ ? (char *) &fpr[argn]
+ : (char *) &gpr[argn]);
avalue[i] = &gpr[argn];
argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
}
@@ -649,6 +667,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
argn++;
#endif
if (i < fp_slot_max
+ && named
&& (arg_types[i]->type == FFI_TYPE_FLOAT
|| arg_types[i]->type == FFI_TYPE_DOUBLE
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
@@ -662,7 +681,7 @@ ffi_closure_sparc_inner_v9(ffi_closure *closure,
}
/* Invoke the closure. */
- (closure->fun) (cif, rvalue, avalue, closure->user_data);
+ closure->fun (cif, rvalue, avalue, closure->user_data);
/* Tell ffi_closure_sparc how to perform return type promotions. */
return cif->rtype->type;
diff --git a/libffi/src/sparc/ffitarget.h b/libffi/src/sparc/ffitarget.h
index d89f787..a1f5e49 100644
--- a/libffi/src/sparc/ffitarget.h
+++ b/libffi/src/sparc/ffitarget.h
@@ -58,16 +58,17 @@ typedef enum ffi_abi {
} ffi_abi;
#endif
+#define FFI_TARGET_SPECIFIC_VARIADIC 1
+#define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs
+
/* ---- Definitions for closures ----------------------------------------- */
#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
#ifdef SPARC64
#define FFI_TRAMPOLINE_SIZE 24
#else
#define FFI_TRAMPOLINE_SIZE 16
#endif
+#define FFI_NATIVE_RAW_API 0
#endif
-