From patchwork Sat Oct 13 13:12:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 983501 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-487500-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="qzPzgLHv"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42XP5L0PbGz9s7W for ; Sat, 13 Oct 2018 23:24:03 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; q=dns; s= default; b=dSy5LTnmyzEDuydaK74WHgk/n+NLDCA0Z+dMGD5yX6l1QoX6Vqraj QcEWsgYRd9pIGGRYhSyjbNkkj8uDbGu3hZAAe+fGh5Z3hVHnUj3Wd9lediV4G3wC 7KzqKDbJ4G706eM5J5vaW7OHWQrjC2W5QeMPDT+Ipq6DIj4loAFeKU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; s= default; bh=w6u2E5jVabkERlq0JcUoyUVAZ+8=; b=qzPzgLHvoaxoHOBKTWR/ WiiWUu3diW7+wvIFOalZLbLPb63PYGC7uWfVI8vGCRqu/TwZWxE2NPbmkQ+ZNdwb m/wUc3eLhXgGt6Q47YNDJnhbdVbUVehopzam4YIAz6V0Ow3d2v3czFGfb8ymvy/2 SpiORRFJtqBbSlRKwtm45T0= Received: (qmail 71221 invoked by alias); 13 Oct 2018 12:23:55 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 71212 invoked by uid 89); 13 Oct 2018 12:23:54 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Install, apart X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 13 Oct 2018 12:23:51 +0000 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E1EE93DE3E; Sat, 13 Oct 2018 12:23:49 +0000 (UTC) Received: from c64.redhat.com (ovpn-112-34.phx2.redhat.com [10.3.112.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4DA507739F; Sat, 13 Oct 2018 12:23:48 +0000 (UTC) From: David Malcolm To: Jakub Jelinek Cc: sellcey@cavium.com, gcc-patches@gcc.gnu.org, David Malcolm Subject: [PATCH] v2: Run selftests for C++ as well as C Date: Sat, 13 Oct 2018 09:12:03 -0400 Message-Id: <1539436323-12652-1-git-send-email-dmalcolm@redhat.com> In-Reply-To: <1539368255.14521.163.camel@redhat.com> References: <1539368255.14521.163.camel@redhat.com> X-IsSubscribed: yes On Fri, 2018-10-12 at 14:17 -0400, David Malcolm wrote: > On Fri, 2018-10-12 at 14:45 -0400, David Malcolm wrote: > > [re this thread "ToT build failure?": > > https://gcc.gnu.org/ml/gcc-patches/2017-07/msg00344.html ] > > > > On Thu, 2017-07-06 at 20:58 +0200, Jakub Jelinek wrote: > > > On Thu, Jul 06, 2017 at 01:45:42PM -0400, David Malcolm wrote: > > > > Given that the previous status quo of the selftests was to > > > > require > > > > the > > > > C frontend, I committed the attached patch (as r250036), under > > > > the > > > > "obvious" rule, retaining the ability to optionally run the > > > > selftests > > > > within the C++ frontend. > > > > > > You should do something similar for how we make check etc.: > > > CHECK_TARGETS = @check_languages@ > > > > > > check: $(CHECK_TARGETS) > > > > > > and then each Make-lang.in defining its check- goal. > > > So similarly to that s-selftest-c++ should be in cp/Make-lang.in > > > and based on the configured languages should include the s- > > > selftest- > > > > > > dependencies. > > > > > > Jakub > > > > Thanks. > > > > I attemped the above, but it required each Make-lang.in to define > > a check- goal, but there are only two that make sense to run > > (those that set LANG_HOOKS_RUN_LANG_SELFTESTS: C and C++). > > > > Rather than add one to every Make-lang.in, I borrowing the "append" > > approach used by "lang_checks", so that only the Make-lang.in files > > that opt-in to having selftests need to do anything, appending > > their s-selftest- to lang_selftests. > > > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. > > I manually verified that the self-tests were run 6 times: C and > > C++, > > for each of the three stages (each run taking well under a second). > > > > OK for trunk? > > Sorry; I failed to properly check the case Steve ran into back in > July, > and my patch doesn't handle it (all of the Make-lang.in files are > included, regardless of configuration, via LANG_MAKEFRAGS). > > I'm working on an updated patch. > > Dave Here's an updated version; sorry for the earlier noise. This one follows the approach you suggested, adding a SELFTEST_TARGETS built from a configure-supplied selftest_languages. Each Make-lang.in defines a selftest-LANG, which becomes a dependency of "selftest". Almost all of the selftest-LANG are empty, apart from those for c and c++. Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. As before, I manually verified that the self-tests were run 6 times: c and c++, for each of the three stages (each run taking well under a second). This time I also verified that it builds successfully without c++ (via: "--enable-languages=c --disable-bootstrap"), for which it just ran the c selftests. OK for trunk? gcc/ChangeLog: * Makefile.in (SELFTEST_TARGETS): New. (selftest) Change from s-selftest-c to $(SELFTEST_TARGETS). (C_SELFTEST_FLAGS, C_SELFTEST_DEPS, s-selftest-c, selftest-c-gdb) (selftest-gdb, selftest-c-valgrind, selftest-valgrind): Move to c/Make-lang.in. (CPP_SELFTEST_FLAGS, CPP_SELFTEST_DEPS, s-selftest-c++) (selftest-c++-gdb, selftest-c++-valgrind): Move to cp/Make-lang.in. * configure: Regenerate. * configure.ac (selftest_languages): New. gcc/brig/ChangeLog: * Make-lang.in (selftest-brig): New. gcc/c/ChangeLog: * Make-lang.in (selftest-c): New. (C_SELFTEST_FLAGS, C_SELFTEST_DEPS, s-selftest-c, selftest-c-gdb) (selftest-gdb, selftest-c-valgrind, selftest-valgrind): Move here from gcc/Makefile.in. gcc/cp/ChangeLog: * Make-lang.in (selftest-c++): New. (CPP_SELFTEST_FLAGS, CPP_SELFTEST_DEPS, s-selftest-c++) (selftest-c++-gdb, selftest-c++-valgrind): Move here from gcc/Makefile.in. gcc/fortran/ChangeLog: * Make-lang.in (selftest-fortran): New. gcc/go/ChangeLog: * Make-lang.in (selftest-go): New. gcc/jit/ChangeLog: * Make-lang.in (selftest-jit): New. gcc/lto/ChangeLog: * Make-lang.in (selftest-lto): New. gcc/objc/ChangeLog: * Make-lang.in (selftest-objc): New. gcc/objcp/ChangeLog: * Make-lang.in (selftest-obj-c++): New. --- gcc/Makefile.in | 52 ++++---------------------------------- gcc/ada/gcc-interface/Make-lang.in | 3 +++ gcc/brig/Make-lang.in | 3 +++ gcc/c/Make-lang.in | 32 +++++++++++++++++++++++ gcc/configure | 12 +++++++-- gcc/configure.ac | 7 +++++ gcc/cp/Make-lang.in | 26 +++++++++++++++++++ gcc/fortran/Make-lang.in | 3 +++ gcc/go/Make-lang.in | 3 +++ gcc/jit/Make-lang.in | 3 +++ gcc/lto/Make-lang.in | 3 +++ gcc/objc/Make-lang.in | 3 +++ gcc/objcp/Make-lang.in | 3 +++ 13 files changed, 104 insertions(+), 49 deletions(-) diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 116ed6e..52240d1 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1935,62 +1935,20 @@ DEVNULL=$(if $(findstring mingw,$(build)),nul,/dev/null) SELFTEST_FLAGS = -nostdinc $(DEVNULL) -S -o $(DEVNULL) \ -fself-test=$(srcdir)/testsuite/selftests -C_SELFTEST_FLAGS = -xc $(SELFTEST_FLAGS) -CPP_SELFTEST_FLAGS = -xc++ $(SELFTEST_FLAGS) - SELFTEST_DEPS = $(GCC_PASSES) stmp-int-hdrs $(srcdir)/testsuite/selftests -C_SELFTEST_DEPS = cc1$(exeext) $(SELFTEST_DEPS) -CPP_SELFTEST_DEPS = cc1plus$(exeext) $(SELFTEST_DEPS) - # Run the selftests during the build once we have a driver and the frontend, # so that self-test failures are caught as early as possible. # Use "s-selftest-FE" to ensure that we only run the selftests if the # driver, frontend, or selftest data change. .PHONY: selftest -# By default, only run the selftests within the C frontend -selftest: s-selftest-c - -# C selftests -s-selftest-c: $(C_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) - $(STAMP) $@ - -# Convenience methods for running C selftests under gdb: -.PHONY: selftest-c-gdb -selftest-c-gdb: $(C_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) \ - -wrapper gdb,--args - -.PHONY: selftest-gdb -selftest-gdb: selftest-c-gdb - -# Convenience methods for running C selftests under valgrind: -.PHONY: selftest-c-valgrind -selftest-c-valgrind: $(C_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) \ - -wrapper valgrind,--leak-check=full - -.PHONY: selftest-valgrind -selftest-valgrind: selftest-c-valgrind - -# C++ selftests -s-selftest-c++: $(CPP_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) - $(STAMP) $@ +# Potentially run all selftest-. The various /Make-lang.in can +# require the selftests to be run by defining their selftest- as +# s-selftest-. Otherwise, they should define it as empty. -# Convenience method for running C++ selftests under gdb: -.PHONY: selftest-c++-gdb -selftest-c++-gdb: $(CPP_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ - -wrapper gdb,--args - -# Convenience method for running C++ selftests under valgrind: -.PHONY: selftest-c++-valgrind -selftest-c++-valgrind: $(CPP_SELFTEST_DEPS) - $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ - -wrapper valgrind,--leak-check=full +SELFTEST_TARGETS = @selftest_languages@ +selftest: $(SELFTEST_TARGETS) # Recompile all the language-independent object files. # This is used only if the user explicitly asks for it. diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index 4866c2a..5602092 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -930,6 +930,9 @@ check_gnat_parallelize = 1000 check-ada: check-acats check-gnat check-ada-subtargets: check-acats-subtargets check-gnat-subtargets +# No ada-specific selftests +selftest-ada: + ACATSDIR = $(TESTSUITEDIR)/ada/acats ACATSCMD = run_acats.sh diff --git a/gcc/brig/Make-lang.in b/gcc/brig/Make-lang.in index 8799aa7..07c038c 100644 --- a/gcc/brig/Make-lang.in +++ b/gcc/brig/Make-lang.in @@ -148,6 +148,9 @@ brig.srcman: doc/gccbrig.1 lang_checks += check-brig +# No brig-specific selftests +selftest-brig: + # Install hooks. brig.install-common: installdirs diff --git a/gcc/c/Make-lang.in b/gcc/c/Make-lang.in index 180923f..bfae6fd 100644 --- a/gcc/c/Make-lang.in +++ b/gcc/c/Make-lang.in @@ -110,6 +110,38 @@ c.tags: force c.man: c.srcman: +# C selftests + +# If C is enabled, require the selftests to be run for it +# at each stage of the build: +selftest-c: s-selftest-c + +C_SELFTEST_FLAGS = -xc $(SELFTEST_FLAGS) +C_SELFTEST_DEPS = cc1$(exeext) $(SELFTEST_DEPS) + +# Run the C selftests: +s-selftest-c: $(C_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) + $(STAMP) $@ + +# Convenience methods for running C selftests under gdb: +.PHONY: selftest-c-gdb +selftest-c-gdb: $(C_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) \ + -wrapper gdb,--args + +.PHONY: selftest-gdb +selftest-gdb: selftest-c-gdb + +# Convenience methods for running C selftests under valgrind: +.PHONY: selftest-c-valgrind +selftest-c-valgrind: $(C_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(C_SELFTEST_FLAGS) \ + -wrapper valgrind,--leak-check=full + +.PHONY: selftest-valgrind +selftest-valgrind: selftest-c-valgrind + # List of targets that can use the generic check- rule and its // variant. lang_checks += check-gcc lang_checks_parallelized += check-gcc diff --git a/gcc/configure b/gcc/configure index 3e33a69..b1f0d7c 100755 --- a/gcc/configure +++ b/gcc/configure @@ -656,6 +656,7 @@ TM_ENDIAN_CONFIG tmake_file xmake_file cpp_install_dir +selftest_languages check_languages build_file_translate build_xm_defines @@ -18495,7 +18496,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18498 "configure" +#line 18499 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18601,7 +18602,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18604 "configure" +#line 18605 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -29330,6 +29331,12 @@ do check_languages="$check_languages check-$language" done +selftest_languages= +for language in $all_selected_languages +do + selftest_languages="$selftest_languages selftest-$language" +done + # We link each language in with a set of hooks, reached indirectly via # lang.${target}. Only do so for selected languages. @@ -29462,6 +29469,7 @@ fi + # Echo link setup. if test x${build} = x${host} ; then if test x${host} = x${target} ; then diff --git a/gcc/configure.ac b/gcc/configure.ac index ff6444a..793ca71 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -6187,6 +6187,12 @@ do check_languages="$check_languages check-$language" done +selftest_languages= +for language in $all_selected_languages +do + selftest_languages="$selftest_languages selftest-$language" +done + # We link each language in with a set of hooks, reached indirectly via # lang.${target}. Only do so for selected languages. @@ -6270,6 +6276,7 @@ AC_SUBST(build_xm_include_list) AC_SUBST(build_xm_defines) AC_SUBST(build_file_translate) AC_SUBST(check_languages) +AC_SUBST(selftest_languages) AC_SUBST(cpp_install_dir) AC_SUBST(xmake_file) AC_SUBST(tmake_file) diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index fa8c1e6..e358b76 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -164,6 +164,32 @@ c++.man: doc/g++.1 c++.srcman: doc/g++.1 -cp -p $^ $(srcdir)/doc +# C++ selftests + +# If C++ is enabled, require the selftests to be run for it +# at each stage of the build: +selftest-c++: s-selftest-c++ + +CPP_SELFTEST_DEPS = cc1plus$(exeext) $(SELFTEST_DEPS) +CPP_SELFTEST_FLAGS = -xc++ $(SELFTEST_FLAGS) + +# Run the C++ selftests +s-selftest-c++: $(CPP_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) + $(STAMP) $@ + +# Convenience method for running C++ selftests under gdb: +.PHONY: selftest-c++-gdb +selftest-c++-gdb: $(CPP_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ + -wrapper gdb,--args + +# Convenience method for running C++ selftests under valgrind: +.PHONY: selftest-c++-valgrind +selftest-c++-valgrind: $(CPP_SELFTEST_DEPS) + $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ + -wrapper valgrind,--leak-check=full + # 'make check' in gcc/ looks for check-c++, as do all toplevel C++-related # check targets. However, our DejaGNU framework requires 'check-g++' as its # entry point. We feed the former to the latter here. diff --git a/gcc/fortran/Make-lang.in b/gcc/fortran/Make-lang.in index 62f652e..5eff00b 100644 --- a/gcc/fortran/Make-lang.in +++ b/gcc/fortran/Make-lang.in @@ -170,6 +170,9 @@ lang_checks_parallelized += check-gfortran # For description see the check_$lang_parallelize comment in gcc/Makefile.in. check_gfortran_parallelize = 10000 +# No fortran-specific selftests +selftest-fortran: + # GFORTRAN documentation. GFORTRAN_TEXI = \ $(srcdir)/fortran/gfortran.texi \ diff --git a/gcc/go/Make-lang.in b/gcc/go/Make-lang.in index 021250a..e8656cb 100644 --- a/gcc/go/Make-lang.in +++ b/gcc/go/Make-lang.in @@ -139,6 +139,9 @@ lang_checks += check-go lang_checks_parallelized += check-go check_go_parallelize = 10 +# No go-specific selftests +selftest-go: + # Install hooks. go.install-common: installdirs diff --git a/gcc/jit/Make-lang.in b/gcc/jit/Make-lang.in index 280c094..e82f945 100644 --- a/gcc/jit/Make-lang.in +++ b/gcc/jit/Make-lang.in @@ -270,6 +270,9 @@ lang_checks_parallelized += check-jit # we want them to be placed in different "buckets". check_jit_parallelize = 10 +# No jit-specific selftests +selftest-jit: + # # Install hooks: jit.install-common: installdirs diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in index 4695077..2cc3619 100644 --- a/gcc/lto/Make-lang.in +++ b/gcc/lto/Make-lang.in @@ -86,3 +86,6 @@ lto1.fda: ../prev-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA) # LTO testing is done as part of C/C++/Fortran etc. testing. check-lto: + +# No LTO-specific selftests +selftest-lto: diff --git a/gcc/objc/Make-lang.in b/gcc/objc/Make-lang.in index 49b7a9f..909a774 100644 --- a/gcc/objc/Make-lang.in +++ b/gcc/objc/Make-lang.in @@ -98,6 +98,9 @@ lang_checks += check-objc lang_checks_parallelized += check-objc check_objc_parallelize = 6 +# No objc-c-specific selftests +selftest-objc: + # # Install hooks: # cc1obj is installed elsewhere as part of $(COMPILERS). diff --git a/gcc/objcp/Make-lang.in b/gcc/objcp/Make-lang.in index 5a03999..c98286b 100644 --- a/gcc/objcp/Make-lang.in +++ b/gcc/objcp/Make-lang.in @@ -126,6 +126,9 @@ obj-c++.tags: force lang_checks += check-obj-c++ +# No objc-c++-specific selftests +selftest-obj-c++: + # # Install hooks: # cc1objplus is installed elsewhere as part of $(COMPILERS).