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.
This commit is contained in:
parent
68d62cb206
commit
a54ce8865a
6 changed files with 38 additions and 20 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
2
libstdc++-v3/configure
vendored
2
libstdc++-v3/configure
vendored
|
@ -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
|
||||
|
|
|
@ -526,21 +526,16 @@ 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,
|
||||
void
|
||||
__glibcxx_assert_fail(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();
|
||||
}
|
||||
_GLIBCXX_NOEXCEPT;
|
||||
}
|
||||
#define __glibcxx_assert_impl(_Condition) \
|
||||
if (__builtin_expect(!bool(_Condition), false)) \
|
||||
{ \
|
||||
__glibcxx_constexpr_assert(false); \
|
||||
std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
|
||||
std::__glibcxx_assert_fail(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
|
||||
#_Condition); \
|
||||
}
|
||||
# else // ! VERBOSE_ASSERT
|
||||
|
@ -550,7 +545,7 @@ namespace std
|
|||
__glibcxx_constexpr_assert(false); \
|
||||
__builtin_abort(); \
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(_GLIBCXX_ASSERTIONS)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue