Comments
Patch
@@ -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.
@@ -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
@@ -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)
@@ -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>
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.