]> gcc.gnu.org Git - gcc.git/commitdiff
re PR libffi/60073 (64-bit libffi.call/cls_double_va.c FAILs after recent modification)
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 13 Feb 2014 16:18:13 +0000 (16:18 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 13 Feb 2014 16:18:13 +0000 (16:18 +0000)
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

libffi/ChangeLog
libffi/doc/libffi.texi
libffi/src/sparc/ffi.c
libffi/src/sparc/ffitarget.h

index 6d531de099a38b9cd6ec81f595f27f44bcfc3bdf..f4fe5178cfeee9ecdfe4af901bdd6a740381b468 100644 (file)
@@ -1,3 +1,16 @@
+2014-02-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       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.
+
 2013-12-10  Alan Modra  <amodra@gmail.com>
 
        * src/powerpc/ffitarget.h: Import from upstream.
        * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
        just return FFI_BAD_ABI when things are wrong.
 
-2012-02-11  Eric Botcazou  <ebotcazou@adacore.com>
+2011-02-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * src/sparc/v9.S (STACKFRAME): Bump to 176.
 
index 57dae0b84cd8df758795200d73f6f3c37b2606c4..04888ece62ef82c1ead0aeff424b801a0780bd52 100644 (file)
@@ -63,14 +63,14 @@ section entitled ``GNU General Public License''.
 @node Introduction
 @chapter What is libffi?
 
-Compilers for high level languages generate code that follow certain
+Compilers for high-level languages generate code that follow certain
 conventions.  These conventions are necessary, in part, for separate
 compilation to work.  One such convention is the @dfn{calling
 convention}.  The calling convention is a set of assumptions made by
 the compiler about where function arguments will be found on entry to
 a function.  A calling convention also specifies where the return
-value for a function is found.  The calling convention is also
-sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}.
+value for a function is found.  The calling convention is part of
+what is called the @dfn{ABI} or @dfn{Application Binary Interface}.
 @cindex calling convention
 @cindex ABI
 @cindex Application Binary Interface
index 1ac5d464e8b992770dfe1f90b685f0eb5ba7cdf6..a4ee84ec51471f1caa6244a580ee2f3dc4916fe0 100644 (file)
@@ -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;
index d89f7877a815090609883a410defb7cbd6bb12f3..a1f5e494820f16584f7e6c390cdd10a950d3aa37 100644 (file)
@@ -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
-
This page took 0.074073 seconds and 5 git commands to generate.