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:
parent
fd7927cdc6
commit
6429d58f83
@ -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
|
||||
|
97
libffi/testsuite/libffi.call/closure_fn6.c
Normal file
97
libffi/testsuite/libffi.call/closure_fn6.c
Normal 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);
|
||||
}
|
35
libffi/testsuite/libffi.call/return_dbl.c
Normal file
35
libffi/testsuite/libffi.call/return_dbl.c
Normal 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);
|
||||
}
|
43
libffi/testsuite/libffi.call/return_dbl1.c
Normal file
43
libffi/testsuite/libffi.call/return_dbl1.c
Normal 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);
|
||||
}
|
42
libffi/testsuite/libffi.call/return_dbl2.c
Normal file
42
libffi/testsuite/libffi.call/return_dbl2.c
Normal 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);
|
||||
}
|
35
libffi/testsuite/libffi.call/return_fl.c
Normal file
35
libffi/testsuite/libffi.call/return_fl.c
Normal 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);
|
||||
}
|
36
libffi/testsuite/libffi.call/return_fl1.c
Normal file
36
libffi/testsuite/libffi.call/return_fl1.c
Normal 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);
|
||||
}
|
42
libffi/testsuite/libffi.call/return_fl2.c
Normal file
42
libffi/testsuite/libffi.call/return_fl2.c
Normal 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);
|
||||
}
|
42
libffi/testsuite/libffi.call/return_fl3.c
Normal file
42
libffi/testsuite/libffi.call/return_fl3.c
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user