[libc++] Rename *SAFE_STATIC to *CONSTINIT, and normalize its uses.

In src/, most files can use `constinit` directly because they're always
compiled with C++20. But some files, like "libcxxabi/src/fallback_malloc.cpp",
can't, because they're `#include`d directly from test cases in libcxxabi/test/
and therefore must (currently) compile as C++03. We might consider refactoring
those offending tests, or at least marking them `UNSUPPORTED: c++03`.

Differential Revision: https://reviews.llvm.org/D119264
This commit is contained in:
Arthur O'Dwyer 2022-02-08 13:08:59 -05:00
parent db33373596
commit 05337a756c
20 changed files with 43 additions and 71 deletions

View File

@ -1239,10 +1239,12 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container(
# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x)
#endif
#if __has_attribute(require_constant_initialization)
# define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__))
#if _LIBCPP_STD_VER > 17
# define _LIBCPP_CONSTINIT constinit
#elif __has_attribute(require_constant_initialization)
# define _LIBCPP_CONSTINIT __attribute__((__require_constant_initialization__))
#else
# define _LIBCPP_SAFE_STATIC
# define _LIBCPP_CONSTINIT
#endif
#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS)

View File

@ -35,8 +35,7 @@ _LIBCPP_NORETURN void __libcpp_abort_debug_function(__libcpp_debug_info const& i
std::abort();
}
_LIBCPP_SAFE_STATIC __libcpp_debug_function_type
__libcpp_debug_function = __libcpp_abort_debug_function;
constinit __libcpp_debug_function_type __libcpp_debug_function = __libcpp_abort_debug_function;
bool __libcpp_set_debug_function(__libcpp_debug_function_type __func) {
__libcpp_debug_function = __func;

View File

@ -97,7 +97,7 @@ static memory_resource *
__default_memory_resource(bool set = false, memory_resource * new_res = nullptr) noexcept
{
#ifndef _LIBCPP_HAS_NO_ATOMIC_HEADER
_LIBCPP_SAFE_STATIC static atomic<memory_resource*> __res{&res_init.resources.new_delete_res};
static constinit atomic<memory_resource*> __res{&res_init.resources.new_delete_res};
if (set) {
new_res = new_res ? new_res : new_delete_resource();
// TODO: Can a weaker ordering be used?
@ -109,7 +109,7 @@ __default_memory_resource(bool set = false, memory_resource * new_res = nullptr)
&__res, memory_order_acquire);
}
#elif !defined(_LIBCPP_HAS_NO_THREADS)
_LIBCPP_SAFE_STATIC static memory_resource * res = &res_init.resources.new_delete_res;
static constinit memory_resource *res = &res_init.resources.new_delete_res;
static mutex res_lock;
if (set) {
new_res = new_res ? new_res : new_delete_resource();
@ -122,7 +122,7 @@ __default_memory_resource(bool set = false, memory_resource * new_res = nullptr)
return res;
}
#else
_LIBCPP_SAFE_STATIC static memory_resource* res = &res_init.resources.new_delete_res;
static constinit memory_resource *res = &res_init.resources.new_delete_res;
if (set) {
new_res = new_res ? new_res : new_delete_resource();
memory_resource * old_res = res;

View File

@ -1,2 +1,2 @@
#pragma GCC system_header
_LIBCPP_SAFE_STATIC ResourceInitHelper res_init _LIBCPP_INIT_PRIORITY_MAX;
static constinit ResourceInitHelper res_init _LIBCPP_INIT_PRIORITY_MAX;

View File

@ -132,8 +132,8 @@ __shared_weak_count::__get_deleter(const type_info&) const noexcept
#if !defined(_LIBCPP_HAS_NO_THREADS)
_LIBCPP_SAFE_STATIC static const std::size_t __sp_mut_count = 16;
_LIBCPP_SAFE_STATIC static __libcpp_mutex_t mut_back[__sp_mut_count] =
static constexpr std::size_t __sp_mut_count = 16;
static constinit __libcpp_mutex_t mut_back[__sp_mut_count] =
{
_LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
_LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
@ -171,8 +171,7 @@ __sp_mut::unlock() noexcept
__sp_mut&
__get_sp_mut(const void* p)
{
static __sp_mut muts[__sp_mut_count]
{
static constinit __sp_mut muts[__sp_mut_count] = {
&mut_back[ 0], &mut_back[ 1], &mut_back[ 2], &mut_back[ 3],
&mut_back[ 4], &mut_back[ 5], &mut_back[ 6], &mut_back[ 7],
&mut_back[ 8], &mut_back[ 9], &mut_back[10], &mut_back[11],

View File

@ -196,8 +196,8 @@ recursive_timed_mutex::unlock() noexcept
// keep in sync with: 7741191.
#ifndef _LIBCPP_HAS_NO_THREADS
_LIBCPP_SAFE_STATIC static __libcpp_mutex_t mut = _LIBCPP_MUTEX_INITIALIZER;
_LIBCPP_SAFE_STATIC static __libcpp_condvar_t cv = _LIBCPP_CONDVAR_INITIALIZER;
static constinit __libcpp_mutex_t mut = _LIBCPP_MUTEX_INITIALIZER;
static constinit __libcpp_condvar_t cv = _LIBCPP_CONDVAR_INITIALIZER;
#endif
void __call_once(volatile once_flag::_State_type& flag, void* arg,

View File

@ -18,7 +18,7 @@
_LIBCPP_BEGIN_NAMESPACE_STD
#ifndef _LIBCPP_HAS_NO_THREADS
_LIBCPP_SAFE_STATIC static __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
#endif
unsigned __rs_default::__c_ = 0;

View File

@ -11,9 +11,8 @@
namespace std {
_LIBCPP_SAFE_STATIC static std::terminate_handler __terminate_handler;
_LIBCPP_SAFE_STATIC static std::unexpected_handler __unexpected_handler;
static constinit std::terminate_handler __terminate_handler = nullptr;
static constinit std::unexpected_handler __unexpected_handler = nullptr;
// libcxxrt provides implementations of these functions itself.
unexpected_handler
@ -26,7 +25,6 @@ unexpected_handler
get_unexpected() noexcept
{
return __libcpp_atomic_load(&__unexpected_handler);
}
_LIBCPP_NORETURN

View File

@ -9,7 +9,7 @@
namespace std {
_LIBCPP_SAFE_STATIC static std::new_handler __new_handler;
static constinit std::new_handler __new_handler = nullptr;
new_handler
set_new_handler(new_handler handler) noexcept

View File

@ -18,13 +18,10 @@ namespace coro = std::experimental;
using SuspendT = std::experimental::coroutines_v1::suspend_always;
TEST_SAFE_STATIC SuspendT safe_sa;
constexpr SuspendT constexpr_sa;
constexpr bool check_suspend_constexpr() {
SuspendT s{};
const SuspendT scopy(s); ((void)scopy);
SuspendT smove(std::move(s)); ((void)smove);
SuspendT s;
const SuspendT scopy(s); (void)scopy;
SuspendT smove(std::move(s)); (void)smove;
s = scopy;
s = std::move(smove);
return true;
@ -64,10 +61,6 @@ int main(int, char**)
static_assert(std::is_trivially_copyable<S>::value, "");
static_assert(check_suspend_constexpr(), "");
}
{
// suppress unused warnings for the global constexpr test variable
((void)constexpr_sa);
}
return 0;
}

View File

@ -16,16 +16,12 @@
namespace coro = std::experimental;
// Test that the type is in the correct namespace
using SuspendT = std::experimental::coroutines_v1::suspend_never;
TEST_SAFE_STATIC SuspendT safe_sn;
constexpr SuspendT constexpr_sn;
constexpr bool check_suspend_constexpr() {
SuspendT s{};
const SuspendT scopy(s); ((void)scopy);
SuspendT smove(std::move(s)); ((void)smove);
SuspendT s;
const SuspendT scopy(s); (void)scopy;
SuspendT smove(std::move(s)); (void)smove;
s = scopy;
s = std::move(smove);
return true;
@ -66,10 +62,6 @@ int main(int, char**)
static_assert(std::is_trivially_copyable<S>::value, "");
static_assert(check_suspend_constexpr(), "");
}
{
// suppress unused warnings for the global constexpr test variable
((void)constexpr_sn);
}
return 0;
}

View File

@ -16,8 +16,6 @@
#include "test_macros.h"
TEST_SAFE_STATIC std::suspend_always safe_sa;
constexpr bool check_suspend_constexpr() {
std::suspend_always s{};
const std::suspend_always scopy(s);

View File

@ -16,11 +16,6 @@
#include "test_macros.h"
// Test that the type 'std::suspend_never' is in the correct namespace
TEST_SAFE_STATIC std::suspend_never safe_sn;
constexpr std::suspend_never constexpr_sn;
constexpr bool check_suspend_constexpr() {
std::suspend_never s{};
const std::suspend_never scopy(s); ((void)scopy);
@ -76,10 +71,6 @@ int main(int, char**)
{
static_assert(test_trivial_awaitable_constexpr<std::suspend_never>(true));
}
{
// suppress unused warnings for the global constexpr test variable
((void)constexpr_sn);
}
return 0;
}

View File

@ -33,8 +33,8 @@ int main(int, char**)
struct TestConstexpr : public std::any {
constexpr TestConstexpr() : std::any() {}
};
TEST_SAFE_STATIC static std::any a;
((void)a);
static TEST_CONSTINIT std::any a;
(void)a;
}
{
DisableAllocationGuard g; ((void)g);

View File

@ -31,8 +31,8 @@
#include "unique_ptr_test_helper.h"
#if TEST_STD_VER >= 11
TEST_SAFE_STATIC std::unique_ptr<int> global_static_unique_ptr_single;
TEST_SAFE_STATIC std::unique_ptr<int[]> global_static_unique_ptr_runtime;
TEST_CONSTINIT std::unique_ptr<int> global_static_unique_ptr_single;
TEST_CONSTINIT std::unique_ptr<int[]> global_static_unique_ptr_runtime;
struct NonDefaultDeleter {
NonDefaultDeleter() = delete;

View File

@ -20,8 +20,8 @@
#if TEST_STD_VER >= 11
TEST_SAFE_STATIC std::unique_ptr<int> global_static_unique_ptr_single(nullptr);
TEST_SAFE_STATIC std::unique_ptr<int[]> global_static_unique_ptr_runtime(nullptr);
TEST_CONSTINIT std::unique_ptr<int> global_static_unique_ptr_single(nullptr);
TEST_CONSTINIT std::unique_ptr<int[]> global_static_unique_ptr_runtime(nullptr);
struct NonDefaultDeleter {
NonDefaultDeleter() = delete;

View File

@ -206,10 +206,12 @@
#define TEST_HAS_NO_ALIGNED_ALLOCATION
#endif
#if defined(_LIBCPP_SAFE_STATIC)
#define TEST_SAFE_STATIC _LIBCPP_SAFE_STATIC
#if TEST_STD_VER > 17
#define TEST_CONSTINIT constinit
#elif defined(_LIBCPP_CONSTINIT)
#define TEST_CONSTINIT _LIBCPP_CONSTINIT
#else
#define TEST_SAFE_STATIC
#define TEST_CONSTINIT
#endif
#if !defined(__cpp_impl_three_way_comparison) \

View File

@ -20,8 +20,7 @@
#if !defined(LIBCXXABI_SILENT_TERMINATE)
_LIBCPP_SAFE_STATIC
static const char* cause = "uncaught";
static constinit const char* cause = "uncaught";
__attribute__((noreturn))
static void demangling_terminate_handler()
@ -100,13 +99,13 @@ static constexpr std::terminate_handler default_unexpected_handler = std::termin
// Global variables that hold the pointers to the current handler
//
_LIBCXXABI_DATA_VIS
_LIBCPP_SAFE_STATIC std::terminate_handler __cxa_terminate_handler = default_terminate_handler;
constinit std::terminate_handler __cxa_terminate_handler = default_terminate_handler;
_LIBCXXABI_DATA_VIS
_LIBCPP_SAFE_STATIC std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler;
constinit std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler;
_LIBCXXABI_DATA_VIS
_LIBCPP_SAFE_STATIC std::new_handler __cxa_new_handler = 0;
constinit std::new_handler __cxa_new_handler = nullptr;
namespace std
{

View File

@ -619,7 +619,7 @@ struct GlobalStatic {
static T instance;
};
template <class T>
_LIBCPP_SAFE_STATIC T GlobalStatic<T>::instance = {};
_LIBCPP_CONSTINIT T GlobalStatic<T>::instance = {};
enum class Implementation { NoThreads, GlobalMutex, Futex };

View File

@ -33,10 +33,9 @@ namespace {
// When POSIX threads are not available, make the mutex operations a nop
#ifndef _LIBCXXABI_HAS_NO_THREADS
_LIBCPP_SAFE_STATIC
static std::__libcpp_mutex_t heap_mutex = _LIBCPP_MUTEX_INITIALIZER;
static _LIBCPP_CONSTINIT std::__libcpp_mutex_t heap_mutex = _LIBCPP_MUTEX_INITIALIZER;
#else
static void* heap_mutex = 0;
static _LIBCPP_CONSTINIT void* heap_mutex = 0;
#endif
class mutexor {