return_dbl.c: New test case.

2006-02-16  Andreas Tobler  <a.tobler@schweiz.ch>

	* testsuite/libffi.call/return_dbl.c: New test case.
	* testsuite/libffi.call/return_dbl1.c: Likewise.
	* testsuite/libffi.call/return_dbl2.c: Likewise.
	* testsuite/libffi.call/return_fl.c: Likewise.
	* testsuite/libffi.call/return_fl1.c: Likewise.
	* testsuite/libffi.call/return_fl2.c: Likewise.
	* testsuite/libffi.call/return_fl3.c: Likewise.
	* testsuite/libffi.call/closure_fn6.c: Likewise.

From-SVN: r111156
This commit is contained in:
Andreas Tobler 2006-02-16 23:29:01 +01:00 committed by Andreas Tobler
parent fd7927cdc6
commit 6429d58f83
9 changed files with 381 additions and 0 deletions

View File

@ -1,5 +1,14 @@
2006-02-16 Andreas Tobler <a.tobler@schweiz.ch>
* testsuite/libffi.call/return_dbl.c: New test case.
* testsuite/libffi.call/return_dbl1.c: Likewise.
* testsuite/libffi.call/return_dbl2.c: Likewise.
* testsuite/libffi.call/return_fl.c: Likewise.
* testsuite/libffi.call/return_fl1.c: Likewise.
* testsuite/libffi.call/return_fl2.c: Likewise.
* testsuite/libffi.call/return_fl3.c: Likewise.
* testsuite/libffi.call/closure_fn6.c: Likewise.
* testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong
definition.
* testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition

View File

@ -0,0 +1,97 @@
/* Area: closure_call
Purpose: Check multiple values passing from different type.
Also, exceed the limit of gpr and fpr registers on PowerPC.
Limitations: none.
PR: PR23404
Originator: <andreast@gcc.gnu.org> 20050830 */
/* { dg-do run { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
#include "ffitest.h"
static void
closure_test_fn0(ffi_cif* cif,void* resp,void** args, void* userdata)
{
*(ffi_arg*)resp =
(int)*(unsigned long long *)args[0] +
(int)(*(unsigned long long *)args[1]) +
(int)(*(unsigned long long *)args[2]) +
(int)*(unsigned long long *)args[3] +
(int)(*(int *)args[4]) + (int)(*(double *)args[5]) +
(int)*(double *)args[6] + (int)(*(float *)args[7]) +
(int)(*(double *)args[8]) + (int)*(double *)args[9] +
(int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
(int)*(int *)args[12] + (int)(*(int *)args[13]) +
(int)(*(double *)args[14]) + (int)*(double *)args[15] +
(int)(long)userdata;
printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
(int)*(unsigned long long *)args[0],
(int)(*(unsigned long long *)args[1]),
(int)(*(unsigned long long *)args[2]),
(int)*(unsigned long long *)args[3],
(int)(*(int *)args[4]), (int)(*(double *)args[5]),
(int)*(double *)args[6], (int)(*(float *)args[7]),
(int)(*(double *)args[8]), (int)*(double *)args[9],
(int)(*(int *)args[10]), (int)(*(float *)args[11]),
(int)*(int *)args[12], (int)(*(int *)args[13]),
(int)(*(double *)args[14]), (int)(*(double *)args[15]),
(int)(long)userdata, (int)*(ffi_arg *)resp);
}
typedef int (*closure_test_type0)(unsigned long long,
unsigned long long,
unsigned long long,
unsigned long long,
int, double, double, float, double, double,
int, float, int, int, double, double);
int main (void)
{
ffi_cif cif;
#ifndef USING_MMAP
static ffi_closure cl;
#endif
ffi_closure *pcl;
ffi_type * cl_arg_types[17];
int res;
#ifdef USING_MMAP
pcl = allocate_mmap (sizeof(ffi_closure));
#else
pcl = &cl;
#endif
cl_arg_types[0] = &ffi_type_uint64;
cl_arg_types[1] = &ffi_type_uint64;
cl_arg_types[2] = &ffi_type_uint64;
cl_arg_types[3] = &ffi_type_uint64;
cl_arg_types[4] = &ffi_type_uint;
cl_arg_types[5] = &ffi_type_double;
cl_arg_types[6] = &ffi_type_double;
cl_arg_types[7] = &ffi_type_float;
cl_arg_types[8] = &ffi_type_double;
cl_arg_types[9] = &ffi_type_double;
cl_arg_types[10] = &ffi_type_uint;
cl_arg_types[11] = &ffi_type_float;
cl_arg_types[12] = &ffi_type_uint;
cl_arg_types[13] = &ffi_type_uint;
cl_arg_types[14] = &ffi_type_double;
cl_arg_types[15] = &ffi_type_double;
cl_arg_types[16] = NULL;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
&ffi_type_sint, cl_arg_types) == FFI_OK);
CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
(void *) 3 /* userdata */) == FFI_OK);
res = (*((closure_test_type0)pcl))
(1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13,
19, 21., 1.);
/* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
printf("res: %d\n",res);
/* { dg-output "\nres: 680" } */
exit(0);
}

View File

@ -0,0 +1,35 @@
/* Area: ffi_call
Purpose: Check return value double.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static double return_dbl(double dbl)
{
return 2 * dbl;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
double dbl, rdbl;
args[0] = &ffi_type_double;
values[0] = &dbl;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_double, args) == FFI_OK);
for (dbl = -127.3; dbl < 127; dbl++)
{
ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
printf ("%f vs %f\n", rdbl, return_dbl(dbl));
CHECK(rdbl == 2 * dbl);
}
exit(0);
}

View File

@ -0,0 +1,43 @@
/* Area: ffi_call
Purpose: Check return value double.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4)
{
return dbl1 + fl2 + in3 + dbl4;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
double dbl1, dbl4, rdbl;
float fl2;
unsigned int in3;
args[0] = &ffi_type_double;
args[1] = &ffi_type_float;
args[2] = &ffi_type_uint32;
args[3] = &ffi_type_double;
values[0] = &dbl1;
values[1] = &fl2;
values[2] = &in3;
values[3] = &dbl4;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
&ffi_type_double, args) == FFI_OK);
dbl1 = 127.0;
fl2 = 128.0;
in3 = 255;
dbl4 = 512.7;
ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4));
CHECK(rdbl == dbl1 + fl2 + in3 + dbl4);
exit(0);
}

View File

@ -0,0 +1,42 @@
/* Area: ffi_call
Purpose: Check return value double.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4)
{
return dbl1 + dbl2 + in3 + dbl4;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
double dbl1, dbl2, dbl4, rdbl;
unsigned int in3;
args[0] = &ffi_type_double;
args[1] = &ffi_type_double;
args[2] = &ffi_type_uint32;
args[3] = &ffi_type_double;
values[0] = &dbl1;
values[1] = &dbl2;
values[2] = &in3;
values[3] = &dbl4;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
&ffi_type_double, args) == FFI_OK);
dbl1 = 127.0;
dbl2 = 128.0;
in3 = 255;
dbl4 = 512.7;
ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4));
CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4);
exit(0);
}

View File

@ -0,0 +1,35 @@
/* Area: ffi_call
Purpose: Check return value float.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static float return_fl(float fl)
{
return 2 * fl;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
float fl, rfl;
args[0] = &ffi_type_float;
values[0] = &fl;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_float, args) == FFI_OK);
for (fl = -127.0; fl < 127; fl++)
{
ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
printf ("%f vs %f\n", rfl, return_fl(fl));
CHECK(rfl == 2 * fl);
}
exit(0);
}

View File

@ -0,0 +1,36 @@
/* Area: ffi_call
Purpose: Check return value float.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static float return_fl(float fl1, float fl2)
{
return fl1 + fl2;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
float fl1, fl2, rfl;
args[0] = &ffi_type_float;
args[1] = &ffi_type_float;
values[0] = &fl1;
values[1] = &fl2;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
&ffi_type_float, args) == FFI_OK);
fl1 = 127.0;
fl2 = 128.0;
ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
printf ("%f vs %f\n", rfl, return_fl(fl1, fl2));
CHECK(rfl == fl1 + fl2);
exit(0);
}

View File

@ -0,0 +1,42 @@
/* Area: ffi_call
Purpose: Check return value float.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static float return_fl(float fl1, float fl2, float fl3, float fl4)
{
return fl1 + fl2 + fl3 + fl4;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
float fl1, fl2, fl3, fl4, rfl;
args[0] = &ffi_type_float;
args[1] = &ffi_type_float;
args[2] = &ffi_type_float;
args[3] = &ffi_type_float;
values[0] = &fl1;
values[1] = &fl2;
values[2] = &fl3;
values[3] = &fl4;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
&ffi_type_float, args) == FFI_OK);
fl1 = 127.0;
fl2 = 128.0;
fl3 = 255.1;
fl4 = 512.7;
ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4));
CHECK(rfl == fl1 + fl2 + fl3 + fl4);
exit(0);
}

View File

@ -0,0 +1,42 @@
/* Area: ffi_call
Purpose: Check return value float.
Limitations: none.
PR: none.
Originator: <andreast@gcc.gnu.org> 20050212 */
/* { dg-do run } */
#include "ffitest.h"
static float return_fl(float fl1, float fl2, unsigned int in3, float fl4)
{
return fl1 + fl2 + in3 + fl4;
}
int main (void)
{
ffi_cif cif;
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
float fl1, fl2, fl4, rfl;
unsigned int in3;
args[0] = &ffi_type_float;
args[1] = &ffi_type_float;
args[2] = &ffi_type_uint32;
args[3] = &ffi_type_float;
values[0] = &fl1;
values[1] = &fl2;
values[2] = &in3;
values[3] = &fl4;
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
&ffi_type_float, args) == FFI_OK);
fl1 = 127.0;
fl2 = 128.0;
in3 = 255;
fl4 = 512.7;
ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4));
CHECK(rfl == fl1 + fl2 + in3 + fl4);
exit(0);
}