testsuite: Add ABIs to the test matrix; unify tests across ABIs
authorJosh Triplett <josh@joshtriplett.org>
Mon, 17 Mar 2014 03:29:27 +0000 (20:29 -0700)
committerJosh Triplett <josh@joshtriplett.org>
Mon, 17 Mar 2014 03:39:12 +0000 (20:39 -0700)
This eliminates all the *_win32.c tests in favor of the tests they were
branched from, and expands test coverage to run many more tests on
stdcall, thiscall, and fastcall.

This same mechanism also supports testing any other target that has
multiple ABIs.

28 files changed:
testsuite/Makefile.am
testsuite/lib/libffi.exp
testsuite/libffi.call/fastthis1_win32.c [deleted file]
testsuite/libffi.call/fastthis2_win32.c [deleted file]
testsuite/libffi.call/fastthis3_win32.c [deleted file]
testsuite/libffi.call/ffitest.h
testsuite/libffi.call/many.c
testsuite/libffi.call/many2.c
testsuite/libffi.call/many2_win32.c [deleted file]
testsuite/libffi.call/many_win32.c [deleted file]
testsuite/libffi.call/strlen.c
testsuite/libffi.call/strlen2.c [new file with mode: 0644]
testsuite/libffi.call/strlen2_win32.c [deleted file]
testsuite/libffi.call/strlen3.c [new file with mode: 0644]
testsuite/libffi.call/strlen4.c [new file with mode: 0644]
testsuite/libffi.call/strlen_win32.c [deleted file]
testsuite/libffi.call/struct1.c
testsuite/libffi.call/struct1_win32.c [deleted file]
testsuite/libffi.call/struct2.c
testsuite/libffi.call/struct2_win32.c [deleted file]
testsuite/libffi.call/struct3.c
testsuite/libffi.call/struct4.c
testsuite/libffi.call/struct5.c
testsuite/libffi.call/struct6.c
testsuite/libffi.call/struct7.c
testsuite/libffi.call/struct8.c
testsuite/libffi.call/struct9.c
testsuite/libffi.call/unwindtest.cc

index 3cb876b0d1babe6d2dd40c9b9dd9ad1e89b1a9e5..912e8e18cabe4d6cdbd7690e4f900b8d1a93b4af 100644 (file)
@@ -20,7 +20,7 @@ CLEANFILES = *.exe core* *.log *.sum
 EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c               \
 libffi.call/cls_align_longdouble_split.c                               \
 libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c                  \
-libffi.call/closure_fn1.c libffi.call/many2_win32.c                    \
+libffi.call/closure_fn1.c \
 libffi.call/return_ul.c libffi.call/cls_align_double.c                 \
 libffi.call/return_fl2.c libffi.call/cls_1_1byte.c                     \
 libffi.call/cls_64byte.c libffi.call/nested_struct7.c                  \
@@ -30,7 +30,7 @@ libffi.call/cls_multi_ushort.c libffi.call/struct3.c                  \
 libffi.call/cls_3byte1.c libffi.call/cls_16byte.c                      \
 libffi.call/struct8.c libffi.call/nested_struct8.c                     \
 libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c                        \
-libffi.call/fastthis2_win32.c libffi.call/cls_pointer.c                        \
+libffi.call/cls_pointer.c                      \
 libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c                        \
 libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c                 \
 libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c                 \
@@ -50,12 +50,12 @@ libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c                \
 libffi.call/cls_9byte1.c libffi.call/closure_fn6.c                     \
 libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c            \
 libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c           \
-libffi.call/cls_sshort.c libffi.call/many_win32.c                      \
+libffi.call/cls_sshort.c \
 libffi.call/nested_struct.c libffi.call/cls_20byte.c                   \
 libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c             \
 libffi.call/return_uc.c libffi.call/closure_thiscall.c                 \
 libffi.call/cls_18byte.c libffi.call/cls_8byte.c                       \
-libffi.call/promotion.c libffi.call/struct1_win32.c                    \
+libffi.call/promotion.c \
 libffi.call/return_dbl.c libffi.call/cls_24byte.c                      \
 libffi.call/struct4.c libffi.call/cls_6byte.c                          \
 libffi.call/cls_align_uint32.c libffi.call/float.c                     \
@@ -63,7 +63,7 @@ libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c      \
 libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c                    \
 libffi.call/cls_align_float.c libffi.call/return_fl1.c                 \
 libffi.call/nested_struct10.c libffi.call/nested_struct5.c             \
-libffi.call/fastthis1_win32.c libffi.call/cls_align_sint64.c           \
+libffi.call/cls_align_sint64.c         \
 libffi.call/stret_large2.c libffi.call/return_sl.c                     \
 libffi.call/closure_fn0.c libffi.call/cls_5byte.c                      \
 libffi.call/cls_2byte.c libffi.call/float2.c                           \
@@ -75,13 +75,13 @@ libffi.call/cls_float.c libffi.call/cls_pointer_stack.c             \
 libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c             \
 libffi.call/struct1.c libffi.call/nested_struct9.c                     \
 libffi.call/huge_struct.c libffi.call/problem1.c                       \
-libffi.call/float4.c libffi.call/fastthis3_win32.c                     \
-libffi.call/return_ldl.c libffi.call/strlen2_win32.c                   \
-libffi.call/closure_fn5.c libffi.call/struct2_win32.c                  \
+libffi.call/float4.c \
+libffi.call/return_ldl.c \
+libffi.call/closure_fn5.c \
 libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c    \
 libffi.call/return_sc.c libffi.call/struct7.c                          \
 libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c                 \
-libffi.call/strlen_win32.c libffi.call/cls_6_1_byte.c                  \
+libffi.call/cls_6_1_byte.c                     \
 libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc                   \
 libffi.call/unwindtest_ffi_call.cc     \
 lib/wrapper.exp lib/target-libpath.exp \
@@ -90,5 +90,7 @@ libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c                  \
 libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c                 \
 libffi.call/nested_struct11.c libffi.call/uninitialized.c              \
 libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c   \
-libffi.call/va_struct3.c
-
+libffi.call/va_struct3.c \
+libffi.call/strlen2.c \
+libffi.call/strlen3.c \
+libffi.call/strlen4.c
index 014e520662e0066c4f4c15b8a562f0023cfa15a9..28d6036938a073fe77a35914a6f041eac85eba24 100644 (file)
@@ -284,10 +284,33 @@ proc run-many-tests { testcases extra_flags } {
         set optimizations { "" }
     }
 
+    set targetabis { "" }
+    if [string match $using_gcc "yes"] {
+        if [istarget "i?86-*-*"] {
+            set targetabis {
+                ""
+                "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__"
+                "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__"
+                "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__"
+            }
+        }
+    }
+
     set common [ concat $common $extra_flags ]
-    foreach opt $optimizations {
-        set options [ concat $common $opt ]
-        dg-runtest $testcases $options ""
+    foreach test $testcases {
+        set testname [file tail $test]
+        if [search_for $test "ABI_NUM"] {
+            set abis $targetabis
+        } else {
+            set abis { "" }
+        }
+        foreach opt $optimizations {
+            foreach abi $abis {
+                set options [concat $common $opt $abi]
+                verbose "Testing $testname, $options" 1
+                dg-test $test $options ""
+            }
+        }
     }
 }
 
diff --git a/testsuite/libffi.call/fastthis1_win32.c b/testsuite/libffi.call/fastthis1_win32.c
deleted file mode 100644 (file)
index 2bac3b2..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check fastcall fct call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-
-static size_t __FASTCALL__ my_fastcall_f(char *s, float a)
-{
-  return (size_t) ((int) strlen(s) + (int) a);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  float v2;
-  args[0] = &ffi_type_pointer;
-  args[1] = &ffi_type_float;
-  values[0] = (void*) &s;
-  values[1] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2,
-                      &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  v2 = -1.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 6);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 26);
-  
-  printf("fastcall fct1 tests passed\n");
-  exit(0);
-}
diff --git a/testsuite/libffi.call/fastthis2_win32.c b/testsuite/libffi.call/fastthis2_win32.c
deleted file mode 100644 (file)
index e78018c..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check fastcall fct call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-
-static size_t __FASTCALL__ my_fastcall_f(float a, char *s)
-{
-  return (size_t) ((int) strlen(s) + (int) a);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  float v2;
-  args[1] = &ffi_type_pointer;
-  args[0] = &ffi_type_float;
-  values[1] = (void*) &s;
-  values[0] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2,
-                      &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  v2 = -1.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 6);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 26);
-  
-  printf("fastcall fct2 tests passed\n");
-  exit(0);
-}
diff --git a/testsuite/libffi.call/fastthis3_win32.c b/testsuite/libffi.call/fastthis3_win32.c
deleted file mode 100644 (file)
index c3af801..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check fastcall f call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-
-static size_t __FASTCALL__ my_fastcall_f(float a, char *s, int i)
-{
-  return (size_t) ((int) strlen(s) + (int) a + i);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  int v1;
-  float v2;
-  args[2] = &ffi_type_sint;
-  args[1] = &ffi_type_pointer;
-  args[0] = &ffi_type_float;
-  values[2] = (void*) &v1;
-  values[1] = (void*) &s;
-  values[0] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 3,
-                      &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v1 = 1;
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 2);
-  
-  s = "1234567";
-  v2 = -1.0;
-  v1 = -2;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 4);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  v1 = 2;
-  ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
-  CHECK(rint == 28);
-  
-  printf("fastcall fct3 tests passed\n");
-  exit(0);
-}
index 752fe55371225b140ac2ac979466ba8d67aa5951..316e5c0f508a8a1472b0c6393758d2b11b987259 100644 (file)
 #define __FASTCALL__ __fastcall
 #endif
 
+#ifndef ABI_NUM
+#define ABI_NUM FFI_DEFAULT_ABI
+#define ABI_ATTR
+#endif
+
 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
    file open.  */
 #ifdef HAVE_MMAP_ANON
index 5447664fa963172b8c6aeda7c007974e61ab6d27..336968c77a2be7dc3fba3177122ba882e294312d 100644 (file)
 #include <float.h>
 #include <math.h>
 
-static float many(float f1,
-                 float f2,
-                 float f3,
-                 float f4,
-                 float f5,
-                 float f6,
-                 float f7,
-                 float f8,
-                 float f9,
-                 float f10,
-                 float f11,
-                 float f12,
-                 float f13)
+static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13)
 {
 #if 0
   printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
@@ -52,7 +40,7 @@ int main (void)
     }
 
     /* Initialize the cif */
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, 
+    CHECK(ffi_prep_cif(&cif, ABI_NUM, 13,
                       &ffi_type_float, args) == FFI_OK);
 
     ffi_call(&cif, FFI_FN(many), &f, values);
index 98eac6013a4381071b6785fff399fe1b52cce310..1c85746e4c4bc6488f8726a1efa8a15dccdddc04 100644 (file)
@@ -22,7 +22,7 @@ foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
   return a + b + c + d + e + f + g;
 }
 
-uint8_t
+uint8_t ABI_ATTR
 bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
      uint8_t e, uint8_t f, uint8_t g)
 {
@@ -42,7 +42,7 @@ main (void)
   for (i = 0; i < NARGS; ++i)
     ffitypes[i] = &ffi_type_uint8;
 
-  CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, NARGS,
+  CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS,
                       &ffi_type_uint8, ffitypes) == FFI_OK);
 
   for (i = 0; i < NARGS; ++i)
diff --git a/testsuite/libffi.call/many2_win32.c b/testsuite/libffi.call/many2_win32.c
deleted file mode 100644 (file)
index de6f9bb..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check stdcall many call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-#include <float.h>
-
-static float __attribute__((fastcall)) fastcall_many(float f1,
-                                                  float f2,
-                                                  float f3,
-                                                  float f4,
-                                                  float f5,
-                                                  float f6,
-                                                  float f7,
-                                                  float f8,
-                                                  float f9,
-                                                  float f10,
-                                                  float f11,
-                                                  float f12,
-                                                  float f13)
-{
-  return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[13];
-  void *values[13];
-  float fa[13];
-  float f, ff;
-  unsigned long ul;
-
-  for (ul = 0; ul < 13; ul++)
-    {
-      args[ul] = &ffi_type_float;
-      values[ul] = &fa[ul];
-       fa[ul] = (float) ul;
-    }
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 13,
-                    &ffi_type_float, args) == FFI_OK);
-
-  ff =  fastcall_many(fa[0], fa[1],
-                    fa[2], fa[3],
-                    fa[4], fa[5],
-                    fa[6], fa[7],
-                    fa[8], fa[9],
-                    fa[10], fa[11], fa[12]);
-
-  ffi_call(&cif, FFI_FN(fastcall_many), &f, values);
-
-  if (f - ff < FLT_EPSILON)
-    printf("fastcall many arg tests ok!\n");
-  else
-    CHECK(0);
-  exit(0);
-}
diff --git a/testsuite/libffi.call/many_win32.c b/testsuite/libffi.call/many_win32.c
deleted file mode 100644 (file)
index e696c93..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check stdcall many call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-#include <float.h>
-
-static float __attribute__((stdcall)) stdcall_many(float f1,
-                                                  float f2,
-                                                  float f3,
-                                                  float f4,
-                                                  float f5,
-                                                  float f6,
-                                                  float f7,
-                                                  float f8,
-                                                  float f9,
-                                                  float f10,
-                                                  float f11,
-                                                  float f12,
-                                                  float f13)
-{
-  return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[13];
-  void *values[13];
-  float fa[13];
-  float f, ff;
-  unsigned long ul;
-
-  for (ul = 0; ul < 13; ul++)
-    {
-      args[ul] = &ffi_type_float;
-      values[ul] = &fa[ul];
-       fa[ul] = (float) ul;
-    }
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13,
-                    &ffi_type_float, args) == FFI_OK);
-
-  ff =  stdcall_many(fa[0], fa[1],
-                    fa[2], fa[3],
-                    fa[4], fa[5],
-                    fa[6], fa[7],
-                    fa[8], fa[9],
-                    fa[10], fa[11], fa[12]);
-
-  ffi_call(&cif, FFI_FN(stdcall_many), &f, values);
-
-  if (f - ff < FLT_EPSILON)
-    printf("stdcall many arg tests ok!\n");
-  else
-    CHECK(0);
-  exit(0);
-}
index 3de45de7aaac6ffdce3c806132ac1a7bccfe4b09..35b70ea4e2e1cfb191d7030e777dfb1c734ad8b2 100644 (file)
@@ -7,7 +7,7 @@
 /* { dg-do run } */
 #include "ffitest.h"
 
-static size_t my_strlen(char *s)
+static size_t ABI_ATTR my_strlen(char *s)
 {
   return (strlen(s));
 }
@@ -24,7 +24,7 @@ int main (void)
   values[0] = (void*) &s;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
                     &ffi_type_sint, args) == FFI_OK);
   
   s = "a";
diff --git a/testsuite/libffi.call/strlen2.c b/testsuite/libffi.call/strlen2.c
new file mode 100644 (file)
index 0000000..96282bc
--- /dev/null
@@ -0,0 +1,49 @@
+/* Area:       ffi_call
+   Purpose:    Check strlen function call with additional arguments.
+   Limitations:        none.
+   PR:         none.
+   Originator: From the original ffitest.c  */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static size_t ABI_ATTR my_f(char *s, float a)
+{
+  return (size_t) ((int) strlen(s) + (int) a);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  char *s;
+  float v2;
+  args[0] = &ffi_type_pointer;
+  args[1] = &ffi_type_float;
+  values[0] = (void*) &s;
+  values[1] = (void*) &v2;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
+                      &ffi_type_sint, args) == FFI_OK);
+  
+  s = "a";
+  v2 = 0.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 1);
+  
+  s = "1234567";
+  v2 = -1.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 6);
+  
+  s = "1234567890123456789012345";
+  v2 = 1.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 26);
+  
+  exit(0);
+}
diff --git a/testsuite/libffi.call/strlen2_win32.c b/testsuite/libffi.call/strlen2_win32.c
deleted file mode 100644 (file)
index 465b6c3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check fastcall strlen call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-
-static size_t __FASTCALL__ my_fastcall_strlen(char *s)
-{
-  return (strlen(s));
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  args[0] = &ffi_type_pointer;
-  values[0] = (void*) &s;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1,
-                      &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
-  CHECK(rint == 7);
-  
-  s = "1234567890123456789012345";
-  ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
-  CHECK(rint == 25);
-  
-  printf("fastcall strlen tests passed\n");
-  exit(0);
-}
diff --git a/testsuite/libffi.call/strlen3.c b/testsuite/libffi.call/strlen3.c
new file mode 100644 (file)
index 0000000..beba86e
--- /dev/null
@@ -0,0 +1,49 @@
+/* Area:       ffi_call
+   Purpose:    Check strlen function call with additional arguments.
+   Limitations:        none.
+   PR:         none.
+   Originator: From the original ffitest.c  */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static size_t ABI_ATTR my_f(float a, char *s)
+{
+  return (size_t) ((int) strlen(s) + (int) a);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  char *s;
+  float v2;
+  args[1] = &ffi_type_pointer;
+  args[0] = &ffi_type_float;
+  values[1] = (void*) &s;
+  values[0] = (void*) &v2;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
+                      &ffi_type_sint, args) == FFI_OK);
+  
+  s = "a";
+  v2 = 0.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 1);
+  
+  s = "1234567";
+  v2 = -1.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 6);
+  
+  s = "1234567890123456789012345";
+  v2 = 1.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 26);
+  
+  exit(0);
+}
diff --git a/testsuite/libffi.call/strlen4.c b/testsuite/libffi.call/strlen4.c
new file mode 100644 (file)
index 0000000..d5d42b4
--- /dev/null
@@ -0,0 +1,55 @@
+/* Area:       ffi_call
+   Purpose:    Check strlen function call with additional arguments.
+   Limitations:        none.
+   PR:         none.
+   Originator: From the original ffitest.c  */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static size_t ABI_ATTR my_f(float a, char *s, int i)
+{
+  return (size_t) ((int) strlen(s) + (int) a + i);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  char *s;
+  int v1;
+  float v2;
+  args[2] = &ffi_type_sint;
+  args[1] = &ffi_type_pointer;
+  args[0] = &ffi_type_float;
+  values[2] = (void*) &v1;
+  values[1] = (void*) &s;
+  values[0] = (void*) &v2;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 3,
+                      &ffi_type_sint, args) == FFI_OK);
+  
+  s = "a";
+  v1 = 1;
+  v2 = 0.0;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 2);
+  
+  s = "1234567";
+  v2 = -1.0;
+  v1 = -2;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 4);
+  
+  s = "1234567890123456789012345";
+  v2 = 1.0;
+  v1 = 2;
+  ffi_call(&cif, FFI_FN(my_f), &rint, values);
+  CHECK(rint == 28);
+  
+  exit(0);
+}
diff --git a/testsuite/libffi.call/strlen_win32.c b/testsuite/libffi.call/strlen_win32.c
deleted file mode 100644 (file)
index 2a14b96..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check stdcall strlen call on X86_WIN32 systems.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-
-#include "ffitest.h"
-
-static size_t __attribute__((stdcall)) my_stdcall_strlen(char *s)
-{
-  return (strlen(s));
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  args[0] = &ffi_type_pointer;
-  values[0] = (void*) &s;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 1,
-                      &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
-  CHECK(rint == 7);
-  
-  s = "1234567890123456789012345";
-  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
-  CHECK(rint == 25);
-  
-  printf("stdcall strlen tests passed\n");
-  exit(0);
-}
index bfc23f642cc870ab19a48bc1d7fdc46109833df4..c13e23f872734ebc70cba1fb47796e722ddac0e0 100644 (file)
@@ -14,7 +14,7 @@ typedef struct
   unsigned int ui;
 } test_structure_1;
 
-static test_structure_1 struct1(test_structure_1 ts)
+static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
 {
   ts.uc++;
   ts.d--;
@@ -50,7 +50,7 @@ int main (void)
   values[0] = &ts1_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
                     &ts1_type, args) == FFI_OK);
   
   ts1_arg.uc = '\x01';
diff --git a/testsuite/libffi.call/struct1_win32.c b/testsuite/libffi.call/struct1_win32.c
deleted file mode 100644 (file)
index 6decf02..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check structures with fastcall/thiscall convention.
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-#include "ffitest.h"
-
-typedef struct
-{
-  unsigned char uc;
-  double d;
-  unsigned int ui;
-} test_structure_1;
-
-static test_structure_1 __FASTCALL__ struct1(test_structure_1 ts)
-{
-  ts.uc++;
-  ts.d--;
-  ts.ui++;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts1_type;
-  ffi_type *ts1_type_elements[4];
-
-  test_structure_1 ts1_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_1 *ts1_result =
-    (test_structure_1 *) malloc (sizeof(test_structure_1));
-
-  ts1_type.size = 0;
-  ts1_type.alignment = 0;
-  ts1_type.type = FFI_TYPE_STRUCT;
-  ts1_type.elements = ts1_type_elements;
-  ts1_type_elements[0] = &ffi_type_uchar;
-  ts1_type_elements[1] = &ffi_type_double;
-  ts1_type_elements[2] = &ffi_type_uint;
-  ts1_type_elements[3] = NULL;
-  
-  args[0] = &ts1_type;
-  values[0] = &ts1_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, 
-                    &ts1_type, args) == FFI_OK);
-  
-  ts1_arg.uc = '\x01';
-  ts1_arg.d = 3.14159;
-  ts1_arg.ui = 555;
-
-  ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
-  
-  CHECK(ts1_result->ui == 556);
-  CHECK(ts1_result->d == 3.14159 - 1);
-  free (ts1_result);
-  exit(0);
-}
index d85385e7d3f235c09dd2d6809c25bc22e0be4531..5077a5ee45a5fe6f1658c0aa498450026a616f02 100644 (file)
@@ -13,7 +13,7 @@ typedef struct
   double d2;
 } test_structure_2;
 
-static test_structure_2 struct2(test_structure_2 ts)
+static test_structure_2 ABI_ATTR struct2(test_structure_2 ts)
 {
   ts.d1--;
   ts.d2--;
@@ -46,7 +46,7 @@ int main (void)
   values[0] = &ts2_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts2_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK);
   
   ts2_arg.d1 = 5.55;
   ts2_arg.d2 = 6.66;
diff --git a/testsuite/libffi.call/struct2_win32.c b/testsuite/libffi.call/struct2_win32.c
deleted file mode 100644 (file)
index 17a4519..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Area:       ffi_call
-   Purpose:    Check structures in fastcall/stdcall function
-   Limitations:        none.
-   PR:         none.
-   Originator: From the original ffitest.c  */
-
-/* { dg-do run { target i?86-*-* } } */
-#include "ffitest.h"
-
-typedef struct
-{
-  double d1;
-  double d2;
-} test_structure_2;
-
-static test_structure_2 __FASTCALL__ struct2(test_structure_2 ts)
-{
-  ts.d1--;
-  ts.d2--;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  test_structure_2 ts2_arg;
-  ffi_type ts2_type;
-  ffi_type *ts2_type_elements[3];
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_2 *ts2_result =
-    (test_structure_2 *) malloc (sizeof(test_structure_2));
-
-  ts2_type.size = 0;
-  ts2_type.alignment = 0;
-  ts2_type.type = FFI_TYPE_STRUCT;
-  ts2_type.elements = ts2_type_elements;
-  ts2_type_elements[0] = &ffi_type_double;
-  ts2_type_elements[1] = &ffi_type_double;
-  ts2_type_elements[2] = NULL;
-
-  args[0] = &ts2_type;
-  values[0] = &ts2_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, &ts2_type, args) == FFI_OK);
-  
-  ts2_arg.d1 = 5.55;
-  ts2_arg.d2 = 6.66;
-  
-  printf ("%g\n", ts2_arg.d1);
-  printf ("%g\n", ts2_arg.d2);
-  
-  ffi_call(&cif, FFI_FN(struct2), ts2_result, values);
-  
-  printf ("%g\n", ts2_result->d1);
-  printf ("%g\n", ts2_result->d2);
-  
-  CHECK(ts2_result->d1 == 5.55 - 1);
-  CHECK(ts2_result->d2 == 6.66 - 1);
-  
-  free (ts2_result);
-  exit(0);
-}
index de883c2638e0b952c24f59c18589773ef74f1aee..7eba0ead6d6a8964263a7df59a52d7d28ec27a83 100644 (file)
@@ -12,7 +12,7 @@ typedef struct
   int si;
 } test_structure_3;
 
-static test_structure_3 struct3(test_structure_3 ts)
+static test_structure_3 ABI_ATTR struct3(test_structure_3 ts)
 {
   ts.si = -(ts.si*2);
 
@@ -43,7 +43,7 @@ int main (void)
   values[0] = &ts3_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
                     &ts3_type, args) == FFI_OK);
   
   ts3_arg.si = -123;
index 48e03495441c0dcb6d0aae7b1c45f7028a5a4ce0..66a9551dd65032cd1124fe4758ff1134cebd2b7b 100644 (file)
@@ -14,7 +14,7 @@ typedef struct
   unsigned ui3;
 } test_structure_4;
 
-static test_structure_4 struct4(test_structure_4 ts)
+static test_structure_4 ABI_ATTR struct4(test_structure_4 ts)
 {
   ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
 
@@ -48,7 +48,7 @@ int main (void)
   values[0] = &ts4_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts4_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK);
   
   ts4_arg.ui1 = 2;
   ts4_arg.ui2 = 3;
index 28b1f0c4265e42b25a8806ad1f23a02b5df0e5d7..23e2a3f745c8b7a85df0c3bfd37f79808e855a78 100644 (file)
@@ -12,7 +12,7 @@ typedef struct
   char c2;
 } test_structure_5;
 
-static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2)
+static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2)
 {
   ts1.c1 += ts2.c1;
   ts1.c2 -= ts2.c2;
@@ -48,7 +48,7 @@ int main (void)
   values[1] = &ts5_arg2;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ts5_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK);
   
   ts5_arg1.c1 = 2;
   ts5_arg1.c2 = 6;
index 0e267467a7b08dc44c7f4ef8072c7f7272a430e3..173c66eb4d2bf07aba628896d51e3e8b28dde586 100644 (file)
@@ -12,7 +12,7 @@ typedef struct
   double d;
 } test_structure_6;
 
-static test_structure_6 struct6 (test_structure_6 ts)
+static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts)
 {
   ts.f += 1;
   ts.d += 1;
@@ -46,7 +46,7 @@ int main (void)
   values[0] = &ts6_arg;
 
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK);
   
   ts6_arg.f = 5.55f;
   ts6_arg.d = 6.66;
index 8f2bbfd949c52240a8f8f2b8fbc9665c222f7cf4..badc7e055609387bf6c09e32b7916919a5320aa1 100644 (file)
@@ -13,7 +13,7 @@ typedef struct
   double d;
 } test_structure_7;
 
-static test_structure_7 struct7 (test_structure_7 ts)
+static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts)
 {
   ts.f1 += 1;
   ts.f2 += 1;
@@ -49,7 +49,7 @@ int main (void)
   values[0] = &ts7_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK);
   
   ts7_arg.f1 = 5.55f;
   ts7_arg.f2 = 55.5f;
index 266e1f0ad606e7b85fb589bd74f2057816acb2dd..ef204ecbbce5074389f51b192243cf25b9a75ecc 100644 (file)
@@ -14,7 +14,7 @@ typedef struct
   float f4;
 } test_structure_8;
 
-static test_structure_8 struct8 (test_structure_8 ts)
+static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts)
 {
   ts.f1 += 1;
   ts.f2 += 1;
@@ -52,7 +52,7 @@ int main (void)
   values[0] = &ts8_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK);
   
   ts8_arg.f1 = 5.55f;
   ts8_arg.f2 = 55.5f;
index efeb7161b845f29e0da17c482c891e5377708871..4a13b818c4ee0693604a6d41eb00c10067ee4273 100644 (file)
@@ -13,7 +13,7 @@ typedef struct
   int i;
 } test_structure_9;
 
-static test_structure_9 struct9 (test_structure_9 ts)
+static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts)
 {
   ts.f += 1;
   ts.i += 1;
@@ -47,7 +47,7 @@ int main (void)
   values[0] = &ts9_arg;
   
   /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK);
+  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK);
   
   ts9_arg.f = 5.55f;
   ts9_arg.i = 5;
index 02c34d8595da5b37a1c787afc2e754fe6737e98b..67cfefeca6369d56609a8b52ac0aac4a26a9a46b 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "ffitest.h"
 
-void
+void ABI_ATTR
 closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
                void** args __UNUSED__, void* userdata __UNUSED__)
 {