OSDN Git Service

2006-07-25 Torsten Schoenfeld <kaffeetisch@gmx.de>
authorandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jul 2006 20:01:22 +0000 (20:01 +0000)
committerandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jul 2006 20:01:22 +0000 (20:01 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115739 138bc75d-0d04-0410-961f-82ee72b054a4

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

index e71397b..c55db3c 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 4260045..f6f6e1a 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);
+}