Patchwork PR 43852: new configure option --disable-libstdcxx-verbose

login
register
mail settings
Submitter Jonathan Wakely
Date Aug. 27, 2012, 5:15 p.m.
Message ID <CAH6eHdQfwS2nOutZX40emFCz1ekHyKS-w7n4OTBQ3EMXjyvxDQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/180252/
State New
Headers show

Comments

Jonathan Wakely - Aug. 27, 2012, 5:15 p.m.
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.huber@embedded-brains.de>
            Jonathan Wakely  <jwakely.gcc@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.gcc@gmail.com>
Date:   Sun Aug 26 15:45:08 2012 +0100

    2012-08-27  Sebastian Huber  <sebastian.huber@embedded-brains.de>
    	    Jonathan Wakely  <jwakely.gcc@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.
Mike Stump - Aug. 28, 2012, 5:29 p.m.
On Aug 27, 2012, at 10:15 AM, 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++.

So, I was thinking about this a little...  Native compilers usually want the pretty verbose stuff and can usually pay the price.  Cross compilers as a class, are less able to pay the price.  Maybe we want to default based merely on target != host?  I know in my cross compiler, I think I'd rather turn it off.  Not a bug point... but I thought I'd mention it.
Jonathan Wakely - Aug. 28, 2012, 6:05 p.m.
On 28 August 2012 18:29, Mike Stump wrote:
> On Aug 27, 2012, at 10:15 AM, 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++.
>
> So, I was thinking about this a little...  Native compilers usually want the pretty verbose stuff and can usually pay the price.  Cross compilers as a class, are less able to pay the price.  Maybe we want to default based merely on target != host?  I know in my cross compiler, I think I'd rather turn it off.  Not a bug point... but I thought I'd mention it.

That sounds sensible to me, but I don't have nearly enough experience
of using cross-compilers to make that call.  I'd have no problem with
anyone making that change after the patch goes in (assuming it goes
in.)
Joseph S. Myers - Aug. 28, 2012, 7:51 p.m.
On Tue, 28 Aug 2012, Mike Stump wrote:

> So, I was thinking about this a little...  Native compilers usually want 
> the pretty verbose stuff and can usually pay the price.  Cross compilers 
> as a class, are less able to pay the price.  Maybe we want to default 
> based merely on target != host?  I know in my cross compiler, I think 

Certainly not.  The configuration of the compiler for any given target 
should not depend on the host, and existing instances of such things are 
bugs.

Patch

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>