Looks good to me. Jason
On Mon, Apr 25, 2016 at 3:30 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > As mentioned in the PR, some checking code, in particular the one > in C++ FE's build_non_dependent_expr, may affect code generation, as it can > instantiate templates that aren't instantiated otherwise, which affects > the various counters like cfun->funcdef_no, DECL_UID etc. > > I'd like to commit the attached (shorter, safer) patch to gcc 6 branch, > which just disables this checking. > > The larger, included patch, makes -fchecking a 3 state option, -fno-checking > aka -fchecking=0, no checking, -fchecking aka -fchecking=1 the previous > -fchecking except for the build_non_dependent_expr bits, and -fchecking=2 > as checking that might affect code generation and tweaks the configury, > so that for non-release builds it defaults to this -fchecking=2, while for > release checking builds stage1 defaults to -fchecking=1 and stage2+ > defaults to -fno-checking. > > The shorter patch is currently being bootstrapped on powerpc-ibm-aix7.1.3.0, > the larger patch I've so far bootstrapped/regtested on x86_64-linux and > i686-linux on gcc-6 branch with implicit --enable-checking=release (where > stage1 performs yes but no extra checking), --disable-checking, > --enable-checking=yes,rtl and on the trunk so far bootstrapped and regtest > --pending with --enable-checking=yes,extra,rtl. Will still check > also the implicit --enable-checking=yes,extra. > > Ok for trunk (the included patch) and 6 branch (the attached patch)? > > 2016-04-25 Jakub Jelinek <ja...@redhat.com> > > PR bootstrap/70704 > * configure.ac (--enable-stage1-checking): For --disable-checking or > implicit --enable-checking, make sure extra flag matches in between > stage1 and later checking. > * configure: Regenerated. > gcc/ > * configure.ac (--enable-checking): Document extra flag, for > non-release builds default to --enable-checking=yes,extra. > If misc checking and extra checking, define CHECKING_P to 2 instead > of 1. > * common.opt (fchecking=): Add. > * doc/invoke.texi (-fchecking=): Document. > * doc/install.texi: Document --enable-checking changes. > * configure: Regenerated. > * config.in: Regenerated. > gcc/cp/ > * pt.c (build_non_dependent_expr): Use flag_checking > 1 instead of > just flag_checking. > > --- configure.ac.jj 2016-03-17 23:58:35.000000000 +0100 > +++ configure.ac 2016-04-25 18:15:34.703842886 +0200 > @@ -3530,16 +3530,17 @@ AC_ARG_ENABLE(stage1-checking, > # For --disable-checking or implicit --enable-checking=release, avoid > # setting --enable-checking=gc in the default stage1 checking for LTO > # bootstraps. See PR62077. > - stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types > case $BUILD_CONFIG in > *lto*) > - if test "x$enable_checking" = x && \ > - test -d ${srcdir}/gcc && \ > - test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then > - stage1_checking=--enable-checking=yes,types > - fi;; > - *) stage1_checking=--enable-checking=yes,types;; > + > stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;; > + *) > + stage1_checking=--enable-checking=yes,types;; > esac > + if test "x$enable_checking" = x && \ > + test -d ${srcdir}/gcc && \ > + test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then > + stage1_checking=yes,types,extra > + fi > else > stage1_checking=--enable-checking=$enable_checking,types > fi]) > --- gcc/configure.ac.jj 2016-01-27 19:47:35.000000000 +0100 > +++ gcc/configure.ac 2016-04-25 17:56:40.789041032 +0200 > @@ -516,12 +516,12 @@ AC_ARG_ENABLE(checking, > [enable expensive run-time checks. With LIST, > enable only specific categories of checks. > Categories are: yes,no,all,none,release. > - Flags are: assert,df,fold,gc,gcac,gimple,misc, > + Flags are: assert,df,extra,fold,gc,gcac,gimple,misc, > rtlflag,rtl,runtime,tree,valgrind,types])], > [ac_checking_flags="${enableval}"],[ > # Determine the default checks. > if test x$is_release = x ; then > - ac_checking_flags=yes > + ac_checking_flags=yes,extra > else > ac_checking_flags=release > fi]) > @@ -531,32 +531,33 @@ do > case $check in > # these set all the flags to specific states > yes) ac_assert_checking=1 ; ac_checking=1 ; > ac_df_checking= ; > - ac_fold_checking= ; ac_gc_checking=1 ; > + ac_fold_checking= ; ac_gc_checking=1 ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking=1 ; > ac_rtl_checking= ; > ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; > ac_tree_checking=1 ; ac_valgrind_checking= ; > ac_types_checking=1 ;; > no|none) ac_assert_checking= ; ac_checking= ; ac_df_checking= ; > - ac_fold_checking= ; ac_gc_checking= ; > + ac_fold_checking= ; ac_gc_checking= ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking= ; > ac_rtl_checking= ; > ac_rtlflag_checking= ; ac_runtime_checking= ; > ac_tree_checking= ; ac_valgrind_checking= ; > ac_types_checking= ;; > all) ac_assert_checking=1 ; ac_checking=1 ; > ac_df_checking=1 ; > - ac_fold_checking=1 ; ac_gc_checking=1 ; > + ac_fold_checking=1 ; ac_gc_checking=1 ; > ac_extra_checking=1 ; > ac_gc_always_collect=1 ; ac_gimple_checking=1 ; > ac_rtl_checking=1 ; > ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; > ac_tree_checking=1 ; ac_valgrind_checking= ; > ac_types_checking=1 ;; > release) ac_assert_checking=1 ; ac_checking= ; ac_df_checking= > ; > - ac_fold_checking= ; ac_gc_checking= ; > + ac_fold_checking= ; ac_gc_checking= ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking= ; > ac_rtl_checking= ; > ac_rtlflag_checking= ; ac_runtime_checking=1 ; > ac_tree_checking= ; ac_valgrind_checking= ; > ac_types_checking= ;; > # these enable particular checks > assert) ac_assert_checking=1 ;; > - df) ac_df_checking=1 ;; > + df) ac_df_checking=1 ;; > + extra) ac_extra_checking=1 ;; > fold) ac_fold_checking=1 ;; > gc) ac_gc_checking=1 ;; > gcac) ac_gc_always_collect=1 ;; > @@ -575,9 +576,13 @@ IFS="$ac_save_IFS" > > nocommon_flag="" > if test x$ac_checking != x ; then > - AC_DEFINE(CHECKING_P, 1, > + if test x$ac_extra_checking != x ; then > + ac_checking=2 > + fi > + AC_DEFINE_UNQUOTED(CHECKING_P, $ac_checking, > [Define to 1 if you want more run-time sanity checks. This one gets a grab > - bag of miscellaneous but relatively cheap checks.]) > + bag of miscellaneous but relatively cheap checks. Define to 2 if you want > + also extra run-time checking that might affect code generation.]) > nocommon_flag=-fno-common > else > AC_DEFINE(CHECKING_P, 0) > --- gcc/common.opt.jj 2016-03-17 16:54:46.000000000 +0100 > +++ gcc/common.opt 2016-04-25 17:46:20.112362251 +0200 > @@ -1029,6 +1029,10 @@ fchecking > Common Var(flag_checking) Init(CHECKING_P) > Perform internal consistency checkings. > > +fchecking= > +Common Joined RejectNegative UInteger Var(flag_checking) > +Perform internal consistency checkings. > + > fcombine-stack-adjustments > Common Report Var(flag_combine_stack_adjustments) Optimization > Looks for opportunities to reduce stack adjustments and stack references. > --- gcc/cp/pt.c.jj 2016-04-22 18:21:27.000000000 +0200 > +++ gcc/cp/pt.c 2016-04-25 17:43:05.478972266 +0200 > @@ -23623,8 +23623,10 @@ build_non_dependent_expr (tree expr) > > /* When checking, try to get a constant value for all non-dependent > expressions in order to expose bugs in *_dependent_expression_p > - and constexpr. */ > - if (flag_checking && cxx_dialect >= cxx11 > + and constexpr. This can affect code generation, see PR70704, so > + only do this for -fchecking=2. */ > + if (flag_checking > 1 > + && cxx_dialect >= cxx11 > /* Don't do this during nsdmi parsing as it can lead to > unexpected recursive instantiations. */ > && !parsing_nsdmi ()) > --- gcc/doc/invoke.texi.jj 2016-04-22 18:21:28.000000000 +0200 > +++ gcc/doc/invoke.texi 2016-04-25 18:01:03.666517058 +0200 > @@ -501,7 +501,8 @@ Objective-C and Objective-C++ Dialects}. > @item Developer Options > @xref{Developer Options,,GCC Developer Options}. > @gccoptlist{-d@var{letters} -dumpspecs -dumpmachine -dumpversion @gol > --fchecking -fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol > +-fchecking -fchecking=@var{n} -fdbg-cnt-list @gol > +-fdbg-cnt=@var{counter-value-list} @gol > -fdisable-ipa-@var{pass_name} @gol > -fdisable-rtl-@var{pass_name} @gol > -fdisable-rtl-@var{pass-name}=@var{range-list} @gol > @@ -12368,10 +12369,12 @@ Here are some examples showing uses of t > @end smallexample > > @item -fchecking > +@itemx -fchecking=@var{n} > @opindex fchecking > @opindex fno-checking > Enable internal consistency checking. The default depends on > -the compiler configuration. > +the compiler configuration. @option{-fchecking=2} enables further > +internal consistency checking that might affect code generation. > > @item -frandom-seed=@var{string} > @opindex frandom-seed > --- gcc/doc/install.texi.jj 2016-04-22 18:21:28.000000000 +0200 > +++ gcc/doc/install.texi 2016-04-25 17:52:24.156481290 +0200 > @@ -1708,7 +1708,7 @@ When you specify this option, the compil > consistency checks of the requested complexity. This does not change the > generated code, but adds error checking within the compiler. This will > slow down the compiler and may only work properly if you are building > -the compiler with GCC@. This is @samp{yes} by default when building > +the compiler with GCC@. This is @samp{yes,extra} by default when building > from SVN or snapshots, but @samp{release} for releases. The default > for building the stage1 compiler is @samp{yes}. More control > over the checks may be had by specifying @var{list}. The categories of > @@ -1717,8 +1717,11 @@ checks available are @samp{yes} (most co > all), @samp{all} (all but @samp{valgrind}), @samp{release} (cheapest > checks @samp{assert,runtime}) or @samp{none} (same as @samp{no}). > Individual checks can be enabled with these flags @samp{assert}, > -@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac} @samp{misc}, @samp{rtl}, > -@samp{rtlflag}, @samp{runtime}, @samp{tree}, and @samp{valgrind}. > +@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac}, @samp{misc}, @samp{rtl}, > +@samp{rtlflag}, @samp{runtime}, @samp{tree}, @samp{extra} and > @samp{valgrind}. > +@samp{extra} adds for @samp{misc} checking extra checks that might affect > +code generation and should therefore not differ between stage1 and later > +stages. > > The @samp{valgrind} check requires the external @command{valgrind} > simulator, available from @uref{http://valgrind.org/}. The > --- configure.jj 2016-03-17 23:58:35.000000000 +0100 > +++ configure 2016-04-25 18:15:42.364740223 +0200 > @@ -14850,16 +14850,17 @@ else > # For --disable-checking or implicit --enable-checking=release, avoid > # setting --enable-checking=gc in the default stage1 checking for LTO > # bootstraps. See PR62077. > - stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types > case $BUILD_CONFIG in > *lto*) > - if test "x$enable_checking" = x && \ > - test -d ${srcdir}/gcc && \ > - test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then > - stage1_checking=--enable-checking=yes,types > - fi;; > - *) stage1_checking=--enable-checking=yes,types;; > + > stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;; > + *) > + stage1_checking=--enable-checking=yes,types;; > esac > + if test "x$enable_checking" = x && \ > + test -d ${srcdir}/gcc && \ > + test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then > + stage1_checking=yes,types,extra > + fi > else > stage1_checking=--enable-checking=$enable_checking,types > fi > --- gcc/configure.jj 2016-01-27 19:47:28.000000000 +0100 > +++ gcc/configure 2016-04-25 18:02:16.701537995 +0200 > @@ -1596,7 +1596,7 @@ Optional Features: > enable expensive run-time checks. With LIST, enable > only specific categories of checks. Categories are: > yes,no,all,none,release. Flags are: > - assert,df,fold,gc,gcac,gimple,misc, > + assert,df,extra,fold,gc,gcac,gimple,misc, > rtlflag,rtl,runtime,tree,valgrind,types > --enable-coverage[=LEVEL] > enable compiler's code coverage collection. Use to > @@ -7075,7 +7075,7 @@ else > > # Determine the default checks. > if test x$is_release = x ; then > - ac_checking_flags=yes > + ac_checking_flags=yes,extra > else > ac_checking_flags=release > fi > @@ -7087,32 +7087,33 @@ do > case $check in > # these set all the flags to specific states > yes) ac_assert_checking=1 ; ac_checking=1 ; > ac_df_checking= ; > - ac_fold_checking= ; ac_gc_checking=1 ; > + ac_fold_checking= ; ac_gc_checking=1 ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking=1 ; > ac_rtl_checking= ; > ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; > ac_tree_checking=1 ; ac_valgrind_checking= ; > ac_types_checking=1 ;; > no|none) ac_assert_checking= ; ac_checking= ; ac_df_checking= ; > - ac_fold_checking= ; ac_gc_checking= ; > + ac_fold_checking= ; ac_gc_checking= ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking= ; > ac_rtl_checking= ; > ac_rtlflag_checking= ; ac_runtime_checking= ; > ac_tree_checking= ; ac_valgrind_checking= ; > ac_types_checking= ;; > all) ac_assert_checking=1 ; ac_checking=1 ; > ac_df_checking=1 ; > - ac_fold_checking=1 ; ac_gc_checking=1 ; > + ac_fold_checking=1 ; ac_gc_checking=1 ; > ac_extra_checking=1 ; > ac_gc_always_collect=1 ; ac_gimple_checking=1 ; > ac_rtl_checking=1 ; > ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; > ac_tree_checking=1 ; ac_valgrind_checking= ; > ac_types_checking=1 ;; > release) ac_assert_checking=1 ; ac_checking= ; ac_df_checking= > ; > - ac_fold_checking= ; ac_gc_checking= ; > + ac_fold_checking= ; ac_gc_checking= ; > ac_extra_checking= ; > ac_gc_always_collect= ; ac_gimple_checking= ; > ac_rtl_checking= ; > ac_rtlflag_checking= ; ac_runtime_checking=1 ; > ac_tree_checking= ; ac_valgrind_checking= ; > ac_types_checking= ;; > # these enable particular checks > assert) ac_assert_checking=1 ;; > - df) ac_df_checking=1 ;; > + df) ac_df_checking=1 ;; > + extra) ac_extra_checking=1 ;; > fold) ac_fold_checking=1 ;; > gc) ac_gc_checking=1 ;; > gcac) ac_gc_always_collect=1 ;; > @@ -7131,8 +7132,13 @@ IFS="$ac_save_IFS" > > nocommon_flag="" > if test x$ac_checking != x ; then > + if test x$ac_extra_checking != x ; then > + ac_checking=2 > + fi > > -$as_echo "#define CHECKING_P 1" >>confdefs.h > +cat >>confdefs.h <<_ACEOF > +#define CHECKING_P $ac_checking > +_ACEOF > > nocommon_flag=-fno-common > else > @@ -18453,7 +18459,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18456 "configure" > +#line 18462 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -18559,7 +18565,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18562 "configure" > +#line 18568 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > --- gcc/config.in.jj 2016-01-26 20:50:26.000000000 +0100 > +++ gcc/config.in 2016-04-25 18:02:20.000000000 +0200 > @@ -31,7 +31,8 @@ > > > /* Define to 1 if you want more run-time sanity checks. This one gets a grab > - bag of miscellaneous but relatively cheap checks. */ > + bag of miscellaneous but relatively cheap checks. Define to 2 if you want > + also extra run-time checking that might affect code generation. */ > #ifndef USED_FOR_TARGET > #undef CHECKING_P > #endif > > Jakub