Refactor libm-test inline tests disabling.

This patch refactors how libm-test.inc handles disabling
errno/exception handling tests, and some other tests, for
__FAST_MATH__ inline function tests.

The macro TEST_INLINE is changed from being defined/undefined to being
defined to 1 or 0, so that it can be tested in "if" conditionals
instead of #if.  For tests of errno and exception setting, separate
macros TEST_ERRNO and TEST_EXCEPTIONS are added, and TEST_ERRNO is
also used in the disabling of errno testing for vector function
tests.  The relevant conditionals are moved up a function, so that
they take effect before the code that counts the number of tests, so
the inline function tests now accurately report that 0 tests for
exceptions and errno were executed (whereas they previously reported a
large number desipte not running any such tests).

Tested for x86_64 and x86.

	* math/test-math-errno.h: New file.
	* math/test-math-inline.h (TEST_INLINE): Define to 1 instead of
	empty.
	(TEST_ERRNO): New macro.
	(TEST_EXCEPTIONS): Likewise.
	* math/test-math-no-inline.h (TEST_INLINE): Likewise.
	(TEST_EXCEPTIONS): Likewise.
	* math/test-math-vector.h (TEST_ERRNO): Likewise.
	* math/test-double.c: Include "test-math-errno.h".
	* math/test-float.c: Likewise.
	* math/test-ldouble.c: Likewise.
	* math/libm-test.inc (test_single_exception) [!TEST_INLINE]: Make
	code unconditional.
	(test_exceptions): Only run code if TEST_EXCEPTIONS.
	(test_single_errno) [!TEST_INLINE && !TEST_MATHVEC]: Make code
	unconditional.
	(test_errno): Only run code if TEST_ERRNO.
	(enable_test): Use "if" conditional on TEST_INLINE, not #ifdef.
This commit is contained in:
Joseph Myers 2015-11-04 21:30:26 +00:00
parent 6fdd5d65c5
commit e3a0002094
9 changed files with 62 additions and 17 deletions

View File

@ -1,3 +1,24 @@
2015-11-04 Joseph Myers <joseph@codesourcery.com>
* math/test-math-errno.h: New file.
* math/test-math-inline.h (TEST_INLINE): Define to 1 instead of
empty.
(TEST_ERRNO): New macro.
(TEST_EXCEPTIONS): Likewise.
* math/test-math-no-inline.h (TEST_INLINE): Likewise.
(TEST_EXCEPTIONS): Likewise.
* math/test-math-vector.h (TEST_ERRNO): Likewise.
* math/test-double.c: Include "test-math-errno.h".
* math/test-float.c: Likewise.
* math/test-ldouble.c: Likewise.
* math/libm-test.inc (test_single_exception) [!TEST_INLINE]: Make
code unconditional.
(test_exceptions): Only run code if TEST_EXCEPTIONS.
(test_single_errno) [!TEST_INLINE && !TEST_MATHVEC]: Make code
unconditional.
(test_errno): Only run code if TEST_ERRNO.
(enable_test): Use "if" conditional on TEST_INLINE, not #ifdef.
2015-11-04 Florian Weimer <fweimer@redhat.com> 2015-11-04 Florian Weimer <fweimer@redhat.com>
* nptl/tst-once5.cc: Remove attribution. * nptl/tst-once5.cc: Remove attribution.

View File

@ -608,7 +608,6 @@ test_single_exception (const char *test_name,
int fe_flag, int fe_flag,
const char *flag_name) const char *flag_name)
{ {
# ifndef TEST_INLINE
int ok = 1; int ok = 1;
if (exception & exc_flag) if (exception & exc_flag)
{ {
@ -643,8 +642,6 @@ test_single_exception (const char *test_name,
} }
if (!ok) if (!ok)
++noErrors; ++noErrors;
# endif
} }
#endif #endif
@ -654,7 +651,7 @@ test_single_exception (const char *test_name,
static void static void
test_exceptions (const char *test_name, int exception) test_exceptions (const char *test_name, int exception)
{ {
if (EXCEPTION_TESTS (FLOAT)) if (TEST_EXCEPTIONS && EXCEPTION_TESTS (FLOAT))
{ {
++noExcTests; ++noExcTests;
#ifdef FE_DIVBYZERO #ifdef FE_DIVBYZERO
@ -694,7 +691,6 @@ static void
test_single_errno (const char *test_name, int errno_value, test_single_errno (const char *test_name, int errno_value,
int expected_value, const char *expected_name) int expected_value, const char *expected_name)
{ {
#if !defined TEST_INLINE && !TEST_MATHVEC
if (errno_value == expected_value) if (errno_value == expected_value)
{ {
if (print_screen (1)) if (print_screen (1))
@ -708,7 +704,6 @@ test_single_errno (const char *test_name, int errno_value,
printf ("Failure: %s: errno set to %d, expected %d (%s)\n", printf ("Failure: %s: errno set to %d, expected %d (%s)\n",
test_name, errno_value, expected_value, expected_name); test_name, errno_value, expected_value, expected_name);
} }
#endif
} }
/* Test whether errno (value ERRNO_VALUE) has been for TEST_NAME set /* Test whether errno (value ERRNO_VALUE) has been for TEST_NAME set
@ -716,13 +711,16 @@ test_single_errno (const char *test_name, int errno_value,
static void static void
test_errno (const char *test_name, int errno_value, int exceptions) test_errno (const char *test_name, int errno_value, int exceptions)
{ {
++noErrnoTests; if (TEST_ERRNO)
if (exceptions & ERRNO_UNCHANGED) {
test_single_errno (test_name, errno_value, 0, "unchanged"); ++noErrnoTests;
if (exceptions & ERRNO_EDOM) if (exceptions & ERRNO_UNCHANGED)
test_single_errno (test_name, errno_value, EDOM, "EDOM"); test_single_errno (test_name, errno_value, 0, "unchanged");
if (exceptions & ERRNO_ERANGE) if (exceptions & ERRNO_EDOM)
test_single_errno (test_name, errno_value, ERANGE, "ERANGE"); test_single_errno (test_name, errno_value, EDOM, "EDOM");
if (exceptions & ERRNO_ERANGE)
test_single_errno (test_name, errno_value, ERANGE, "ERANGE");
}
} }
/* Returns the number of ulps that GIVEN is away from EXPECTED. */ /* Returns the number of ulps that GIVEN is away from EXPECTED. */
@ -1041,10 +1039,8 @@ enable_test (int exceptions)
{ {
if (exceptions & XFAIL_TEST) if (exceptions & XFAIL_TEST)
return 0; return 0;
#ifdef TEST_INLINE if (TEST_INLINE && (exceptions & NO_TEST_INLINE))
if (exceptions & NO_TEST_INLINE)
return 0; return 0;
#endif
return 1; return 1;
} }

View File

@ -18,6 +18,7 @@
#include "test-double.h" #include "test-double.h"
#include "test-math-no-inline.h" #include "test-math-no-inline.h"
#include "test-math-errno.h"
#include "test-math-scalar.h" #include "test-math-scalar.h"
#define TEST_MSG "testing double (without inline functions)\n" #define TEST_MSG "testing double (without inline functions)\n"

View File

@ -18,6 +18,7 @@
#include "test-float.h" #include "test-float.h"
#include "test-math-no-inline.h" #include "test-math-no-inline.h"
#include "test-math-errno.h"
#include "test-math-scalar.h" #include "test-math-scalar.h"
#define TEST_MSG "testing float (without inline functions)\n" #define TEST_MSG "testing float (without inline functions)\n"

View File

@ -18,6 +18,7 @@
#include "test-ldouble.h" #include "test-ldouble.h"
#include "test-math-no-inline.h" #include "test-math-no-inline.h"
#include "test-math-errno.h"
#include "test-math-scalar.h" #include "test-math-scalar.h"
#define TEST_MSG "testing long double (without inline functions)\n" #define TEST_MSG "testing long double (without inline functions)\n"

19
math/test-math-errno.h Normal file
View File

@ -0,0 +1,19 @@
/* Common definitions for libm tests for functions setting errno.
Copyright (C) 2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define TEST_ERRNO 1

View File

@ -16,7 +16,9 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define TEST_INLINE #define TEST_INLINE 1
#define TEST_ERRNO 0
#define TEST_EXCEPTIONS 0
#ifdef __NO_MATH_INLINES #ifdef __NO_MATH_INLINES
# undef __NO_MATH_INLINES # undef __NO_MATH_INLINES

View File

@ -16,6 +16,9 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define TEST_INLINE 0
#define TEST_EXCEPTIONS 1
#ifndef __NO_MATH_INLINES #ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES # define __NO_MATH_INLINES
#endif #endif

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define TEST_MATHVEC 1 #define TEST_MATHVEC 1
#define TEST_ERRNO 0
#define CNCT(x, y) x ## y #define CNCT(x, y) x ## y
#define CONCAT(a, b) CNCT (a, b) #define CONCAT(a, b) CNCT (a, b)