diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-11-03 16:06:29 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-11-12 12:23:10 +0000 |
commit | a54ce8865a885bca5ab9c4aa6ec725cd13c09901 (patch) | |
tree | f023249b8da983be57093f004e3eb94cc2d22b29 | |
parent | 68d62cb20637b2faf2c2cc1716a0786b07a6a76f (diff) | |
download | gcc-a54ce8865a885bca5ab9c4aa6ec725cd13c09901.zip gcc-a54ce8865a885bca5ab9c4aa6ec725cd13c09901.tar.gz gcc-a54ce8865a885bca5ab9c4aa6ec725cd13c09901.tar.bz2 |
libstdc++: Print assertion messages to stderr [PR59675]
This replaces the printf used by failed debug assertions with fprintf,
so we can write to stderr.
To avoid including <stdio.h> the assert function is moved into the
library. To avoid programs using a vague linkage definition of the old
inline function, the function is renamed. Code compiled with old
versions of GCC might still call the old function, but code compiled
with the newer GCC will call the new function and write to stderr.
libstdc++-v3/ChangeLog:
PR libstdc++/59675
* acinclude.m4 (libtool_VERSION): Bump version.
* config/abi/pre/gnu.ver (GLIBCXX_3.4.30): Add version and
export new symbol.
* configure: Regenerate.
* include/bits/c++config (__replacement_assert): Remove, declare
__glibcxx_assert_fail instead.
* src/c++11/debug.cc (__glibcxx_assert_fail): New function to
replace __replacement_assert, writing to stderr instead of
stdout.
* testsuite/util/testsuite_abi.cc: Update latest version.
-rw-r--r-- | libstdc++-v3/acinclude.m4 | 2 | ||||
-rw-r--r-- | libstdc++-v3/config/abi/pre/gnu.ver | 6 | ||||
-rwxr-xr-x | libstdc++-v3/configure | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 27 | ||||
-rw-r--r-- | libstdc++-v3/src/c++11/debug.cc | 18 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/util/testsuite_abi.cc | 3 |
6 files changed, 38 insertions, 20 deletions
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 497af57..4adfdf6 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -3798,7 +3798,7 @@ changequote([,])dnl fi # For libtool versioning info, format is CURRENT:REVISION:AGE -libtool_VERSION=6:29:0 +libtool_VERSION=6:30:0 # Everything parsed; figure out what files and settings to use. case $enable_symvers in diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 5323c7f..8f3c7b3 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -2397,6 +2397,12 @@ GLIBCXX_3.4.29 { } GLIBCXX_3.4.28; +GLIBCXX_3.4.30 { + + _ZSt21__glibcxx_assert_fail*; + +} GLIBCXX_3.4.29; + # Symbols in the support library (libsupc++) have their own tag. CXXABI_1.3 { diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 2137103..3a57247 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -74892,7 +74892,7 @@ $as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;} fi # For libtool versioning info, format is CURRENT:REVISION:AGE -libtool_VERSION=6:29:0 +libtool_VERSION=6:30:0 # Everything parsed; figure out what files and settings to use. case $enable_symvers in diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index a649580..4b7fa65 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -526,22 +526,17 @@ namespace std // Avoid the use of assert, because we're trying to keep the <cassert> // include out of the mix. extern "C++" _GLIBCXX_NORETURN - inline void - __replacement_assert(const char* __file, int __line, - const char* __function, const char* __condition) - _GLIBCXX_NOEXCEPT - { - __builtin_printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line, - __function, __condition); - __builtin_abort(); - } + void + __glibcxx_assert_fail(const char* __file, int __line, + const char* __function, const char* __condition) + _GLIBCXX_NOEXCEPT; } -#define __glibcxx_assert_impl(_Condition) \ - if (__builtin_expect(!bool(_Condition), false)) \ - { \ - __glibcxx_constexpr_assert(false); \ - std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ - #_Condition); \ +#define __glibcxx_assert_impl(_Condition) \ + if (__builtin_expect(!bool(_Condition), false)) \ + { \ + __glibcxx_constexpr_assert(false); \ + std::__glibcxx_assert_fail(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ + #_Condition); \ } # else // ! VERBOSE_ASSERT # define __glibcxx_assert_impl(_Condition) \ @@ -550,7 +545,7 @@ namespace std __glibcxx_constexpr_assert(false); \ __builtin_abort(); \ } -#endif +# endif #endif #if defined(_GLIBCXX_ASSERTIONS) diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 0128535..77cb2a2 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -33,7 +33,8 @@ #include <debug/vector> #include <cassert> -#include <cstdio> +#include <cstdio> // for std::fprintf, stderr +#include <cstdlib> // for std::abort #include <cctype> // for std::isspace. #include <cstring> // for std::strstr. @@ -43,6 +44,21 @@ #include "mutex_pool.h" +#ifdef _GLIBCXX_VERBOSE_ASSERT +namespace std +{ + [[__noreturn__]] + void + __glibcxx_assert_fail(const char* file, int line, + const char* function, const char* condition) noexcept + { + fprintf(stderr, "%s:%d: %s: Assertion '%s' failed.\n", + file, line, function, condition); + abort(); + } +} +#endif + using namespace std; namespace diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc index 3af5dc5..1ca7da4 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.cc +++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -210,6 +210,7 @@ check_version(symbol& test, bool added) known_versions.push_back("GLIBCXX_3.4.27"); known_versions.push_back("GLIBCXX_3.4.28"); known_versions.push_back("GLIBCXX_3.4.29"); + known_versions.push_back("GLIBCXX_3.4.30"); known_versions.push_back("GLIBCXX_LDBL_3.4.29"); known_versions.push_back("GLIBCXX_IEEE128_3.4.29"); known_versions.push_back("CXXABI_1.3"); @@ -245,7 +246,7 @@ check_version(symbol& test, bool added) test.version_status = symbol::incompatible; // Check that added symbols are added in the latest pre-release version. - bool latestp = (test.version_name == "GLIBCXX_3.4.29" + bool latestp = (test.version_name == "GLIBCXX_3.4.30" // XXX remove next 3 lines when baselines have been regenerated // to include {IEEE128,LDBL} symbols: || test.version_name == "GLIBCXX_LDBL_3.4.29" |