]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Reuse temporary buffer utils in <stacktrace>
authorJonathan Wakely <jwakely@redhat.com>
Sat, 1 Jun 2024 09:45:55 +0000 (10:45 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 28 Feb 2025 15:33:21 +0000 (15:33 +0000)
The non-throwing allocation logic in std::stacktrace duplicates the
logic in <bits/stl_tempbuf.h>, so we can just reuse those utilities.

libstdc++-v3/ChangeLog:

* include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate):
Use __detail::__get_temporary_buffer.
(basic_stacktrace::_Impl::_M_deallocate): Use
__detail::__return_temporary_buffer.

(cherry picked from commit 2a83084ce5536353ceb8554e906f87273a59c4fd)

libstdc++-v3/include/std/stacktrace

index dcff886c095f8b38fe2c482a956e59daa3f24d90..c7558069d5d1b3b87dd0f02567648ce7ff194377 100644 (file)
@@ -45,6 +45,7 @@
 #include <bits/stl_algo.h>
 #include <bits/stl_iterator.h>
 #include <bits/stl_uninitialized.h>
+#include <bits/stl_tempbuf.h> // __get_temporary_buffer
 #include <ext/numeric_traits.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
@@ -546,21 +547,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return std::min(__size_max, __alloc_max);
        }
 
-#if __has_builtin(__builtin_operator_new) >= 201802L
-# define _GLIBCXX_OPERATOR_NEW __builtin_operator_new
-# define _GLIBCXX_OPERATOR_DELETE __builtin_operator_delete
-#else
-# define _GLIBCXX_OPERATOR_NEW ::operator new
-# define _GLIBCXX_OPERATOR_DELETE ::operator delete
-#endif
-
-#if __cpp_sized_deallocation
-# define _GLIBCXX_SIZED_DELETE(T, p, n) \
-  _GLIBCXX_OPERATOR_DELETE((p), (n) * sizeof(T))
-#else
-# define _GLIBCXX_SIZED_DELETE(T, p, n) _GLIBCXX_OPERATOR_DELETE(p)
-#endif
-
        // Precondition: _M_frames == nullptr && __n != 0
        pointer
        _M_allocate(allocator_type& __alloc, size_type __n) noexcept
@@ -571,11 +557,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                {
                  // For std::allocator we use nothrow-new directly so we
                  // don't need to handle exceptions from __alloc.allocate(n).
-                 size_t __nb = __n * sizeof(value_type);
-                 void* const __p = _GLIBCXX_OPERATOR_NEW (__nb, nothrow_t{});
+                 auto __p = __detail::__get_temporary_buffer<value_type>(__n);
                  if (__p == nullptr) [[unlikely]]
                    return nullptr;
-                 _M_frames = static_cast<pointer>(__p);
+                 _M_frames = __p;
                }
              else
                {
@@ -600,9 +585,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          if (_M_capacity)
            {
              if constexpr (is_same_v<allocator_type, allocator<value_type>>)
-               _GLIBCXX_SIZED_DELETE(value_type,
-                                     static_cast<void*>(_M_frames),
-                                     _M_capacity);
+               __detail::__return_temporary_buffer(_M_frames, _M_capacity);
              else
                __alloc.deallocate(_M_frames, _M_capacity);
              _M_frames = nullptr;
@@ -610,10 +593,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            }
        }
 
-#undef _GLIBCXX_SIZED_DELETE
-#undef _GLIBCXX_OPERATOR_DELETE
-#undef _GLIBCXX_OPERATOR_NEW
-
        // Precondition: __n <= _M_size
        void
        _M_resize(size_type __n, allocator_type& __alloc) noexcept