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>

Reply via email to