sim: testsuite: support parallel execution
authorMike Frysinger <vapier@gentoo.org>
Fri, 26 Nov 2021 05:04:31 +0000 (00:04 -0500)
committerMike Frysinger <vapier@gentoo.org>
Mon, 29 Nov 2021 02:55:15 +0000 (21:55 -0500)
Break up the dejagnu logic so that we can parallelize the testsuite.
This takes a page from gcc & gdb where each .exp is run in isolation
instead of in serial.

For most targets, this doesn't make much of a difference as they only
have a single .exp.  A few (like cris & frv) have multiple .exp though
and will see a bit of a speed up.

The real gain is when testing a multitarget build.  This way we can
run all the targets in parallel and cut the execution time a bit.
On my system, it goes from ~155sec to ~100sec.

We can gain further speedups by splitting up some of the larger .exp
files into smaller groups.  We'll do that in a followup though.

sim/Makefile.in
sim/testsuite/local.mk

index f0e2479053e76fe4760e3f38453534b216d9451d..ff36e2d3186ba36d1554f86e54c02c2b167eccee 100644 (file)
@@ -1442,8 +1442,14 @@ EXTRA_DEJAGNU_SITE_CONFIG = site-sim-config.exp
 # Custom verbose test variables that automake doesn't provide (yet?).
 AM_V_RUNTEST = $(AM_V_RUNTEST_@AM_V@)
 AM_V_RUNTEST_ = $(AM_V_RUNTEST_@AM_DEFAULT_V@)
-AM_V_RUNTEST_0 = @echo "  RUNTEST  $(RUNTESTFLAGS)";
+AM_V_RUNTEST_0 = @echo "  RUNTEST  $(RUNTESTFLAGS) $*";
 AM_V_RUNTEST_1 = 
+DO_RUNTEST = \
+       LC_ALL=C; export LC_ALL; \
+       EXPECT=${EXPECT} ; export EXPECT ; \
+       runtest=$(RUNTEST); \
+       $$runtest $(RUNTESTFLAGS)
+
 testsuite_common_CPPFLAGS = \
        -I$(srcdir)/common \
        -I$(srcroot)/include \
@@ -2802,14 +2808,43 @@ site-sim-config.exp: Makefile
        $(foreach V,$(SIM_TOOLCHAIN_VARS),echo "set $(V) \"$($(V))\"";) \
        ) > $@
 
+# Ignore dirs that only contain configuration settings.
+check/./config/%.exp: ; @true
+check/./lib/%.exp: ; @true
+
+check/%.exp:
+       $(AM_V_at)mkdir -p testsuite/$*
+       $(AM_V_RUNTEST)$(DO_RUNTEST) --objdir testsuite/$* --outdir testsuite/$* $*.exp
+
+check-DEJAGNU-parallel:
+       $(AM_V_at)( \
+       $(MAKE) -k \
+         `cd $(srcdir)/testsuite && find . -name '*.exp' -printf 'check/%p '`; \
+       ret=$$?; \
+       $(SHELL) $(srcroot)/contrib/dg-extract-results.sh \
+         `find testsuite/ -maxdepth 4 -name testrun.sum | sort` > testrun.sum; \
+       $(SHELL) $(srcroot)/contrib/dg-extract-results.sh -L \
+         `find testsuite/ -maxdepth 4 -name testrun.log | sort` > testrun.log; \
+       echo; \
+       $(SED) -n '/^.*===.*Summary.*===/,$$p' testrun.sum; \
+       exit $$ret)
+
+check-DEJAGNU-single:
+       $(AM_V_RUNTEST)$(DO_RUNTEST)
+
+# If running a single job, invoking runtest once is faster & has nicer output.
 check-DEJAGNU: site.exp
-       $(AM_V_RUNTEST)LC_ALL=C; export LC_ALL; \
+       $(AM_V_at)(set -e; \
        EXPECT=${EXPECT} ; export EXPECT ; \
        runtest=$(RUNTEST); \
        if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
-         $$runtest $(RUNTESTFLAGS); \
-       else echo "WARNING: could not find \`runtest'" 1>&2; :;\
-       fi
+         case "$(MAKEFLAGS)" in \
+         *-j*) $(MAKE) check-DEJAGNU-parallel;; \
+         *)    $(MAKE) check-DEJAGNU-single;; \
+         esac; \
+       else \
+         echo "WARNING: could not find \`runtest'" 1>&2; :;\
+       fi)
 
 # These tests are build-time only tools.  Override the default rules for them.
 testsuite/common/%.o: testsuite/common/%.c
index 977d12f5d282007eac94469a7cc8b5e20409dabb..5061a677e323db4a33135d3453b39d6f10721b6f 100644 (file)
@@ -21,7 +21,7 @@ EXTRA_DEJAGNU_SITE_CONFIG = site-sim-config.exp
 # Custom verbose test variables that automake doesn't provide (yet?).
 AM_V_RUNTEST = $(AM_V_RUNTEST_@AM_V@)
 AM_V_RUNTEST_ = $(AM_V_RUNTEST_@AM_DEFAULT_V@)
-AM_V_RUNTEST_0 =  @echo "  RUNTEST  $(RUNTESTFLAGS)";
+AM_V_RUNTEST_0 =  @echo "  RUNTEST  $(RUNTESTFLAGS) $*";
 AM_V_RUNTEST_1 =
 
 site-sim-config.exp: Makefile
@@ -32,14 +32,49 @@ site-sim-config.exp: Makefile
        $(foreach V,$(SIM_TOOLCHAIN_VARS),echo "set $(V) \"$($(V))\"";) \
        ) > $@
 
+DO_RUNTEST = \
+       LC_ALL=C; export LC_ALL; \
+       EXPECT=${EXPECT} ; export EXPECT ; \
+       runtest=$(RUNTEST); \
+       $$runtest $(RUNTESTFLAGS)
+
+# Ignore dirs that only contain configuration settings.
+check/./config/%.exp: ; @true
+check/./lib/%.exp: ; @true
+
+check/%.exp:
+       $(AM_V_at)mkdir -p testsuite/$*
+       $(AM_V_RUNTEST)$(DO_RUNTEST) --objdir testsuite/$* --outdir testsuite/$* $*.exp
+
+check-DEJAGNU-parallel:
+       $(AM_V_at)( \
+       $(MAKE) -k \
+         `cd $(srcdir)/testsuite && find . -name '*.exp' -printf 'check/%p '`; \
+       ret=$$?; \
+       $(SHELL) $(srcroot)/contrib/dg-extract-results.sh \
+         `find testsuite/ -maxdepth 4 -name testrun.sum | sort` > testrun.sum; \
+       $(SHELL) $(srcroot)/contrib/dg-extract-results.sh -L \
+         `find testsuite/ -maxdepth 4 -name testrun.log | sort` > testrun.log; \
+       echo; \
+       $(SED) -n '/^.*===.*Summary.*===/,$$p' testrun.sum; \
+       exit $$ret)
+
+check-DEJAGNU-single:
+       $(AM_V_RUNTEST)$(DO_RUNTEST)
+
+# If running a single job, invoking runtest once is faster & has nicer output.
 check-DEJAGNU: site.exp
-       $(AM_V_RUNTEST)LC_ALL=C; export LC_ALL; \
+       $(AM_V_at)(set -e; \
        EXPECT=${EXPECT} ; export EXPECT ; \
        runtest=$(RUNTEST); \
        if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
-         $$runtest $(RUNTESTFLAGS); \
-       else echo "WARNING: could not find \`runtest'" 1>&2; :;\
-       fi
+         case "$(MAKEFLAGS)" in \
+         *-j*) $(MAKE) check-DEJAGNU-parallel;; \
+         *)    $(MAKE) check-DEJAGNU-single;; \
+         esac; \
+       else \
+         echo "WARNING: could not find \`runtest'" 1>&2; :;\
+       fi)
 
 MOSTLYCLEANFILES += \
        site-sim-config.exp testrun.log testrun.sum