diff options
author | Torsten Schoenfeld <kaffeetisch@gmx.de> | 2006-07-25 20:01:22 +0000 |
---|---|---|
committer | Andreas Tobler <andreast@gcc.gnu.org> | 2006-07-25 22:01:22 +0200 |
commit | cb4132fe11e1852aa1bb108d69ace94f09296c5b (patch) | |
tree | 75a10258420b179909b785eb7bb52eb01ba11601 /libffi | |
parent | 6583cf153de60fde983298105321deb3e5b0b3cd (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libffi/include/ffi.h.in | 14 | ||||
-rw-r--r-- | libffi/testsuite/libffi.call/return_ul.c | 38 |
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); +} |