aboutsummaryrefslogtreecommitdiff
path: root/libffi
diff options
context:
space:
mode:
authorTorsten Schoenfeld <kaffeetisch@gmx.de>2006-07-25 20:01:22 +0000
committerAndreas Tobler <andreast@gcc.gnu.org>2006-07-25 22:01:22 +0200
commitcb4132fe11e1852aa1bb108d69ace94f09296c5b (patch)
tree75a10258420b179909b785eb7bb52eb01ba11601 /libffi
parent6583cf153de60fde983298105321deb3e5b0b3cd (diff)
downloadgcc-cb4132fe11e1852aa1bb108d69ace94f09296c5b.zip
gcc-cb4132fe11e1852aa1bb108d69ace94f09296c5b.tar.gz
gcc-cb4132fe11e1852aa1bb108d69ace94f09296c5b.tar.bz2
ffi.h.in (ffi_type_ulong, [...]): Define correctly for 32-bit architectures.
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
Diffstat (limited to 'libffi')
-rw-r--r--libffi/ChangeLog6
-rw-r--r--libffi/include/ffi.h.in14
-rw-r--r--libffi/testsuite/libffi.call/return_ul.c38
3 files changed, 55 insertions, 3 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index e71397b..c55db3c 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -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,
diff --git a/libffi/include/ffi.h.in b/libffi/include/ffi.h.in
index 4260045..f6f6e1a 100644
--- a/libffi/include/ffi.h.in
+++ b/libffi/include/ffi.h.in
@@ -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
index 0000000..2510224
--- /dev/null
+++ b/libffi/testsuite/libffi.call/return_ul.c
@@ -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);
+}