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