On Tue, Jul 20, 2021 at 04:21:34PM +0100, Iain Sandoe wrote: > --- a/c++tools/configure.ac > +++ b/c++tools/configure.ac > @@ -41,6 +41,8 @@ MISSING=`cd $ac_aux_dir && ${PWDCMD-pwd}`/missing > AC_CHECK_PROGS([AUTOCONF], [autoconf], [$MISSING autoconf]) > AC_CHECK_PROGS([AUTOHEADER], [autoheader], [$MISSING autoheader]) > > +AC_LANG(C++) > + > dnl Enabled by default > AC_MSG_CHECKING([whether to build C++ tools]) > AC_ARG_ENABLE(c++-tools, > @@ -67,6 +69,62 @@ AC_MSG_RESULT([$maintainer_mode]) > test "$maintainer_mode" = yes && MAINTAINER=yes > AC_SUBST(MAINTAINER) > > +# Enable expensive internal checks > +is_release= > +if test -f $srcdir/../gcc/DEV-PHASE \ > + && test x"`cat $srcdir/../gcc/DEV-PHASE`" != xexperimental; then > + is_release=yes > +fi > + > +AC_ARG_ENABLE(checking, > +[AS_HELP_STRING([[--enable-checking[=LIST]]], > + [enable expensive run-time checks. With LIST, > + enable only specific categories of checks. > + Categories are: yes,no,all,none,release. > + Flags are: misc,valgrind or other strings])], > +[ac_checking_flags="${enableval}"],[ > +# Determine the default checks. > +if test x$is_release = x ; then > + ac_checking_flags=yes > +else > + ac_checking_flags=release > +fi]) > +IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="$IFS," > +for check in release $ac_checking_flags > +do > + case $check in > + # these set all the flags to specific states > + yes|all) ac_checking=1 ; ac_assert_checking=1 ; ac_valgrind_checking= ;; > + no|none) ac_checking= ; ac_assert_checking= ; ac_valgrind_checking= ;; > + release) ac_checking= ; ac_assert_checking=1 ; ac_valgrind_checking= ;; > + # these enable particular checks > + assert) ac_assert_checking=1 ;; > + misc) ac_checking=1 ;; > + valgrind) ac_valgrind_checking=1 ;; > + # accept > + *) ;; > + esac > +done > +IFS="$ac_save_IFS" > + > +if test x$ac_checking != x ; then > + AC_DEFINE(CHECKING_P, 1, > +[Define to 1 if you want more run-time sanity checks.]) > +else > + AC_DEFINE(CHECKING_P, 0) > +fi > + > +if test x$ac_assert_checking != x ; then > + AC_DEFINE(ENABLE_ASSERT_CHECKING, 1, > +[Define if you want assertions enabled. This is a cheap check.]) > +fi > + > +if test x$ac_valgrind_checking != x ; then > + AC_DEFINE(ENABLE_VALGRIND_CHECKING, 1, > +[Define if you want to workaround valgrind (a memory checker) warnings about > + possible memory leaks because of libcpp use of interior pointers.]) > +fi
I guess we could simplify it, I think at least right now we only care about ENABLE_ASSERT_CHECKING and nothing else, so the is_release computation could go, make ac_checking_flags just default to yes, drop the ac_checking, ac_valgrind_checking variables and simplify the case so that it perhaps handles all we care together. That would be case $check in yes|all|release|assert) ac_assert_checking=1 ; ;; no|none) ac_assert_checking= ; ;; *) ;; esac or so. and then only AC_DEFINE ENABLE_ASSERT_CHECKING and from server.cc drop the CHECKING_P stuff. > @@ -92,6 +96,35 @@ along with GCC; see the file COPYING3. If not see > #define DIR_SEPARATOR '/' > #endif > > +/* Imported from libcpp/system.h > + Use gcc_assert(EXPR) to test invariants. */ > +#if ENABLE_ASSERT_CHECKING || CHECKING_P > +#define gcc_assert(EXPR) \ > + ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) > +#elif (GCC_VERSION >= 4005) > +#define gcc_assert(EXPR) \ > + ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0)) > +#else > +/* Include EXPR, so that unused variable warnings do not occur. */ > +#define gcc_assert(EXPR) ((void)(0 && (EXPR))) > +#endif > + > +#if CHECKING_P > +#define gcc_checking_assert(EXPR) gcc_assert (EXPR) > +#else > +/* N.B.: in release build EXPR is not evaluated. */ > +#define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) > +#endif I'd drop the gcc_checking_assert macro, we don't use it... Otherwise LGTM. Jakub