On 27 August 2012 18:15, Jonathan Wakely wrote: > Unless anyone has objections I'm going to commit this to trunk, > implementing Sebastian's idea to disable the verbose terminate handler > and the "pure virtual function called" message, which write to stderr > when a process terminates. This allows embedded systems to avoid > pulling in the demangler and I/O code, reducing the footprint of > libstdc++. > > 2012-08-27 Sebastian Huber <sebastian.hu...@embedded-brains.de> > Jonathan Wakely <jwakely....@gmail.com> > > * acinclude.m4 (GLIBCXX_ENABLE_VERBOSE): Define. > * configure.ac (GLIBCXX_ENABLE_VERBOSE): Use it. > * config.h.in: Regenerate. > * configure: Likewise. > * libsupc++/eh_term_handler.cc (_GLIBCXX_VERBOSE): Check new macro. > * libsupc++/pure.cc (_GLIBCXX_VERBOSE): Likewise. > * doc/xml/manual/configure.xml (--disable-libstdcxx-verbose): > Document. > * doc/html/manual/configure.html: Regenerate. > > Tested on x86_64-linux.
I've committed this to trunk now.
commit 80c2524507ac793cf601934345a6183baf63a5d6 Author: Jonathan Wakely <jwakely....@gmail.com> Date: Sun Aug 26 15:45:08 2012 +0100 2012-08-27 Sebastian Huber <sebastian.hu...@embedded-brains.de> Jonathan Wakely <jwakely....@gmail.com> * acinclude.m4 (GLIBCXX_ENABLE_VERBOSE): Define. * configure.ac (GLIBCXX_ENABLE_VERBOSE): Use it. * config.h.in: Regenerate. * configure: Likewise. * libsupc++/eh_term_handler.cc (_GLIBCXX_VERBOSE): Check new macro. * libsupc++/pure.cc (_GLIBCXX_VERBOSE): Likewise. * doc/xml/manual/configure.xml (--disable-libstdcxx-verbose): Document. * doc/html/manual/configure.html: Regenerate. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 1179407..48d932c 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -2317,6 +2317,31 @@ AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [ dnl +dnl Check if the user wants a non-verbose library implementation. +dnl +dnl --disable-libstdcxx-verbose will turn off descriptive messages to +dnl standard error on termination. +dnl +dnl Defines: +dnl _GLIBCXX_VERBOSE (always defined, either to 1 or 0) +dnl +AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [ + AC_ARG_ENABLE([libstdcxx-verbose], + AC_HELP_STRING([--disable-libstdcxx-verbose], + [disable termination messages to standard error]),, + [enable_libstdcxx_verbose=yes]) + if test x"$enable_libstdcxx_verbose" = xyes; then + verbose_define=1 + else + AC_MSG_NOTICE([verbose termination messages are disabled]) + verbose_define=0 + fi + AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define, + [Define to 1 if a verbose library is built, or 0 otherwise.]) +]) + + +dnl dnl Check for template specializations for the 'long long' type. dnl The result determines only whether 'long long' I/O is enabled; things dnl like numeric_limits<> specializations are always available. diff --git a/libstdc++-v3/libsupc++/eh_term_handler.cc b/libstdc++-v3/libsupc++/eh_term_handler.cc index 52a0745..f4bf2a3 100644 --- a/libstdc++-v3/libsupc++/eh_term_handler.cc +++ b/libstdc++-v3/libsupc++/eh_term_handler.cc @@ -1,5 +1,5 @@ // -*- C++ -*- std::terminate handler -// Copyright (C) 2002, 2003, 2009 Free Software Foundation +// Copyright (C) 2002-2012 Free Software Foundation // // This file is part of GCC. // @@ -28,19 +28,17 @@ /* We default to the talkative, informative handler in a normal hosted library. This pulls in the demangler, the dyn-string utilities, and elements of the I/O library. For a low-memory environment, you can return - to the earlier "silent death" handler by including <cstdlib>, initializing - to "std::abort", and rebuilding the library. In a freestanding mode, we - default to this latter approach. */ - -#if ! _GLIBCXX_HOSTED -# include <cstdlib> -#endif + to the earlier "silent death" handler by configuring GCC with + --disable-libstdcxx-verbose and rebuilding the library. + In a freestanding environment, we default to this latter approach. */ +#if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE /* The current installed user handler. */ std::terminate_handler __cxxabiv1::__terminate_handler = -#if _GLIBCXX_HOSTED __gnu_cxx::__verbose_terminate_handler; #else - std::abort; +# include <cstdlib> +/* The current installed user handler. */ +std::terminate_handler __cxxabiv1::__terminate_handler = std::abort; #endif diff --git a/libstdc++-v3/libsupc++/pure.cc b/libstdc++-v3/libsupc++/pure.cc index 4879e59..a774597 100644 --- a/libstdc++-v3/libsupc++/pure.cc +++ b/libstdc++-v3/libsupc++/pure.cc @@ -1,5 +1,5 @@ // -*- C++ -*- -// Copyright (C) 2000, 2001, 2009, 2011 Free Software Foundation +// Copyright (C) 2000-2012 Free Software Foundation // // This file is part of GCC. // @@ -26,7 +26,7 @@ #include <cxxabi.h> #include "unwind-cxx.h" -#if _GLIBCXX_HOSTED +#if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE #ifdef _GLIBCXX_HAVE_UNISTD_H # include <unistd.h> # define writestr(str) write(2, str, sizeof(str) - 1) diff --git a/libstdc++-v3/doc/xml/manual/configure.xml b/libstdc++-v3/doc/xml/manual/configure.xml index 83443ef..bc98d7a 100644 --- a/libstdc++-v3/doc/xml/manual/configure.xml +++ b/libstdc++-v3/doc/xml/manual/configure.xml @@ -370,6 +370,19 @@ </para> </listitem></varlistentry> +<varlistentry><term><code>--disable-libstdcxx-verbose</code></term> + <listitem> + <para> + By default, the library is configured to write descriptive messages + to standard error for certain events such as calling a pure virtual + function or the invocation of the standard terminate handler. Those + messages cause the library to depend on the demangler and standard I/O + facilites, which might be undesirable in a low-memory environment or + when standard error is not available. This option disables those + messages. This option does not change the library ABI. + </para> + </listitem></varlistentry> + </variablelist> </section>