02e32295b2
Add a new check-simd target to the testsuite. The new target creates a subdirectory, generates the necessary Makefiles, and spawns submakes to build and run the tests. Running this testsuite with defaults on my machine takes half of the time the dejagnu testsuite required to only determine whether to run tests. Since the simd testsuite integrated in dejagnu increased the time of the whole libstdc++ testsuite by ~100% this approach is a compromise for speed while not sacrificing coverage too much. Since the test driver is invoked individually per test executable from a Makefile, make's jobserver (-j) trivially parallelizes testing. Testing different flags and with simulator (or remote execution) is possible. E.g. `make check-simd DRIVEROPTS=-q target_list="unix{-m64,-m32}{-march=sandybridge,-march=skylake-avx512}{,- ffast-math}"` runs the testsuite 8 times in different subdirectories, using 8 different combinations of compiler flags, only outputs failing tests (-q), and prints all summaries at the end. It skips most ABI tags by default unless --run-expensive is passed to DRIVEROPTS or GCC_TEST_RUN_EXPENSIVE is not empty. To use a simulator, the CHECK_SIMD_CONFIG variable needs to point to a shell script which calls `define_target <name> <flags> <simulator>` and set target_list as needed. E.g.: case "$target_triplet" in x86_64-*) target_list="unix{-march=sandybridge,-march=skylake-avx512} ;; powerpc64le-*) define_target power8 "-static -mcpu=power8" "/usr/bin/qemu-ppc64le -cpu power8" define_target power9 -mcpu=power9 "$HOME/bin/run_on_gcc135" target_list="power8 power9{,-ffast-math}" ;; esac libstdc++-v3/ChangeLog: * scripts/check_simd: New file. This script is called from the the check-simd target. It determines a set of compiler flags and simulator setups for calling generate_makefile.sh and passes the information back to the check-simd target, which recurses to the generated Makefiles. * scripts/create_testsuite_files: Remove files below simd/tests/ from testsuite_files and place them in testsuite_files_simd. * testsuite/Makefile.am: Add testsuite_files_simd. Add check-simd target. * testsuite/Makefile.in: Regenerate. * testsuite/experimental/simd/driver.sh: New file. This script compiles and runs a given simd test, logging its output and status. It uses the timeout command to implement compile and test timeouts. * testsuite/experimental/simd/generate_makefile.sh: New file. This script generates a Makefile which uses driver.sh to compile and run the tests and collect the logs into a single log file. * testsuite/experimental/simd/tests/abs.cc: New file. Tests abs(simd). * testsuite/experimental/simd/tests/algorithms.cc: New file. Tests min/max(simd, simd). * testsuite/experimental/simd/tests/bits/conversions.h: New file. Contains functions to support tests involving conversions. * testsuite/experimental/simd/tests/bits/make_vec.h: New file. Support functions make_mask and make_vec. * testsuite/experimental/simd/tests/bits/mathreference.h: New file. Support functions to supply precomputed math function reference data. * testsuite/experimental/simd/tests/bits/metahelpers.h: New file. Support code for SFINAE testing. * testsuite/experimental/simd/tests/bits/simd_view.h: New file. * testsuite/experimental/simd/tests/bits/test_values.h: New file. Test functions to easily drive a test with simd objects initialized from a given list of values and a range of random values. * testsuite/experimental/simd/tests/bits/ulp.h: New file. Support code to determine the ULP distance of simd objects. * testsuite/experimental/simd/tests/bits/verify.h: New file. Test framework for COMPARE'ing simd objects and instantiating the test templates with value_type and ABI tag. * testsuite/experimental/simd/tests/broadcast.cc: New file. Test simd broadcasts. * testsuite/experimental/simd/tests/casts.cc: New file. Test simd casts. * testsuite/experimental/simd/tests/fpclassify.cc: New file. Test floating-point classification functions. * testsuite/experimental/simd/tests/frexp.cc: New file. Test frexp(simd). * testsuite/experimental/simd/tests/generator.cc: New file. Test simd generator constructor. * testsuite/experimental/simd/tests/hypot3_fma.cc: New file. Test 3-arg hypot(simd,simd,simd) and fma(simd,simd,sim). * testsuite/experimental/simd/tests/integer_operators.cc: New file. Test integer operators. * testsuite/experimental/simd/tests/ldexp_scalbn_scalbln_modf.cc: New file. Test ldexp(simd), scalbn(simd), scalbln(simd), and modf(simd). * testsuite/experimental/simd/tests/loadstore.cc: New file. Test (converting) simd loads and stores. * testsuite/experimental/simd/tests/logarithm.cc: New file. Test log*(simd). * testsuite/experimental/simd/tests/mask_broadcast.cc: New file. Test simd_mask broadcasts. * testsuite/experimental/simd/tests/mask_conversions.cc: New file. Test simd_mask conversions. * testsuite/experimental/simd/tests/mask_implicit_cvt.cc: New file. Test simd_mask implicit conversions. * testsuite/experimental/simd/tests/mask_loadstore.cc: New file. Test simd_mask loads and stores. * testsuite/experimental/simd/tests/mask_operator_cvt.cc: New file. Test simd_mask operators convert as specified. * testsuite/experimental/simd/tests/mask_operators.cc: New file. Test simd_mask compares, subscripts, and negation. * testsuite/experimental/simd/tests/mask_reductions.cc: New file. Test simd_mask reductions. * testsuite/experimental/simd/tests/math_1arg.cc: New file. Test 1-arg math functions on simd. * testsuite/experimental/simd/tests/math_2arg.cc: New file. Test 2-arg math functions on simd. * testsuite/experimental/simd/tests/operator_cvt.cc: New file. Test implicit conversions on simd binary operators behave as specified. * testsuite/experimental/simd/tests/operators.cc: New file. Test simd compares, subscripts, not, unary minus, plus, minus, multiplies, divides, increment, and decrement. * testsuite/experimental/simd/tests/reductions.cc: New file. Test reduce(simd). * testsuite/experimental/simd/tests/remqo.cc: New file. Test remqo(simd). * testsuite/experimental/simd/tests/simd.cc: New file. Basic sanity checks of simd types. * testsuite/experimental/simd/tests/sincos.cc: New file. Test sin(simd) and cos(simd). * testsuite/experimental/simd/tests/split_concat.cc: New file. Test split(simd) and concat(simd, simd). * testsuite/experimental/simd/tests/splits.cc: New file. Test split(simd_mask). * testsuite/experimental/simd/tests/trigonometric.cc: New file. Test remaining trigonometric functions on simd. * testsuite/experimental/simd/tests/trunc_ceil_floor.cc: New file. Test trunc(simd), ceil(simd), and floor(simd). * testsuite/experimental/simd/tests/where.cc: New file. Test masked operations using where.
252 lines
10 KiB
Makefile
252 lines
10 KiB
Makefile
## Makefile for the testsuite subdirectory of the GNU C++ Standard library.
|
|
##
|
|
## Copyright (C) 2001-2021 Free Software Foundation, Inc.
|
|
##
|
|
## This file is part of the libstdc++ version 3 distribution.
|
|
## Process this file with automake to produce Makefile.in.
|
|
|
|
## This file is part of the GNU ISO C++ Library. This library is free
|
|
## software; you can redistribute it and/or modify it under the
|
|
## terms of the GNU General Public License as published by the
|
|
## Free Software Foundation; either version 3, or (at your option)
|
|
## any later version.
|
|
|
|
## This 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 General Public License for more details.
|
|
|
|
## You should have received a copy of the GNU General Public License along
|
|
## with this library; see the file COPYING3. If not see
|
|
## <http://www.gnu.org/licenses/>.
|
|
|
|
AUTOMAKE_OPTIONS = nostdinc
|
|
RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
|
|
EXPECT = expect
|
|
|
|
include $(top_srcdir)/fragment.am
|
|
|
|
# Generated lists of files to run. All of these names are valid make
|
|
# targets, if you wish to generate a list manually.
|
|
lists_of_files = \
|
|
testsuite_files \
|
|
testsuite_files_interactive \
|
|
testsuite_files_performance \
|
|
testsuite_files_simd
|
|
|
|
# This rule generates all of the testsuite_files* lists at once.
|
|
${lists_of_files}:
|
|
${glibcxx_srcdir}/scripts/create_testsuite_files \
|
|
${glibcxx_srcdir}/testsuite `${PWD_COMMAND}`
|
|
|
|
# We need more things in site.exp, but automake completely controls the
|
|
# creation of that file; there's no way to append to it without messing up
|
|
# the dependancy chains. So we overrule automake. This rule is exactly
|
|
# what it would have generated, plus our own additions.
|
|
site.exp: Makefile
|
|
@echo 'Making a new site.exp file...'
|
|
@echo '## these variables are automatically generated by make ##' >site.tmp
|
|
@echo '# Do not edit here. If you wish to override these values' >>site.tmp
|
|
@echo '# edit the last section' >>site.tmp
|
|
@echo 'set tool libstdc++' >>site.tmp
|
|
@echo 'set srcdir $(srcdir)' >>site.tmp
|
|
@echo "set objdir `pwd`" >>site.tmp
|
|
@echo 'set build_alias "$(build_alias)"' >>site.tmp
|
|
@echo 'set build_triplet $(build_triplet)' >>site.tmp
|
|
@echo 'set host_alias "$(host_alias)"' >>site.tmp
|
|
@echo 'set host_triplet $(host_triplet)' >>site.tmp
|
|
@echo 'set target_alias "$(target_alias)"' >>site.tmp
|
|
@echo 'set target_triplet $(target_triplet)' >>site.tmp
|
|
@echo 'set libiconv "$(LIBICONV)"' >>site.tmp
|
|
@echo 'set baseline_dir "$(baseline_dir)"' >> site.tmp
|
|
@echo 'set baseline_subdir_switch "$(baseline_subdir_switch)"' >> site.tmp
|
|
@echo 'set TEST_GCC_EXEC_PREFIX "$(libdir)/gcc/"' >> site.tmp
|
|
@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
|
|
@test ! -f site.exp || \
|
|
sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
|
|
@-rm -f site.bak
|
|
@test ! -f site.exp || mv site.exp site.bak
|
|
@mv site.tmp site.exp
|
|
|
|
|
|
extract_symvers = $(glibcxx_builddir)/scripts/extract_symvers
|
|
|
|
baseline_subdir := $(shell $(CXX) $(baseline_subdir_switch))
|
|
|
|
baseline_symbols:
|
|
-@(output=${baseline_dir}/${baseline_subdir}/baseline_symbols.txt; \
|
|
if test ! -f $${output}; then \
|
|
echo "Baseline file doesn't exist."; \
|
|
echo "Try 'make new-abi-baseline' to create it."; \
|
|
exit 1; \
|
|
fi; true)
|
|
|
|
new-abi-baseline:
|
|
-@$(mkinstalldirs) ${baseline_dir}/${baseline_subdir}
|
|
-@(output=${baseline_dir}/${baseline_subdir}/baseline_symbols.txt; \
|
|
if test -f $${output}; then \
|
|
output=$${output}.new; \
|
|
t=`echo $${output} | sed 's=.*config/abi/=='`; \
|
|
echo "Baseline file already exists, writing to $${t} instead."; \
|
|
fi; \
|
|
${extract_symvers} ../src/.libs/libstdc++.so $${output})
|
|
|
|
%/site.exp: site.exp
|
|
-@test -d $* || mkdir $*
|
|
@srcdir=`cd $(srcdir); ${PWD_COMMAND}`;
|
|
@objdir=`${PWD_COMMAND}`/$*; \
|
|
sed -e "s|^set srcdir .*$$|set srcdir $$srcdir|" \
|
|
-e "s|^set objdir .*$$|set objdir $$objdir|" \
|
|
site.exp > $*/site.exp.tmp
|
|
@-rm -f $*/site.bak
|
|
@test ! -f $*/site.exp || mv $*/site.exp $*/site.bak
|
|
@mv $*/site.exp.tmp $*/site.exp
|
|
|
|
check_p_numbers0:=1 2 3 4 5 6 7 8 9
|
|
check_p_numbers1:=0 $(check_p_numbers0)
|
|
check_p_numbers2:=$(foreach i,$(check_p_numbers0),$(addprefix $(i),$(check_p_numbers1)))
|
|
check_p_numbers3:=$(addprefix 0,$(check_p_numbers1)) $(check_p_numbers2)
|
|
check_p_numbers4:=$(foreach i,$(check_p_numbers0),$(addprefix $(i),$(check_p_numbers3)))
|
|
check_p_numbers5:=$(addprefix 0,$(check_p_numbers3)) $(check_p_numbers4)
|
|
check_p_numbers6:=$(foreach i,$(check_p_numbers0),$(addprefix $(i),$(check_p_numbers5)))
|
|
check_p_numbers:=$(check_p_numbers0) $(check_p_numbers2) $(check_p_numbers4) $(check_p_numbers6)
|
|
check_p_subdirs=$(wordlist 1,$(if $(GCC_TEST_PARALLEL_SLOTS),$(GCC_TEST_PARALLEL_SLOTS),128),$(check_p_numbers))
|
|
check_DEJAGNU_normal_targets = $(addprefix check-DEJAGNUnormal,$(check_p_subdirs))
|
|
$(check_DEJAGNU_normal_targets): check-DEJAGNUnormal%: normal%/site.exp
|
|
|
|
# Run the testsuite in normal mode.
|
|
check-DEJAGNU $(check_DEJAGNU_normal_targets): check-DEJAGNU%: site.exp
|
|
$(if $*,@)AR="$(AR)"; export AR; \
|
|
RANLIB="$(RANLIB)"; export RANLIB; \
|
|
if [ -z "$*" ] && [ -n "$(filter -j%, $(MFLAGS))" ]; then \
|
|
rm -rf normal-parallel || true; \
|
|
mkdir normal-parallel; \
|
|
$(MAKE) $(AM_MAKEFLAGS) $(check_DEJAGNU_normal_targets); \
|
|
rm -rf normal-parallel || true; \
|
|
for idx in $(check_p_subdirs); do \
|
|
if [ -d normal$$idx ]; then \
|
|
mv -f normal$$idx/libstdc++.sum normal$$idx/libstdc++.sum.sep; \
|
|
mv -f normal$$idx/libstdc++.log normal$$idx/libstdc++.log.sep; \
|
|
fi; \
|
|
done; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh \
|
|
normal[0-9]*/libstdc++.sum.sep > libstdc++.sum; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh -L \
|
|
normal[0-9]*/libstdc++.log.sep > libstdc++.log; \
|
|
exit 0; \
|
|
fi; \
|
|
srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
|
|
EXPECT=$(EXPECT); export EXPECT; \
|
|
runtest=$(RUNTEST); \
|
|
if [ -z "$$runtest" ]; then runtest=runtest; fi; \
|
|
tool=libstdc++; \
|
|
if [ -n "$*" ]; then \
|
|
if [ -f normal-parallel/finished ]; then rm -rf "$*"; exit 0; fi; \
|
|
GCC_RUNTEST_PARALLELIZE_DIR=`${PWD_COMMAND}`/normal-parallel; \
|
|
export GCC_RUNTEST_PARALLELIZE_DIR; \
|
|
cd "$*"; \
|
|
fi; \
|
|
if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
|
|
$$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) \
|
|
$(RUNTESTFLAGS); \
|
|
if [ -n "$*" ]; then \
|
|
touch $$GCC_RUNTEST_PARALLELIZE_DIR/finished; \
|
|
fi; \
|
|
else \
|
|
echo "WARNING: could not find \`runtest'" 1>&2; :;\
|
|
fi
|
|
|
|
check-am:
|
|
$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
|
|
.PHONY: check-DEJAGNU
|
|
|
|
# Use 'new-abi-baseline' to create an initial symbol file. Then run
|
|
# 'check-abi' to test for changes against that file.
|
|
check-abi: site.exp baseline_symbols
|
|
-@runtest $(AM_RUNTESTFLAGS) --tool libstdc++ $(RUNTESTFLAGS) abi.exp
|
|
|
|
# Runs the testsuite, but in compile only mode.
|
|
# Can be used to test sources with non-GNU FE's at various warning
|
|
# levels and for checking compile time across releases.
|
|
# See script.
|
|
compile_script=${glibcxx_srcdir}/scripts/check_compile
|
|
check-compile: testsuite_files ${compile_script}
|
|
-@(chmod + ${compile_script}; \
|
|
${compile_script} ${glibcxx_srcdir} ${glibcxx_builddir})
|
|
|
|
|
|
# Runs the testsuite/performance tests.
|
|
# Some of these tests create large (~75MB) files, allocate huge
|
|
# ammounts of memory, or otherwise tie up machine resources. Thus,
|
|
# running this is off by default.
|
|
# XXX Need to add dependency on libtestc++.a
|
|
check_performance_script=${glibcxx_srcdir}/scripts/check_performance
|
|
check-performance: testsuite_files_performance ${performance_script}
|
|
-@(chmod + ${check_performance_script}; \
|
|
CXXFLAGS='$(CXXFLAGS)'; export CXXFLAGS; \
|
|
${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir})
|
|
|
|
# Runs the simd tests.
|
|
check-simd: $(srcdir)/experimental/simd/generate_makefile.sh \
|
|
${glibcxx_srcdir}/scripts/check_simd \
|
|
testsuite_files_simd \
|
|
${glibcxx_builddir}/scripts/testsuite_flags
|
|
${glibcxx_srcdir}/scripts/check_simd "${glibcxx_srcdir}" "${glibcxx_builddir}" "$(CXXFLAGS)" | \
|
|
while read subdir; do \
|
|
$(MAKE) -C "$${subdir}"; \
|
|
tail -n20 $${subdir}/simd_testsuite.sum | \
|
|
grep -A20 -B1 'Summary ===' >> .simd.summary; \
|
|
done; \
|
|
cat .simd.summary && rm .simd.summary
|
|
|
|
# Runs the testsuite in debug mode.
|
|
debug_flags = "unix/-D_GLIBCXX_DEBUG"
|
|
|
|
# Runs the testsuite in parallel mode.
|
|
libgomp_dir=${glibcxx_builddir}/../libgomp
|
|
libgomp_flags=-B${glibcxx_builddir}/../libgomp \
|
|
-I${glibcxx_builddir}/../libgomp \
|
|
-L${glibcxx_builddir}/../libgomp/.libs -lgomp
|
|
|
|
atomic_flags=$(ATOMIC_FLAGS)
|
|
parallel_flags="unix/-D_GLIBCXX_PARALLEL/-fopenmp"
|
|
|
|
check-debug: site.exp
|
|
outputdir=debug; export outputdir; \
|
|
if test ! -d $${outputdir}; then \
|
|
mkdir $${outputdir}; \
|
|
fi; \
|
|
srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
|
|
EXPECT=$(EXPECT); export EXPECT; \
|
|
$(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(debug_flags)" check-DEJAGNU;
|
|
|
|
check-parallel: site.exp
|
|
-@(if test ! -d $${libgomp_dir}; then \
|
|
echo "Testing parallel mode failed as libgomp not present."; \
|
|
exit 1; \
|
|
fi; \
|
|
outputdir=parallel; export outputdir; \
|
|
if test ! -d $${outputdir}; then \
|
|
mkdir $${outputdir}; \
|
|
fi; \
|
|
srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
|
|
EXPECT=$(EXPECT); export EXPECT; \
|
|
$(MAKE) CXXFLAGS="$(atomic_flags) $(libgomp_flags)" RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(parallel_flags)" check-DEJAGNU; )
|
|
|
|
check-performance-parallel: testsuite_files_performance ${performance_script}
|
|
-@(chmod + ${check_performance_script}; \
|
|
CXXFLAGS="-D_GLIBCXX_PARALLEL -fopenmp $(atomic_flags) $(libgomp_flags)"; export CXXFLAGS; \
|
|
${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir})
|
|
|
|
.PHONY: baseline_symbols new-abi-baseline \
|
|
check-abi check-compile check-performance check-parallel
|
|
|
|
# By adding these files here, automake will remove them for 'make clean'
|
|
CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \
|
|
testsuite_* site.exp abi_check baseline_symbols *TEST* *.dat \
|
|
*.ii *.s *.o *.cc *.x *.a *.so *.xml *.raw *.out *.gdb
|
|
|
|
# To remove directories.
|
|
clean-local:
|
|
rm -rf de fr debug parallel binaries normal* simd
|