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
This commit is contained in:
Torsten Schoenfeld 2006-07-25 20:01:22 +00:00 committed by Andreas Tobler
parent 6583cf153d
commit cb4132fe11
3 changed files with 55 additions and 3 deletions

View File

@ -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,

View File

@ -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. */

View File

@ -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);
}