Add new auxchecks target that runs GNU Scientific Library tests.

Replace the gsl16test script under auxprogs that you run by hand
with a new make target auxchecks which fetches the source code,
patches, reconfigures and builds all tests. Then run all tests
under valgrind.
This commit is contained in:
Mark Wielaard
2020-06-30 17:51:49 +02:00
parent 6630e2ae58
commit 5efd866df2
8 changed files with 189 additions and 165 deletions

View File

@@ -94,6 +94,10 @@ exp-regtest: check
perf: check
@PERL@ perf/vg_perf perf
# Auxiliary test suites run under valgrind
auxchecks: all
$(MAKE) -C auxprogs auxchecks
# Nb: no need to include any Makefile.am files here, or files included from
# them, as automake includes them automatically. Also not COPYING, README
# or NEWS.

View File

@@ -4,7 +4,6 @@ dist_noinst_SCRIPTS = \
change-copyright-year \
dump_insn_ppc.sh \
gen-mdg \
gsl16test \
gsl19test \
make_or_upd_vgversion_h \
nightly-build-summary \
@@ -14,8 +13,9 @@ dist_noinst_SCRIPTS = \
EXTRA_DIST = \
docs/valgrind-listener-manpage.xml \
docs/valgrind-di-server-manpage.xml \
gsl16-badfree.patch \
gsl16-wavelet.patch \
gsl-1.6.patch \
gsl-1.6.supp \
gsl-1.6.out.x86.exp \
posixtestsuite-1.5.1-diff.txt \
ppcfround.c \
ppc64shifts.c \
@@ -117,13 +117,104 @@ getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_LDFLAGS += -Wl,-read_only_relocs -Wl,supp
endif
endif
#----------------------------------------------------------------------------
# Auxiliary testsuits
#----------------------------------------------------------------------------
auxchecks: gsl-check
auxclean: gsl-clean
# You can override AUX_CHECK_DIR to use a previous download/build.
# Must be an absolute path.
# e.g. make auxchecks AUX_CHECK_DIR=$HOME/valgrind-auxtests
AUX_CHECK_DIR=$(abs_builddir)auxchecks
# GNU Scientific Library 1.6
GSL_DIR_NAME=gsl-1.6
GSL_TAR_NAME=$(GSL_DIR_NAME).tar.gz
GSL_URL=https://ftpmirror.gnu.org/gsl/$(GSL_TAR_NAME)
GSL_SHA256_SUM=52e097b5228a617fef788d54eba6855c1addc62b8f68a1dfb5895cad25594f1f
GSL_TAR=$(AUX_CHECK_DIR)/$(GSL_TAR_NAME)
GSL_SRC_DIR=$(AUX_CHECK_DIR)/$(GSL_DIR_NAME)
# By default we like -O3 to hopefully get some loop vectorization
# You can also override GSL_CFLAGS if you want e.g. -march=core-avx2
# Different GSL_CFLAGS will result in different build dirs (under AUX_CHECK_DIR)
GSL_CFLAGS=-g -O3
# i386 needs sse to get rounding for floating point correct.
# But we only want this if the primary isn't AMD64
if VGCONF_ARCHS_INCLUDE_X86
if !VGCONF_ARCHS_INCLUDE_AMD64
GSL_CFLAGS+=-mfpmath=sse -msse2
endif
endif
# Trick to get a literal space to use in substitutions
sp := $(subst ,, )
# Filter out spaces from GSL_CFLAGS to get unique build dir
GSL_BUILD_DIR=$(AUX_CHECK_DIR)/gsl-build$(subst $(sp),,$(GSL_CFLAGS))
# These are all the tests, except siman and randist which can take minutes.
GSL_TESTS=block cblas cdf cheb combination complex const deriv dht diff \
eigen err fft fit histogram ieee-utils integration interpolation \
linalg matrix min monte multifit multimin multiroots ntuple \
ode-initval permutation poly qrng rng roots sort specfunc \
statistics sum sys vector wavelet
# Get the tar file if we don't have it yet.
$(GSL_TAR):
mkdir -p $(AUX_CHECK_DIR)
wget -q -O $(GSL_TAR) $(GSL_URL)
# We need to autoreconf to make sure to get config.guess, config.sub
# and libtool for newer architectures.
$(GSL_SRC_DIR)/gsl-patched: $(GSL_TAR)
echo "$(GSL_SHA256_SUM) $(GSL_TAR)" | sha256sum --check -
(cd $(AUX_CHECK_DIR) && \
tar zxf $(GSL_TAR_NAME) && \
cd $(GSL_DIR_NAME) && \
patch -p1 < $(abs_top_srcdir)/auxprogs/gsl-1.6.patch && \
autoreconf -f -i -Wnone)
touch $@
# We need make check -k because
# some tests might fail even native (only on i386 though).
# make check doesn't work reliably with -j.
$(GSL_BUILD_DIR)/gsl-build: $(GSL_SRC_DIR)/gsl-patched
mkdir -p $(GSL_BUILD_DIR)
(cd $(GSL_BUILD_DIR) && \
$(GSL_SRC_DIR)/configure CFLAGS="$(GSL_CFLAGS)" && \
make -j $(nproc) && \
make check -k || true)
touch $@
# We hope all tests PASS (so don't produce output except for the test names).
# But on x86 we get one FAIL, so that is "fine" too.
# We currently don't check stderr, but we probably should.
gsl-check: $(GSL_BUILD_DIR)/gsl-build
(cd $(GSL_BUILD_DIR); \
for gsl_test in $(GSL_TESTS); do \
echo $$gsl_test; \
./libtool --mode=execute $(abs_top_builddir)/vg-in-place -q \
--suppressions=$(abs_top_srcdir)/auxprogs/gsl-1.6.supp \
$$gsl_test/test; \
done | grep --line-buffered -v ^PASS: | tee valgrind-gsl.out)
for gsl_test in $(GSL_TESTS); do echo $$gsl_test; done \
| cmp - $(GSL_BUILD_DIR)/valgrind-gsl.out || \
diff -u $(abs_top_srcdir)/auxprogs/gsl-1.6.out.x86.exp \
$(GSL_BUILD_DIR)/valgrind-gsl.out
# We keep the tarball but remove the unpacked sources and build
gsl-clean:
rm -rf $(GSL_SRC_NAME) $(GSL_BUILD_DIR)
#----------------------------------------------------------------------------
# General stuff
#----------------------------------------------------------------------------
all-local: inplace-noinst_PROGRAMS inplace-noinst_DSYMS
clean-local: clean-noinst_DSYMS
clean-local: clean-noinst_DSYMS auxclean
install-exec-local: install-noinst_PROGRAMS install-noinst_DSYMS

View File

@@ -0,0 +1,40 @@
block
cblas
cdf
cheb
combination
complex
const
deriv
dht
diff
eigen
err
fft
fit
histogram
ieee-utils
integration
FAIL: qawo(f456) elist (7.25063790881233303e-15 observed vs 7.25922435194575979e-15 expected)
interpolation
linalg
matrix
min
monte
multifit
multimin
multiroots
ntuple
ode-initval
permutation
poly
qrng
rng
roots
sort
specfunc
statistics
sum
sys
vector
wavelet

36
auxprogs/gsl-1.6.patch Normal file
View File

@@ -0,0 +1,36 @@
diff -r -u gsl-1.6/vector/test_complex_source.c gsl-1.6-patched/vector/test_complex_source.c
--- gsl-1.6/vector/test_complex_source.c 2004-09-13 15:23:20.000000000 +0200
+++ gsl-1.6-patched/vector/test_complex_source.c 2005-07-24 08:37:54.000000000 +0200
@@ -75,7 +75,7 @@
if (stride == 1)
{
v0 = FUNCTION (gsl_vector, alloc) (N);
- view = FUNCTION (gsl_vector, subvector) (v, 0, N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
v = &view.vector;
}
else
diff -r -u gsl-1.6/vector/test_source.c gsl-1.6-patched/vector/test_source.c
--- gsl-1.6/vector/test_source.c 2004-09-13 15:23:20.000000000 +0200
+++ gsl-1.6-patched/vector/test_source.c 2005-07-24 08:37:54.000000000 +0200
@@ -75,7 +75,7 @@
if (stride == 1)
{
v0 = FUNCTION (gsl_vector, alloc) (N);
- view = FUNCTION (gsl_vector, subvector) (v, 0, N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
v = &view.vector;
}
else
diff -r -u gsl-1.6/wavelet/dwt.c gsl-1.6-patched/wavelet/dwt.c
--- gsl-1.6/wavelet/dwt.c 2004-12-24 14:57:34.000000000 +0100
+++ gsl-1.6-patched/wavelet/dwt.c 2005-07-24 08:38:05.000000000 +0200
@@ -30,7 +30,7 @@
static int binary_logn (const size_t n);
static void dwt_step (const gsl_wavelet * w, double *a, size_t stride,
- size_t n, int isign, gsl_wavelet_workspace * work);
+ size_t n, gsl_wavelet_direction dir, gsl_wavelet_workspace * work);
static int
binary_logn (const size_t n)

14
auxprogs/gsl-1.6.supp Normal file
View File

@@ -0,0 +1,14 @@
{
gsl-writes-uninit-data
Memcheck:Param
write(buf)
fun:write
}
{
gsl-writes-uninit-data-nocancel
Memcheck:Param
write(buf)
fun:__write_nocancel
}

View File

@@ -1,32 +0,0 @@
Index: test_complex_source.c
===================================================================
RCS file: /home/gsl-cvs/gsl/vector/test_complex_source.c,v
retrieving revision 1.23
diff -u -r1.23 test_complex_source.c
--- test_complex_source.c 24 Jun 2005 11:33:25 -0000 1.23
+++ test_complex_source.c 6 Jul 2005 11:18:33 -0000
@@ -75,7 +75,7 @@
if (stride == 1)
{
v0 = FUNCTION (gsl_vector, alloc) (N);
- view = FUNCTION (gsl_vector, subvector) (v, 0, N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
v = &view.vector;
}
else
Index: test_source.c
===================================================================
RCS file: /home/gsl-cvs/gsl/vector/test_source.c,v
retrieving revision 1.26
diff -u -r1.26 test_source.c
--- test_source.c 24 Jun 2005 11:33:26 -0000 1.26
+++ test_source.c 6 Jul 2005 11:14:18 -0000
@@ -75,7 +75,7 @@
if (stride == 1)
{
v0 = FUNCTION (gsl_vector, alloc) (N);
- view = FUNCTION (gsl_vector, subvector) (v, 0, N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
v = &view.vector;
}
else

View File

@@ -1,11 +0,0 @@
--- wavelet/dwt.c~ 2004-12-24 14:57:34.000000000 +0100
+++ wavelet/dwt.c 2005-07-08 23:31:32.000000000 +0200
@@ -30,7 +30,7 @@
static int binary_logn (const size_t n);
static void dwt_step (const gsl_wavelet * w, double *a, size_t stride,
- size_t n, int isign, gsl_wavelet_workspace * work);
+ size_t n, gsl_wavelet_direction dir, gsl_wavelet_workspace * work);
static int
binary_logn (const size_t n)

View File

@@ -1,118 +0,0 @@
#!/bin/sh
# Do an automated test which involves building and regtesting version
# 1.6 of the GNU Scientific Library (gsl). This has proven to be a
# very thorough test of Vex's CPU simulations and has exposed bugs
# which had not been previously discovered. Gsl contains more
# than 100,000 tests as part of its regression suite, and so this
# script's purpose is to runs those tests using valgrind and compare
# against the same tests run natively.
#
# You can download gsl and get more info about it at
# http://www.gnu.org/software/gsl
# Args:
# absolute name of gsl-1.6.tar.gz file
# name of C compiler
# args for C compiler
# name of Valgrind
# args for Valgrind
# Results: 3.7.0 --tool=none
# x86 1 failure Ubuntu 10.10
# FAIL: qawo(f456) elist (7.25063790881233303e-15 observed vs 7.25922435194575979e-15 expected)
# same failure was also present in 3.6.1
# s390x 0 failures on z900 running RHEL4
if [ $# != 5 ]
then
echo "usage: gsl16test /absolute/name/of/gsl-1.6-patched.tar.gz"
echo " C-compiler-command"
echo " flags-for-C-compiler"
echo " Valgrind-command"
echo " flags-for-Valgrind"
exit 1
fi
runcmd () {
echo -n " $1 ... "
shift
(eval "$*") >> log.verbose 2>&1
if [ $? = 0 ]
then
echo "done"
return 0
else
echo "failed"
return 1
fi
}
GSL_FILE=$1
GSL_CC=$2
GSL_CFLAGS=$3
GSL_VV=$4
GSL_VFLAGS=$5
TESTS1="block/test cblas/test cdf/test cheb/test combination/test"
TESTS2="complex/test const/test deriv/test dht/test diff/test"
TESTS3="eigen/test err/test fft/test fit/test histogram/test"
TESTS4="ieee-utils/test integration/test interpolation/test linalg/test"
TESTS5="matrix/test min/test monte/test multifit/test multimin/test"
TESTS6="multiroots/test ntuple/test ode-initval/test permutation/test"
TESTS7="poly/test qrng/test randist/test rng/test roots/test siman/test"
TESTS8="sort/test specfunc/test statistics/test sum/test sys/test"
TESTS9="vector/test wavelet/test"
ALL_TESTS="$TESTS1 $TESTS2 $TESTS3 $TESTS4 $TESTS5 $TESTS6 $TESTS7 $TESTS8 $TESTS9"
echo "gsl16test: src: " $GSL_FILE
echo "gsl16test: cc: " $GSL_CC
echo "gsl16test: cflags: " $GSL_CFLAGS
echo "gsl16test: valgrind: " $GSL_VV
echo "gsl16test: vflags: " $GSL_VFLAGS
rm -rf log.verbose gsl-1.6-patched summary.txt
echo > log.verbose
echo > summary.txt
echo $0 $1 \"$2\" \"$3\" \"$4\" \"$5\" >> summary.txt
echo >> summary.txt
runcmd "Untarring " \
"rm -rf gsl-1.6-patched && tar xzf $GSL_FILE" && \
\
runcmd "Configuring " \
"(cd gsl-1.6-patched && CC=$GSL_CC CFLAGS=\"$GSL_CFLAGS\" ./configure)" && \
\
runcmd "Building " \
"(cd gsl-1.6-patched && make -j4 && make -k check)"
echo -n " Collecting reference results "
rm -f out-REF
(cd gsl-1.6-patched && for f in $ALL_TESTS ; do ./$f ; done) &> out-REF
echo " ... done"
echo -n " Collecting valgrinded results "
rm -f out-VAL
(cd gsl-1.6-patched && for f in $ALL_TESTS ; do eval $GSL_VV -v --trace-children=yes "$GSL_VFLAGS" ./$f ; done) &> out-VAL
echo " ... done"
echo -n " Native fails: " && (grep FAIL: out-REF | wc -l)
echo -n " Native passes: " && (grep PASS: out-REF | wc -l)
echo -n " Valgrind fails: " && (grep FAIL: out-VAL | wc -l)
echo -n " Valgrind passes: " && (grep PASS: out-VAL | wc -l)
(echo -n " Native fails: " && (grep FAIL: out-REF | wc -l)) >> summary.txt
(echo -n " Native passes: " && (grep PASS: out-REF | wc -l)) >> summary.txt
(echo -n " Valgrind fails: " && (grep FAIL: out-VAL | wc -l)) >> summary.txt
(echo -n " Valgrind passes: " && (grep PASS: out-VAL | wc -l)) >> summary.txt
echo >> summary.txt
echo