On Sat, 1 Jun 2024 at 11:29, Jonathan Wakely <[email protected]> wrote:
>
> The non-throwing allocation logic in std::stacktrace duplicates the
> logic in <bits/stl_tempbuf.h>, so we can just reuse those utilities.
Pushed to trunk now.
>
> 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.
> ---
> libstdc++-v3/include/std/stacktrace | 29 ++++-------------------------
> 1 file changed, 4 insertions(+), 25 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/stacktrace
> b/libstdc++-v3/include/std/stacktrace
> index 962dbed7a41..e0a543920bc 100644
> --- a/libstdc++-v3/include/std/stacktrace
> +++ b/libstdc++-v3/include/std/stacktrace
> @@ -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)
> @@ -545,21 +546,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
> @@ -570,11 +556,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> {
> // For std::allocator we use nothrow-new directly so we
> // don't need to handle bad_alloc exceptions.
> - 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
> {
> @@ -599,9 +584,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;
> @@ -609,10 +592,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
> --
> 2.45.1
>