[ARM] Add fenv test support for targets which don't have FP traps
diff mbox

Message ID 000101cf4392$529cd5d0$f7d68170$@com
State New
Headers show

Commit Message

Wilco March 19, 2014, 4:43 p.m. UTC
Hi,

This patch adds support in the fenv tests for VFP implementations which 
don't support trapping on FP exceptions. If EXCEPTION_ENABLE_SUPPORTED is 
false, tests which use traps are skipped without error when fesetenv or
feenableexcept fail to enable an exception trap. Any failures on targets 
which do support traps are not hidden.

Math/test-fenv.c now passes without failures on Cortex-A15.

OK for commit?

Wilco

---
 math/test-fenv.c             |   25 +++++++++++++++----------
 sysdeps/arm/math-tests.h     |    3 +++
 sysdeps/generic/math-tests.h |    7 +++++++
 3 files changed, 25 insertions(+), 10 deletions(-)

Comments

Joseph Myers March 19, 2014, 5:40 p.m. UTC | #1
On Wed, 19 Mar 2014, Wilco wrote:

> +/* Indicate whether the given exception trap(s) can be enabled
> +   in feenableexcept.  All traps are supported unless overridden.  */
> +#ifndef EXCEPTION_ENABLE_SUPPORTED
> +# define EXCEPTION_ENABLE_SUPPORTED(EXCEPT)			\
> +   (EXCEPTION_TESTS_float || EXCEPTION_TESTS_double)
> +#endif

I think the comment needs to make the definition clearer (that a nonzero 
value means the traps are definitely supported, but a zero value means 
they might or might not be supported and this is determined at runtime 
with enabling traps being allowed to fail).

Patch
diff mbox

diff --git a/math/test-fenv.c b/math/test-fenv.c
index 73cd1a7..23e47d4 100644
--- a/math/test-fenv.c
+++ b/math/test-fenv.c
@@ -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);
diff --git a/sysdeps/arm/math-tests.h b/sysdeps/arm/math-tests.h
index e65f135..ea5f8dc 100644
--- a/sysdeps/arm/math-tests.h
+++ b/sysdeps/arm/math-tests.h
@@ -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>
diff --git a/sysdeps/generic/math-tests.h b/sysdeps/generic/math-tests.h
index c86b067..3df6948 100644
--- a/sysdeps/generic/math-tests.h
+++ b/sysdeps/generic/math-tests.h
@@ -76,3 +76,10 @@ 
   (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.  All traps are supported unless overridden.  */
+#ifndef EXCEPTION_ENABLE_SUPPORTED
+# define EXCEPTION_ENABLE_SUPPORTED(EXCEPT)			\
+   (EXCEPTION_TESTS_float || EXCEPTION_TESTS_double)
+#endif