Message ID | YPBTiCH39BU0bs7A@redhat.com |
---|---|
State | New |
Headers | show |
Series | [committed] libstdc++: Add noexcept to __replacement_assert [PR101429] | expand |
On 15/07/21 5:26 pm, Jonathan Wakely via Libstdc++ wrote: > This results in slightly smaller code when assertions are enabled when > either using Clang (because it adds code to call std::terminate when > potentially-throwing functions are called in a noexcept function) or a > freestanding or non-verbose build (because it doesn't use printf). > > Signed-off-by: Jonathan Wakely <jwakely@redhat.com> > > libstdc++-v3/ChangeLog: > > PR libstdc++/101429 > * include/bits/c++config (__replacement_assert): Add noexcept. > [!_GLIBCXX_VERBOSE] (__glibcxx_assert_impl): Use __builtin_trap > instead of __replacement_assert. > > Tested powerpc64le-linux. Committed to trunk. > ChangeLog is talking about __builtin_trap but there is none in the attached patch.
On Thu, 15 Jul 2021, 18:21 François Dumont via Libstdc++, < libstdc++@gcc.gnu.org> wrote: > On 15/07/21 5:26 pm, Jonathan Wakely via Libstdc++ wrote: > > This results in slightly smaller code when assertions are enabled when > > either using Clang (because it adds code to call std::terminate when > > potentially-throwing functions are called in a noexcept function) or a > > freestanding or non-verbose build (because it doesn't use printf). > > > > Signed-off-by: Jonathan Wakely <jwakely@redhat.com> > > > > libstdc++-v3/ChangeLog: > > > > PR libstdc++/101429 > > * include/bits/c++config (__replacement_assert): Add noexcept. > > [!_GLIBCXX_VERBOSE] (__glibcxx_assert_impl): Use __builtin_trap > > instead of __replacement_assert. > > > > Tested powerpc64le-linux. Committed to trunk. > > > ChangeLog is talking about __builtin_trap but there is none in the > attached patch. > Yes I already noticed that and mentioned it in the bugzilla PR. It uses __builtin_abort not __builtin_trap. I'll fix the ChangeLog file tomorrow after it gets generated. The Git commit message will stay wrong though.
On Thu, 15 Jul 2021 at 19:47, Jonathan Wakely wrote: > > > > On Thu, 15 Jul 2021, 18:21 François Dumont via Libstdc++, <libstdc++@gcc.gnu.org> wrote: >> >> On 15/07/21 5:26 pm, Jonathan Wakely via Libstdc++ wrote: >> > This results in slightly smaller code when assertions are enabled when >> > either using Clang (because it adds code to call std::terminate when >> > potentially-throwing functions are called in a noexcept function) or a >> > freestanding or non-verbose build (because it doesn't use printf). >> > >> > Signed-off-by: Jonathan Wakely <jwakely@redhat.com> >> > >> > libstdc++-v3/ChangeLog: >> > >> > PR libstdc++/101429 >> > * include/bits/c++config (__replacement_assert): Add noexcept. >> > [!_GLIBCXX_VERBOSE] (__glibcxx_assert_impl): Use __builtin_trap >> > instead of __replacement_assert. >> > >> > Tested powerpc64le-linux. Committed to trunk. >> > >> ChangeLog is talking about __builtin_trap but there is none in the >> attached patch. > > > > Yes I already noticed that and mentioned it in the bugzilla PR. It uses __builtin_abort not __builtin_trap. I'll fix the ChangeLog file tomorrow after it gets generated. Fixed in r12-2361 > The Git commit message will stay wrong though.
diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 9314117aed8..69ace386dd7 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -500,6 +500,7 @@ namespace std // Assert. #if defined(_GLIBCXX_ASSERTIONS) \ || defined(_GLIBCXX_PARALLEL) || defined(_GLIBCXX_PARALLEL_ASSERTIONS) +# if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE namespace std { // Avoid the use of assert, because we're trying to keep the <cassert> @@ -508,6 +509,7 @@ namespace std 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); @@ -517,10 +519,18 @@ namespace std #define __glibcxx_assert_impl(_Condition) \ if (__builtin_expect(!bool(_Condition), false)) \ { \ - __glibcxx_constexpr_assert(_Condition); \ + __glibcxx_constexpr_assert(false); \ std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ #_Condition); \ } +# else // ! VERBOSE +# define __glibcxx_assert_impl(_Condition) \ + if (__builtin_expect(!bool(_Condition), false)) \ + { \ + __glibcxx_constexpr_assert(false); \ + __builtin_abort(); \ + } +#endif #endif #if defined(_GLIBCXX_ASSERTIONS)