[libc++] Build the dylib with C++17 to allow aligned new/delete
This allows simplifying the implementation of barriers. This is a re-commit of1ac403bd14
, which had to be reverted in64a9c944fc
because the minimum CMake version wasn't high enough. Now that we've upgraded, we can do this. Differential Revision: https://reviews.llvm.org/D75243
This commit is contained in:
parent
f3e667bf86
commit
e58660750e
|
@ -519,10 +519,10 @@ remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
|
||||||
# Required flags ==============================================================
|
# Required flags ==============================================================
|
||||||
function(cxx_add_basic_build_flags target)
|
function(cxx_add_basic_build_flags target)
|
||||||
|
|
||||||
# Require C++14 for all targets. C++14 is needed to ensure constant
|
# Require C++17 for all targets. C++17 is needed to use aligned allocation
|
||||||
# initialization for certain globals (ex global memory resources).
|
# in the dylib.
|
||||||
set_target_properties(${target} PROPERTIES
|
set_target_properties(${target} PROPERTIES
|
||||||
CXX_STANDARD 14
|
CXX_STANDARD 17
|
||||||
CXX_STANDARD_REQUIRED YES
|
CXX_STANDARD_REQUIRED YES
|
||||||
CXX_EXTENSIONS NO)
|
CXX_EXTENSIONS NO)
|
||||||
|
|
||||||
|
|
|
@ -26,21 +26,15 @@ public:
|
||||||
} __tickets[64];
|
} __tickets[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
ptrdiff_t& __expected;
|
ptrdiff_t& __expected;
|
||||||
unique_ptr<char[]> __state_allocation;
|
unique_ptr<__state_t[]> __state;
|
||||||
__state_t* __state;
|
|
||||||
|
|
||||||
_LIBCPP_HIDDEN
|
_LIBCPP_HIDDEN
|
||||||
__barrier_algorithm_base(ptrdiff_t& __expected)
|
__barrier_algorithm_base(ptrdiff_t& __expected)
|
||||||
: __expected(__expected)
|
: __expected(__expected)
|
||||||
{
|
{
|
||||||
size_t const __count = (__expected + 1) >> 1;
|
size_t const __count = (__expected + 1) >> 1;
|
||||||
size_t const __size = sizeof(__state_t) * __count;
|
__state = unique_ptr<__state_t[]>(new __state_t[__count]);
|
||||||
size_t __allocation_size = __size + alignof(__state_t);
|
|
||||||
__state_allocation = unique_ptr<char[]>(new char[__allocation_size]);
|
|
||||||
void* __allocation = __state_allocation.get();
|
|
||||||
void* const __state_ = align(alignof(__state_t), __size, __allocation, __allocation_size);
|
|
||||||
__state = new (__state_) __barrier_algorithm_base::__state_t[__count];
|
|
||||||
}
|
}
|
||||||
_LIBCPP_HIDDEN
|
_LIBCPP_HIDDEN
|
||||||
bool __arrive(__barrier_phase_t __old_phase)
|
bool __arrive(__barrier_phase_t __old_phase)
|
||||||
|
|
Loading…
Reference in New Issue