This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
RE: [PATCH] [ARM] Add fenv test support for targets which don't have FP traps
- From: "Wilco" <wdijkstr at arm dot com>
- To: "'Joseph Myers'" <joseph at codesourcery dot com>
- Cc: <libc-alpha at sourceware dot org>
- Date: Tue, 25 Mar 2014 18:21:04 -0000
- Subject: RE: [PATCH] [ARM] Add fenv test support for targets which don't have FP traps
- Authentication-results: sourceware.org; auth=none
- References: <000101cf4392$529cd5d0$f7d68170$ at com> <Pine dot LNX dot 4 dot 64 dot 1403191739090 dot 14867 at digraph dot polyomino dot org dot uk>
On Wed, 19 Mar 2014, Joseph Myers 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).
I've updated the comment to:
+/* 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. */
Wilco
---
math/test-fenv.c | 25 +++++++++++++++----------
sysdeps/arm/math-tests.h | 3 +++
sysdeps/generic/math-tests.h | 11 +++++++++++
3 files changed, 29 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..3f2bd69 100644
--- a/sysdeps/generic/math-tests.h
+++ b/sysdeps/generic/math-tests.h
@@ -76,3 +76,14 @@
(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
--
1.7.9.5