This helps the compiler to split the cold path into a separate clone, so
that the hot path is a smaller function that uses less icache, and the
cold path is only fetched into the icache if actually executed.

libstdc++-v3/ChangeLog:

        PR libstdc++/117650
        * include/bits/c++config (__glibcxx_assert_fail): Add cold
        attribute.
        * include/debug/formatter.h (_Error_formatter::_M_error):
        Likewise.
---

Tested x86_64-linux. Pushed to trunk.

 libstdc++-v3/include/bits/c++config    | 2 +-
 libstdc++-v3/include/debug/formatter.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/bits/c++config 
b/libstdc++-v3/include/bits/c++config
index 236906d2f79..c74b03013fd 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -610,7 +610,7 @@ namespace std
 {
 #pragma GCC visibility push(default)
   // Don't use <cassert> because this should be unaffected by NDEBUG.
-  extern "C++" _GLIBCXX_NORETURN
+  extern "C++" _GLIBCXX_NORETURN __attribute__((__cold__))
   void
   __glibcxx_assert_fail /* Called when a precondition violation is detected. */
     (const char* __file, int __line, const char* __function,
diff --git a/libstdc++-v3/include/debug/formatter.h 
b/libstdc++-v3/include/debug/formatter.h
index 4f5a4539bb9..df7f6965a4c 100644
--- a/libstdc++-v3/include/debug/formatter.h
+++ b/libstdc++-v3/include/debug/formatter.h
@@ -571,7 +571,7 @@ namespace __gnu_debug
     _Error_formatter&
     _M_message(_Debug_msg_id __id) const throw ();
 
-    _GLIBCXX_NORETURN void
+    _GLIBCXX_NORETURN __attribute__((__cold__)) void
     _M_error() const;
 
 #if !_GLIBCXX_INLINE_VERSION
-- 
2.47.0

Reply via email to