From cb4132fe11e1852aa1bb108d69ace94f09296c5b Mon Sep 17 00:00:00 2001 From: Torsten Schoenfeld Date: Tue, 25 Jul 2006 20:01:22 +0000 Subject: [PATCH] ffi.h.in (ffi_type_ulong, [...]): Define correctly for 32-bit architectures. 2006-07-25 Torsten Schoenfeld * 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 --- libffi/ChangeLog | 6 ++++ libffi/include/ffi.h.in | 14 +++++++-- libffi/testsuite/libffi.call/return_ul.c | 38 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 libffi/testsuite/libffi.call/return_ul.c diff --git a/libffi/ChangeLog b/libffi/ChangeLog index e71397b61ca..c55db3c81c1 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,9 @@ +2006-07-25 Torsten Schoenfeld + + * 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 * 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 42600458689..f6f6e1a2e10 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 00000000000..25102240bc8 --- /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: 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); +}