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.
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>

Reply via email to