This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ffi_type_ulong and ffi_type_slong incorrectly defined


Hi Torsten,

Torsten Schoenfeld wrote:

on some platforms (well, mine at least), the long types are incorrectly
defined and unusable.  The problem is that they are unconditionally
defined to be ffi_type_uint64 and ffi_type_sint64 respectively.  But
that's apparently too big for my longs.

I attach a patch that seems to fix the problem for me, plus a test case
that fails without the patch and passes with the patch.

Thank you very much for finding this one.
I can confirm that the test case fails on all my 32-bit platforms without your patch. On 64-bit sparcv9 it succeeds.
Applying your patch makes the 32-bit world happy again.


I do not have the right to approve, someone else has to.

Once we get approval ok, I can commit for you.

Below the necessary ChangeLog entry.


Thanks again,


Andreas

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.





------------------------------------------------------------------------


Index: include/ffi.h.in
===================================================================
--- include/ffi.h.in (revision 115719)
+++ include/ffi.h.in (working copy)
@@ -112,16 +112,24 @@
#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. */
Index: testsuite/libffi.call/return_ul.c
===================================================================
--- testsuite/libffi.call/return_ul.c (revision 0)
+++ testsuite/libffi.call/return_ul.c (revision 0)
@@ -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);
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]