This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] [ARM] Add fenv test support for targets which don't have FP traps
- From: "Wilco" <wdijkstr at arm dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Wed, 19 Mar 2014 16:43:14 -0000
- Subject: [PATCH] [ARM] Add fenv test support for targets which don't have FP traps
- Authentication-results: sourceware.org; auth=none
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(-)
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
--
1.7.9.5