ffi_type_ulong and ffi_type_slong incorrectly defined
Andreas Tobler
toa@pop.agri.ch
Tue Jul 25 12:51:00 GMT 2006
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);
> +}
More information about the Java-patches
mailing list