ffi.h.in (ffi_type_ulong, [...]): Define correctly for 32-bit architectures.
authorTorsten Schoenfeld <kaffeetisch@gmx.de>
Tue, 25 Jul 2006 20:01:22 +0000 (20:01 +0000)
committerAndreas Tobler <andreast@gcc.gnu.org>
Tue, 25 Jul 2006 20:01:22 +0000 (22:01 +0200)
2006-07-25  Torsten Schoenfeld  <kaffeetisch@gmx.de>

* include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly
for 32-bit architectures.
* testsuite/libffi.call/return_ul.c: New test case.

From-SVN: r115739

libffi/ChangeLog
libffi/include/ffi.h.in
libffi/testsuite/libffi.call/return_ul.c [new file with mode: 0644]

index e71397b61cac51a7dec62fbf8a54116f0cc9d82e..c55db3c81c16427eef022ded5f16fdd946847ce4 100644 (file)
@@ -1,3 +1,9 @@
+2006-07-25  Torsten Schoenfeld  <kaffeetisch@gmx.de>
+
+       * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly
+       for 32-bit architectures.
+       * testsuite/libffi.call/return_ul.c: New test case.
+
 2006-07-19  David Daney  <ddaney@avtrex.com>
 
        * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips,
index 426004586894984b43db6728f7a8e62084a83a74..f6f6e1a2e1076e0b343e1228bd8acb8d6475ad8f 100644 (file)
@@ -112,16 +112,24 @@ extern "C" {
  #error "int size not supported"
 #endif
 
-#define ffi_type_ulong         ffi_type_uint64
-#define ffi_type_slong         ffi_type_sint64
 #if LONG_MAX == 2147483647
 # if FFI_LONG_LONG_MAX != 9223372036854775807
 #error "no 64-bit data type supported"
+ #error "no 64-bit data type supported"
 # endif
 #elif LONG_MAX != 9223372036854775807
  #error "long size not supported"
 #endif
 
+#if LONG_MAX == 2147483647
+# define ffi_type_ulong        ffi_type_uint32
+# define ffi_type_slong        ffi_type_sint32
+#elif LONG_MAX == 9223372036854775807
+# define ffi_type_ulong        ffi_type_uint64
+# define ffi_type_slong        ffi_type_sint64
+#else
+ #error "long size not supported"
+#endif
+
 /* The closure code assumes that this works on pointers, i.e. a size_t */
 /* can hold a pointer.                                                 */
 
diff --git a/libffi/testsuite/libffi.call/return_ul.c b/libffi/testsuite/libffi.call/return_ul.c
new file mode 100644 (file)
index 0000000..2510224
--- /dev/null
@@ -0,0 +1,38 @@
+/* Area:       ffi_call
+   Purpose:    Check if unsigned long as return type is handled correctly.
+   Limitations:        none.
+   PR:         none.
+   Originator: <kaffeetisch at gmx dot de> 20060724  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
+{
+  return ul1 + ul2;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  unsigned long res;
+  unsigned long ul1, ul2;
+
+  args[0] = &ffi_type_ulong;
+  args[1] = &ffi_type_ulong;
+  values[0] = &ul1;
+  values[1] = &ul2;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+                    &ffi_type_ulong, args) == FFI_OK);
+
+  ul1 = 1073741823L;
+  ul2 = 1073741824L;
+
+  ffi_call(&cif, FFI_FN(return_ul), &res, values);
+  printf("res: %ld, %ld\n", res, ul1 + ul2);
+  /* { dg-output "res: 2147483647, 2147483647" } */
+
+  exit(0);
+}