OSDN Git Service

2006-02-16 Andreas Tobler <a.tobler@schweiz.ch>
authorandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Feb 2006 22:29:01 +0000 (22:29 +0000)
committerandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Feb 2006 22:29:01 +0000 (22:29 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111156 138bc75d-0d04-0410-961f-82ee72b054a4

libffi/ChangeLog
libffi/testsuite/libffi.call/closure_fn6.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_dbl.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_dbl1.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_dbl2.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_fl.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_fl1.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_fl2.c [new file with mode: 0644]
libffi/testsuite/libffi.call/return_fl3.c [new file with mode: 0644]

index 737b566..724b256 100644 (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
diff --git a/libffi/testsuite/libffi.call/closure_fn6.c b/libffi/testsuite/libffi.call/closure_fn6.c
new file mode 100644 (file)
index 0000000..8f8f743
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_dbl.c b/libffi/testsuite/libffi.call/return_dbl.c
new file mode 100644 (file)
index 0000000..1aab403
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_dbl1.c b/libffi/testsuite/libffi.call/return_dbl1.c
new file mode 100644 (file)
index 0000000..a6c1cfc
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_dbl2.c b/libffi/testsuite/libffi.call/return_dbl2.c
new file mode 100644 (file)
index 0000000..51af3ba
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_fl.c b/libffi/testsuite/libffi.call/return_fl.c
new file mode 100644 (file)
index 0000000..fb8a09e
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_fl1.c b/libffi/testsuite/libffi.call/return_fl1.c
new file mode 100644 (file)
index 0000000..c3d92c2
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_fl2.c b/libffi/testsuite/libffi.call/return_fl2.c
new file mode 100644 (file)
index 0000000..d4bd3de
--- /dev/null
@@ -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);
+}
diff --git a/libffi/testsuite/libffi.call/return_fl3.c b/libffi/testsuite/libffi.call/return_fl3.c
new file mode 100644 (file)
index 0000000..c3d2f12
--- /dev/null
@@ -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);
+}