diff options
author | Joseph Myers <joseph@codesourcery.com> | 2017-02-08 21:11:49 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-02-08 21:11:49 +0000 |
commit | 3b2f60328eb4a9f9d776ee63931a3538eafe596a (patch) | |
tree | a06c3d3691096beb2cefe7b186c1c6adf2a73687 /math/Makefile | |
parent | 5ab621c3476fef993f94975c826fd0fe3339c3e2 (diff) | |
download | glibc-3b2f60328eb4a9f9d776ee63931a3538eafe596a.zip glibc-3b2f60328eb4a9f9d776ee63931a3538eafe596a.tar.gz glibc-3b2f60328eb4a9f9d776ee63931a3538eafe596a.tar.bz2 |
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(XFAIL_TEST): Likewise.
(ERRNO_UNCHANGED): Likewise.
(ERRNO_EDOM): Likewise.
(ERRNO_ERANGE): Likewise.
(IGNORE_RESULT): Likewise.
(NON_FINITE): Likewise.
(TEST_SNAN): Likewise.
(NO_TEST_MATHVEC): Likewise.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
Diffstat (limited to 'math/Makefile')
-rw-r--r-- | math/Makefile | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/math/Makefile b/math/Makefile index 0f59123..e5e4412 100644 --- a/math/Makefile +++ b/math/Makefile @@ -203,6 +203,9 @@ libm-tests = $(foreach t,$(types),test-$(t) test-$(t)-finite test-i$(t)) \ libm-tests.o = $(addsuffix .o,$(libm-tests)) tests += $(libm-tests) +libm-test-support = $(foreach t,$(types),libm-test-support-$(t)) +test-extras += $(libm-test-support) +extra-test-objs += $(addsuffix .o, $(libm-test-support)) libm-vec-test-wrappers = $(addsuffix -wrappers, $(libm-vec-tests)) test-extras += $(libm-vec-test-wrappers) extra-test-objs += $(addsuffix .o, $(libm-vec-test-wrappers)) @@ -290,10 +293,13 @@ libm-test-finite-cflags = $(libm-test-no-inline-cflags) \ -U__FINITE_MATH_ONLY__ -D__FINITE_MATH_ONLY__=1 CFLAGS-test-float.c = $(libm-test-no-inline-cflags) CFLAGS-test-float-finite.c = $(libm-test-finite-cflags) +CFLAGS-libm-test-support-float.c = $(libm-test-no-inline-cflags) CFLAGS-test-double.c = $(libm-test-no-inline-cflags) CFLAGS-test-double-finite.c = $(libm-test-finite-cflags) +CFLAGS-libm-test-support-double.c = $(libm-test-no-inline-cflags) CFLAGS-test-ldouble.c = $(libm-test-no-inline-cflags) CFLAGS-test-ldouble-finite.c = $(libm-test-finite-cflags) +CFLAGS-libm-test-support-ldouble.c = $(libm-test-no-inline-cflags) CFLAGS-test-tgmath.c = -fno-builtin # The following testcase uses very long lines (>3 million), so it may take a # while to compile it. See: http://llvm.org/bugs/show_bug.cgi?id=14106 and @@ -374,6 +380,18 @@ ifneq (no,$(PERL)) $(addprefix $(objpfx), $(libm-tests.o)): $(addprefix $(objpfx),\ $(libm-tests-generated)) +$(addprefix $(objpfx),\ + $(filter test-float% test-ifloat%,\ + $(libm-tests))): $(objpfx)libm-test-support-float.o + +$(addprefix $(objpfx),\ + $(filter test-double% test-idouble%,\ + $(libm-tests))): $(objpfx)libm-test-support-double.o + +$(addprefix $(objpfx),\ + $(filter test-ldouble% test-ildouble%,\ + $(libm-tests))): $(objpfx)libm-test-support-ldouble.o + # Run the math programs to automatically generate ULPs files. .PHONY: regen-ulps |