diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-02-13 16:18:13 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-02-13 16:18:13 +0000 |
commit | 30255340f644e560f84b0563a1bd3d97ef38c069 (patch) | |
tree | 71b968dc5cf8824d0de4f4ad075137f6d9b67a74 /libffi/src | |
parent | 662dae0db08b878a49f7a11cc35f8441fe7428b3 (diff) | |
download | gcc-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.c | 29 | ||||
-rw-r--r-- | libffi/src/sparc/ffitarget.h | 7 |
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 - |