Add fenv test support for targets which don't have FP traps.

This commit is contained in:
Wilco 2014-04-17 09:39:27 +01:00 committed by Marcus Shawcroft
parent bc93ab2946
commit 423a7160af
4 changed files with 36 additions and 10 deletions

View File

@ -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> 2014-04-17 Ian Bolton <ian.bolton@arm.com>
Wilco Dijkstra <wilco.dijkstra@arm.com> Wilco Dijkstra <wilco.dijkstra@arm.com>

View File

@ -36,6 +36,7 @@
#include <unistd.h> #include <unistd.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <math-tests.h>
/* /*
Since not all architectures might define all exceptions, we define 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 #if defined FE_NOMASK_ENV
int status; int status;
pid_t pid; pid_t pid;
fenv_t saved;
fegetenv (&saved); if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT)
errno = 0; && fesetenv (FE_NOMASK_ENV) != 0)
fesetenv (FE_NOMASK_ENV);
status = errno;
fesetenv (&saved);
if (status == ENOSYS)
{ {
printf ("Test: not testing FE_NOMASK_ENV, it isn't implemented.\n"); printf ("Test: not testing FE_NOMASK_ENV, it isn't implemented.\n");
return; return;
@ -349,7 +345,13 @@ feexcp_nomask_test (const char *flag_name, int fe_exc)
int status; int status;
pid_t pid; 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); flag_name);
printf (" when feraiseexcept (%s) is called.\n", flag_name); printf (" when feraiseexcept (%s) is called.\n", flag_name);
pid = fork (); pid = fork ();
@ -470,7 +472,6 @@ feenable_test (const char *flag_name, int fe_exc)
{ {
int excepts; int excepts;
printf ("Tests for feenableexcepts etc. with flag %s\n", flag_name); printf ("Tests for feenableexcepts etc. with flag %s\n", flag_name);
/* First disable all exceptions. */ /* First disable all exceptions. */
@ -488,8 +489,12 @@ feenable_test (const char *flag_name, int fe_exc)
flag_name, excepts); flag_name, excepts);
++count_errors; ++count_errors;
} }
excepts = feenableexcept (fe_exc); 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) if (excepts == -1)
{ {
printf ("Test: feenableexcept (%s) failed\n", flag_name); printf ("Test: feenableexcept (%s) failed\n", flag_name);

View File

@ -29,4 +29,7 @@
# define EXCEPTION_TESTS_long_double 0 # define EXCEPTION_TESTS_long_double 0
#endif #endif
/* Not all VFP implementations support trapping exceptions. */
#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0)
#include_next <math-tests.h> #include_next <math-tests.h>

View File

@ -76,3 +76,14 @@
(sizeof (TYPE) == sizeof (float) ? EXCEPTION_TESTS_float \ (sizeof (TYPE) == sizeof (float) ? EXCEPTION_TESTS_float \
: sizeof (TYPE) == sizeof (double) ? EXCEPTION_TESTS_double \ : sizeof (TYPE) == sizeof (double) ? EXCEPTION_TESTS_double \
: EXCEPTION_TESTS_long_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