Commit d578b89619cf3d2baff027b203619dc307fc12e3

Anthony Green 2012-02-15T00:18:18

Fix ABI check regression

diff --git a/Makefile.in b/Makefile.in
index 6bf6cc5..799a0e2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -403,7 +403,6 @@ psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
-sys_symbol_underscore = @sys_symbol_underscore@
 sysconfdir = @sysconfdir@
 target = @target@
 target_alias = @target_alias@
diff --git a/configure b/configure
index cec095b..f4c3e30 100755
--- a/configure
+++ b/configure
@@ -14395,7 +14395,7 @@ case "$target" in
 $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
 
      ;;
-     *-apple-darwin1[10]* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
+     *-apple-darwin1[10]* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
 
 $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
 
diff --git a/doc/libffi.info b/doc/libffi.info
index c0fb005..402f760 100644
--- a/doc/libffi.info
+++ b/doc/libffi.info
@@ -1,10 +1,10 @@
-This is /home/green/libffi/doc/libffi.info, produced by makeinfo
-version 4.13 from /home/green/libffi/doc/libffi.texi.
+This is ../libffi/doc/libffi.info, produced by makeinfo version 4.13
+from ../libffi/doc/libffi.texi.
 
 This manual is for Libffi, a portable foreign-function interface
 library.
 
-   Copyright (C) 2008, 2010 Red Hat, Inc.
+   Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU General Public License as
@@ -27,7 +27,7 @@ libffi
 This manual is for Libffi, a portable foreign-function interface
 library.
 
-   Copyright (C) 2008, 2010 Red Hat, Inc.
+   Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU General Public License as
@@ -115,8 +115,6 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
      want.  *note Multiple ABIs:: for more information.
 
      NARGS is the number of arguments that this function accepts.
-     `libffi' does not yet handle varargs functions; see *note Missing
-     Features:: for more information.
 
      RTYPE is a pointer to an `ffi_type' structure that describes the
      return type of the function.  *Note Types::.
@@ -129,6 +127,30 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
      properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is
      incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid.
 
+   If the function being called is variadic (varargs) then
+`ffi_prep_cif_var' must be used instead of `ffi_prep_cif'.
+
+ -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi
+          varabi, unsigned int NFIXEDARGS, unsigned int varntotalargs,
+          ffi_type *RTYPE, ffi_type **ARGTYPES)
+     This initializes CIF according to the given parameters for a call
+     to a variadic function.  In general it's operation is the same as
+     for `ffi_prep_cif' except that:
+
+     NFIXEDARGS is the number of fixed arguments, prior to any variadic
+     arguments.  It must be greater than zero.
+
+     NTOTALARGS the total number of arguments, including variadic and
+     fixed arguments.
+
+     Note that, different cif's must be prepped for calls to the same
+     function when different numbers of arguments are passed.
+
+     Also note that a call to `ffi_prep_cif_var' with
+     NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
+     `ffi_prep_cif'.
+
+
    To call a function using an initialized `ffi_cif', use the
 `ffi_call' function:
 
@@ -511,9 +533,7 @@ File: libffi.info,  Node: Missing Features,  Next: Index,  Prev: Using libffi,  
 `libffi' is missing a few features.  We welcome patches to add support
 for these.
 
-   * There is no support for calling varargs functions.  This may work
-     on some platforms, depending on how the ABI is defined, but it is
-     not reliable.
+   * Variadic closures.
 
    * There is no support for bit fields in structures.
 
@@ -521,6 +541,9 @@ for these.
 
    * The "raw" API is undocumented.
 
+   Note that variadic support is very new and tested on a relatively
+small number of platforms.
+
 
 File: libffi.info,  Node: Index,  Prev: Missing Features,  Up: Top
 
@@ -538,11 +561,12 @@ Index
 * closure API:                           The Closure API.      (line 13)
 * closures:                              The Closure API.      (line 13)
 * FFI:                                   Introduction.         (line 31)
-* ffi_call:                              The Basics.           (line 41)
+* ffi_call:                              The Basics.           (line 63)
 * ffi_closure_alloc:                     The Closure API.      (line 19)
 * ffi_closure_free:                      The Closure API.      (line 26)
 * FFI_CLOSURES:                          The Closure API.      (line 13)
 * ffi_prep_cif:                          The Basics.           (line 16)
+* ffi_prep_cif_var:                      The Basics.           (line 39)
 * ffi_prep_closure_loc:                  The Closure API.      (line 34)
 * ffi_status <1>:                        The Closure API.      (line 37)
 * ffi_status:                            The Basics.           (line 18)
@@ -570,24 +594,24 @@ Index
 * ffi_type_void:                         Primitive Types.      (line 10)
 * Foreign Function Interface:            Introduction.         (line 31)
 * void <1>:                              The Closure API.      (line 20)
-* void:                                  The Basics.           (line 43)
+* void:                                  The Basics.           (line 65)
 
 
 
 Tag Table:
-Node: Top724
-Node: Introduction1466
-Node: Using libffi3102
-Node: The Basics3588
-Node: Simple Example6374
-Node: Types7401
-Node: Primitive Types7684
-Node: Structures9504
-Node: Type Example10364
-Node: Multiple ABIs11587
-Node: The Closure API11958
-Node: Closure Example14902
-Node: Missing Features16461
-Node: Index16954
+Node: Top712
+Node: Introduction1460
+Node: Using libffi3096
+Node: The Basics3582
+Node: Simple Example7224
+Node: Types8251
+Node: Primitive Types8534
+Node: Structures10354
+Node: Type Example11214
+Node: Multiple ABIs12437
+Node: The Closure API12808
+Node: Closure Example15752
+Node: Missing Features17311
+Node: Index17764
 
 End Tag Table
diff --git a/include/Makefile.in b/include/Makefile.in
index 6d7634a..b7d88da 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -114,7 +114,6 @@ ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
 FGREP = @FGREP@
 GREP = @GREP@
 HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -206,7 +205,6 @@ psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
-sys_symbol_underscore = @sys_symbol_underscore@
 sysconfdir = @sysconfdir@
 target = @target@
 target_alias = @target_alias@
diff --git a/man/Makefile.in b/man/Makefile.in
index 7b47d07..2653d69 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -112,7 +112,6 @@ ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
 FGREP = @FGREP@
 GREP = @GREP@
 HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -204,7 +203,6 @@ psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
-sys_symbol_underscore = @sys_symbol_underscore@
 sysconfdir = @sysconfdir@
 target = @target@
 target_alias = @target_alias@
@@ -217,8 +215,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign
-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
+EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
+man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
 all: all-am
 
 .SUFFIXES:
diff --git a/patches/fix-xfails b/patches/fix-xfails
index 2d37b2e..4f65e72 100644
--- a/patches/fix-xfails
+++ b/patches/fix-xfails
@@ -68,12 +68,12 @@ Index: libffi/src/prep_cif.c
    FFI_ASSERT(cif != NULL);
  #ifndef X86_WIN32
 -  FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
-+  if ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI))
++  if (! (abi > FFI_FIRST_ABI) && (abi <= FFI_LAST_ABI))
 +    return FFI_BAD_ABI;
  #else
 -  FFI_ASSERT(abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI
 -	     || abi == FFI_THISCALL);
-+  if (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL)
++  if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL))
 +    return FFI_BAD_ABI;
  #endif
  
diff --git a/src/prep_cif.c b/src/prep_cif.c
index cc2fb74..f50a63c 100644
--- a/src/prep_cif.c
+++ b/src/prep_cif.c
@@ -112,10 +112,10 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
   FFI_ASSERT(nfixedargs <= ntotalargs);
 
 #ifndef X86_WIN32
-  if ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI))
+  if (! (abi > FFI_FIRST_ABI) && (abi <= FFI_LAST_ABI))
     return FFI_BAD_ABI;
 #else
-  if (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL)
+  if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL))
     return FFI_BAD_ABI;
 #endif
 
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index b446655..bbb634f 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -89,7 +89,6 @@ ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
 FGREP = @FGREP@
 GREP = @GREP@
 HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -181,7 +180,6 @@ psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
-sys_symbol_underscore = @sys_symbol_underscore@
 sysconfdir = @sysconfdir@
 target = @target@
 target_alias = @target_alias@