[PATCH v2] c++tools, configury: Configure with C++; test checking status [PR98821].

Iain Sandoe iain@sandoe.co.uk
Tue Jul 20 16:20:27 GMT 2021


Hi Jakub,

thanks for the quick review,
testing is on-going.

> On 20 Jul 2021, at 16:37, Jakub Jelinek <jakub@redhat.com> wrote:
> 
> 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.

works for me.

>> @@ -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…

done.

revised below,
OK now?, ( assuming testing is successful )

thanks
Iain

====

The c++tools configure fragments need to be built with a C++ compiler.

In addition, the stand-alone server uses diagnostic mechanisms in common
with GCC, but needs to define implementations for gcc_assert and
supporting output functions.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>

PR c++/98821 - modules : c++tools configures with CC but code fragments assume CXX.

	PR c++/98821

c++tools/ChangeLog:

	* config.h.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Configure using C++.  Pull logic to
	detect enabled checking modes; default to release
	checking.
	* server.cc (AI_NUMERICSERV): Define a fallback value.
	(gcc_assert): New.
	(gcc_unreachable): New.
	(fancy_abort): Only build when checking is enabled.

Co-authored-by: Jakub Jelinek <jakub@redhat.com>

---
 c++tools/config.h.in  |   3 +
 c++tools/configure    | 761 ++++++------------------------------------
 c++tools/configure.ac |  31 ++
 c++tools/server.cc    |  28 ++
 4 files changed, 170 insertions(+), 653 deletions(-)

diff --git a/c++tools/configure.ac b/c++tools/configure.ac
index 70fcb641db9..f991f63077f 100644
--- 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,35 @@ AC_MSG_RESULT([$maintainer_mode])
 test "$maintainer_mode" = yes && MAINTAINER=yes
 AC_SUBST(MAINTAINER)
 
+# Handle configuration of checking; for the tools in this directory we
+# default to release checking and stricter checks do not change this.
+
+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.])],
+[ac_checking_flags="${enableval}"],[
+# Default to checking.
+ac_checking_flags=yes
+])
+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|release|assert) ac_assert_checking=1 ; ;;
+	no|none) ac_assert_checking= ; ;;
+	*) ;;
+	esac
+done
+IFS="$ac_save_IFS"
+
+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
+
 # Check whether --enable-default-pie was given.
 AC_ARG_ENABLE(default-pie,
 [AS_HELP_STRING([--enable-default-pie],
diff --git a/c++tools/server.cc b/c++tools/server.cc
index fae3e78dc5d..a60eefe63b0 100644
--- a/c++tools/server.cc
+++ b/c++tools/server.cc
@@ -61,6 +61,10 @@ along with GCC; see the file COPYING3.  If not see
 # define gai_strerror(X) ""
 #endif
 
+#ifndef AI_NUMERICSERV
+#define AI_NUMERICSERV 0
+#endif
+
 #include <getopt.h>
 
 // Select or epoll
@@ -92,6 +96,28 @@ 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
+#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
+
+/* Use gcc_unreachable() to mark unreachable locations (like an
+   unreachable default case of a switch.  Do not use gcc_assert(0).  */
+#if (GCC_VERSION >= 4005) && !ENABLE_ASSERT_CHECKING
+#define gcc_unreachable() __builtin_unreachable ()
+#else
+#define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__))
+#endif
+
+
 #if NETWORKING
 struct netmask {
   in6_addr addr;
@@ -202,11 +228,13 @@ internal_error (const char *fmt, ...)
 
 /* Hooked to from gcc_assert & gcc_unreachable.  */
 
+#if ENABLE_ASSERT_CHECKING
 void ATTRIBUTE_NORETURN ATTRIBUTE_COLD
 fancy_abort (const char *file, int line, const char *func)
 {
   internal_error ("in %s, at %s:%d", func, trim_src_file (file), line);
 }
+#endif
 
 /* Exploded on a signal.  */
 
-- 
2.24.3 (Apple Git-128)




More information about the Gcc-patches mailing list