Add fenv test support for targets which don't have FP traps.
authorWilco <wdijkstr@arm.com>
Thu, 17 Apr 2014 08:39:27 +0000 (09:39 +0100)
committerMarcus Shawcroft <marcus.shawcroft@arm.com>
Thu, 17 Apr 2014 08:39:27 +0000 (09:39 +0100)
ChangeLog
math/test-fenv.c
sysdeps/arm/math-tests.h
sysdeps/generic/math-tests.h

index ac40659..b8fa520 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-04-17  Wilco  <wdijkstr@arm.com>
+
+       * sysdeps/arm/math-tests.h: New file: Set ARM math-test settings.
+       * sysdeps/generic/math-tests.h: Add macro (EXCEPTION_ENABLE_SUPPORTED).
+       * math/test-fenv.c: Skip exception trap tests on targets which only
+       support non-stop mode.
+
 2014-04-17  Ian Bolton  <ian.bolton@arm.com>
            Wilco Dijkstra  <wilco.dijkstra@arm.com>
 
index 73cd1a7..23e47d4 100644 (file)
@@ -36,6 +36,7 @@
 #include <unistd.h>
 #include <sys/wait.h>
 #include <sys/resource.h>
+#include <math-tests.h>
 
 /*
   Since not all architectures might define all exceptions, we define
@@ -233,14 +234,9 @@ feenv_nomask_test (const char *flag_name, int fe_exc)
 #if defined FE_NOMASK_ENV
   int status;
   pid_t pid;
-  fenv_t saved;
 
-  fegetenv (&saved);
-  errno = 0;
-  fesetenv (FE_NOMASK_ENV);
-  status = errno;
-  fesetenv (&saved);
-  if (status == ENOSYS)
+  if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT)
+      && fesetenv (FE_NOMASK_ENV) != 0)
     {
       printf ("Test: not testing FE_NOMASK_ENV, it isn't implemented.\n");
       return;
@@ -349,7 +345,13 @@ feexcp_nomask_test (const char *flag_name, int fe_exc)
   int status;
   pid_t pid;
 
-  printf ("Test: after fedisableexcept (%s) processes will abort\n",
+  if (!EXCEPTION_ENABLE_SUPPORTED (fe_exc) && feenableexcept (fe_exc) == -1)
+    {
+      printf ("Test: not testing feenableexcept, it isn't implemented.\n");
+      return;
+    }
+
+  printf ("Test: after feenableexcept (%s) processes will abort\n",
          flag_name);
   printf ("      when feraiseexcept (%s) is called.\n", flag_name);
   pid = fork ();
@@ -470,7 +472,6 @@ feenable_test (const char *flag_name, int fe_exc)
 {
   int excepts;
 
-
   printf ("Tests for feenableexcepts etc. with flag %s\n", flag_name);
 
   /* First disable all exceptions.  */
@@ -488,8 +489,12 @@ feenable_test (const char *flag_name, int fe_exc)
              flag_name, excepts);
       ++count_errors;
     }
-
   excepts = feenableexcept (fe_exc);
+  if (!EXCEPTION_ENABLE_SUPPORTED (fe_exc) && excepts == -1)
+    {
+      printf ("Test: not testing feenableexcept, it isn't implemented.\n");
+      return;
+    }
   if (excepts == -1)
     {
       printf ("Test: feenableexcept (%s) failed\n", flag_name);
index e65f135..ea5f8dc 100644 (file)
@@ -29,4 +29,7 @@
 # define EXCEPTION_TESTS_long_double   0
 #endif
 
+/* Not all VFP implementations support trapping exceptions.  */
+#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT)     ((EXCEPT) == 0)
+
 #include_next <math-tests.h>
index c86b067..3f2bd69 100644 (file)
   (sizeof (TYPE) == sizeof (float) ? EXCEPTION_TESTS_float     \
    : sizeof (TYPE) == sizeof (double) ? EXCEPTION_TESTS_double \
    : EXCEPTION_TESTS_long_double)
+
+/* Indicate whether the given exception trap(s) can be enabled
+   in feenableexcept.  If non-zero, the traps are always supported.
+   If zero, traps may or may not be supported depending on the
+   target (this can be determined by checking the return value
+   of feenableexcept).  This enables skipping of tests which use
+   traps.  By default traps are supported unless overridden.  */
+#ifndef EXCEPTION_ENABLE_SUPPORTED
+# define EXCEPTION_ENABLE_SUPPORTED(EXCEPT)                    \
+   (EXCEPTION_TESTS_float || EXCEPTION_TESTS_double)
+#endif