-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc++] Remove get_temporary_buffer
/return_temporary_buffer
#100914
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f7ff07e
25a9782
038af58
60212b2
2841f72
d0f6edf
5268aa9
3529007
2a71c0e
6d42fd6
cfc0ef5
3cc9bb7
9e2567a
ffce43a
b83103b
c812180
f6e94f7
5c50d6a
2890c1d
b8de11d
eda4edf
1f3fde7
5e4b157
2bd52cb
51b18a2
0961a50
dc503fa
74f4c4a
1406cd5
de9a474
fa30053
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
// -*- C++ -*- | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef _LIBCPP___MEMORY_UNIQUE_TEMPORARY_BUFFER_H | ||
#define _LIBCPP___MEMORY_UNIQUE_TEMPORARY_BUFFER_H | ||
|
||
#include <__assert> | ||
#include <__config> | ||
|
||
#include <__memory/allocator.h> | ||
#include <__memory/unique_ptr.h> | ||
#include <__type_traits/is_constant_evaluated.h> | ||
#include <cstddef> | ||
#include <new> | ||
|
||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
#endif | ||
|
||
_LIBCPP_BEGIN_NAMESPACE_STD | ||
|
||
template <class _Tp> | ||
struct __temporary_buffer_deleter { | ||
ptrdiff_t __count_; // ignored in non-constant evaluation | ||
|
||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __temporary_buffer_deleter() _NOEXCEPT : __count_(0) {} | ||
_LIBCPP_HIDE_FROM_ABI | ||
_LIBCPP_CONSTEXPR explicit __temporary_buffer_deleter(ptrdiff_t __count) _NOEXCEPT : __count_(__count) {} | ||
|
||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator()(_Tp* __ptr) _NOEXCEPT { | ||
if (__libcpp_is_constant_evaluated()) { | ||
allocator<_Tp>().deallocate(__ptr, __count_); | ||
return; | ||
} | ||
|
||
std::__libcpp_deallocate_unsized((void*)__ptr, _LIBCPP_ALIGNOF(_Tp)); | ||
} | ||
}; | ||
|
||
template <class _Tp> | ||
using __unique_temporary_buffer = unique_ptr<_Tp, __temporary_buffer_deleter<_Tp> >; | ||
|
||
template <class _Tp> | ||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __unique_temporary_buffer<_Tp> | ||
__allocate_unique_temporary_buffer(ptrdiff_t __count) { | ||
using __deleter_type = __temporary_buffer_deleter<_Tp>; | ||
using __unique_buffer_type = __unique_temporary_buffer<_Tp>; | ||
|
||
if (__libcpp_is_constant_evaluated()) { | ||
return __unique_buffer_type(allocator<_Tp>().allocate(__count), __deleter_type(__count)); | ||
} | ||
|
||
_Tp* __ptr = nullptr; | ||
const ptrdiff_t __max_count = | ||
(~ptrdiff_t(0) ^ ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) / sizeof(_Tp); | ||
if (__count > __max_count) | ||
__count = __max_count; | ||
while (__count > 0) { | ||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) | ||
if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp))) { | ||
align_val_t __al = align_val_t(_LIBCPP_ALIGNOF(_Tp)); | ||
__ptr = static_cast<_Tp*>(::operator new(__count * sizeof(_Tp), __al, nothrow)); | ||
} else { | ||
__ptr = static_cast<_Tp*>(::operator new(__count * sizeof(_Tp), nothrow)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this breaks CFI builds. It allocates memory with uninitialized objects and casts them to The old A simple fix would be to mark this new function here (Maybe the whole design is a bit questionable though? But I mostly care about CFI no longer working.) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm now opening a PR to add There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have a Thanks for the quick PR! |
||
} | ||
#else | ||
if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp))) { | ||
// Since aligned operator new is unavailable, constructs an empty buffer rather than one with invalid alignment. | ||
return __unique_buffer_type(); | ||
} | ||
|
||
__ptr = static_cast<_Tp*>(::operator new(__count * sizeof(_Tp), nothrow)); | ||
#endif | ||
|
||
if (__ptr) { | ||
break; | ||
} | ||
__count /= 2; | ||
} | ||
|
||
return __unique_buffer_type(__ptr, __deleter_type(__count)); | ||
} | ||
|
||
_LIBCPP_END_NAMESPACE_STD | ||
|
||
#endif // _LIBCPP___MEMORY_UNIQUE_TEMPORARY_BUFFER_H |
Uh oh!
There was an error while loading. Please reload this page.