diff mbox series

[2/2] libstdc++: Reuse temporary buffer utils in <stacktrace>

Message ID 20240601102927.878453-2-jwakely@redhat.com
State New
Headers show
Series [1/2] libstdc++: Handle extended alignment in std::get_temporary_buffer [PR105258] | expand

Commit Message

Jonathan Wakely June 1, 2024, 10:25 a.m. UTC
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.
---
 libstdc++-v3/include/std/stacktrace | 29 ++++-------------------------
 1 file changed, 4 insertions(+), 25 deletions(-)

Comments

Jonathan Wakely June 3, 2024, 8:22 p.m. UTC | #1
On Sat, 1 Jun 2024 at 11:29, Jonathan Wakely <jwakely@redhat.com> 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
>
diff mbox series

Patch

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