Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:13

0001 //===----------------------------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef _LIBCPP___ATOMIC_SUPPORT_C11_H
0010 #define _LIBCPP___ATOMIC_SUPPORT_C11_H
0011 
0012 #include <__atomic/memory_order.h>
0013 #include <__config>
0014 #include <__cstddef/ptrdiff_t.h>
0015 #include <__memory/addressof.h>
0016 #include <__type_traits/remove_const.h>
0017 
0018 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0019 #  pragma GCC system_header
0020 #endif
0021 
0022 //
0023 // This file implements support for C11-style atomics
0024 //
0025 
0026 _LIBCPP_BEGIN_NAMESPACE_STD
0027 
0028 template <typename _Tp>
0029 struct __cxx_atomic_base_impl {
0030   _LIBCPP_HIDE_FROM_ABI
0031 #ifndef _LIBCPP_CXX03_LANG
0032   __cxx_atomic_base_impl() _NOEXCEPT = default;
0033 #else
0034   __cxx_atomic_base_impl() _NOEXCEPT : __a_value() {
0035   }
0036 #endif // _LIBCPP_CXX03_LANG
0037   _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp __value) _NOEXCEPT : __a_value(__value) {}
0038   _LIBCPP_DISABLE_EXTENSION_WARNING _Atomic(_Tp) __a_value;
0039 };
0040 
0041 #define __cxx_atomic_is_lock_free(__s) __c11_atomic_is_lock_free(__s)
0042 
0043 _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_thread_fence(memory_order __order) _NOEXCEPT {
0044   __c11_atomic_thread_fence(static_cast<__memory_order_underlying_t>(__order));
0045 }
0046 
0047 _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_signal_fence(memory_order __order) _NOEXCEPT {
0048   __c11_atomic_signal_fence(static_cast<__memory_order_underlying_t>(__order));
0049 }
0050 
0051 template <class _Tp>
0052 _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val) _NOEXCEPT {
0053   __c11_atomic_init(std::addressof(__a->__a_value), __val);
0054 }
0055 template <class _Tp>
0056 _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val) _NOEXCEPT {
0057   __c11_atomic_init(std::addressof(__a->__a_value), __val);
0058 }
0059 
0060 template <class _Tp>
0061 _LIBCPP_HIDE_FROM_ABI void
0062 __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val, memory_order __order) _NOEXCEPT {
0063   __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
0064 }
0065 template <class _Tp>
0066 _LIBCPP_HIDE_FROM_ABI void
0067 __cxx_atomic_store(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val, memory_order __order) _NOEXCEPT {
0068   __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
0069 }
0070 
0071 template <class _Tp>
0072 _LIBCPP_HIDE_FROM_ABI _Tp
0073 __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const volatile* __a, memory_order __order) _NOEXCEPT {
0074   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0075   return __c11_atomic_load(
0076       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0077 }
0078 template <class _Tp>
0079 _LIBCPP_HIDE_FROM_ABI _Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const* __a, memory_order __order) _NOEXCEPT {
0080   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0081   return __c11_atomic_load(
0082       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0083 }
0084 
0085 template <class _Tp>
0086 _LIBCPP_HIDE_FROM_ABI void
0087 __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const volatile* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
0088   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0089   *__dst           = __c11_atomic_load(
0090       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0091 }
0092 template <class _Tp>
0093 _LIBCPP_HIDE_FROM_ABI void
0094 __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
0095   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0096   *__dst           = __c11_atomic_load(
0097       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0098 }
0099 
0100 template <class _Tp>
0101 _LIBCPP_HIDE_FROM_ABI _Tp
0102 __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __value, memory_order __order) _NOEXCEPT {
0103   return __c11_atomic_exchange(
0104       std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
0105 }
0106 template <class _Tp>
0107 _LIBCPP_HIDE_FROM_ABI _Tp
0108 __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp>* __a, _Tp __value, memory_order __order) _NOEXCEPT {
0109   return __c11_atomic_exchange(
0110       std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
0111 }
0112 
0113 _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR memory_order __to_failure_order(memory_order __order) {
0114   // Avoid switch statement to make this a constexpr.
0115   return __order == memory_order_release
0116            ? memory_order_relaxed
0117            : (__order == memory_order_acq_rel ? memory_order_acquire : __order);
0118 }
0119 
0120 template <class _Tp>
0121 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
0122     __cxx_atomic_base_impl<_Tp> volatile* __a,
0123     _Tp* __expected,
0124     _Tp __value,
0125     memory_order __success,
0126     memory_order __failure) _NOEXCEPT {
0127   return __c11_atomic_compare_exchange_strong(
0128       std::addressof(__a->__a_value),
0129       __expected,
0130       __value,
0131       static_cast<__memory_order_underlying_t>(__success),
0132       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0133 }
0134 template <class _Tp>
0135 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
0136     __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
0137     _NOEXCEPT {
0138   return __c11_atomic_compare_exchange_strong(
0139       std::addressof(__a->__a_value),
0140       __expected,
0141       __value,
0142       static_cast<__memory_order_underlying_t>(__success),
0143       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0144 }
0145 
0146 template <class _Tp>
0147 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
0148     __cxx_atomic_base_impl<_Tp> volatile* __a,
0149     _Tp* __expected,
0150     _Tp __value,
0151     memory_order __success,
0152     memory_order __failure) _NOEXCEPT {
0153   return __c11_atomic_compare_exchange_weak(
0154       std::addressof(__a->__a_value),
0155       __expected,
0156       __value,
0157       static_cast<__memory_order_underlying_t>(__success),
0158       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0159 }
0160 template <class _Tp>
0161 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
0162     __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
0163     _NOEXCEPT {
0164   return __c11_atomic_compare_exchange_weak(
0165       std::addressof(__a->__a_value),
0166       __expected,
0167       __value,
0168       static_cast<__memory_order_underlying_t>(__success),
0169       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0170 }
0171 
0172 template <class _Tp>
0173 _LIBCPP_HIDE_FROM_ABI _Tp
0174 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0175   return __c11_atomic_fetch_add(
0176       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0177 }
0178 template <class _Tp>
0179 _LIBCPP_HIDE_FROM_ABI _Tp
0180 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0181   return __c11_atomic_fetch_add(
0182       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0183 }
0184 
0185 template <class _Tp>
0186 _LIBCPP_HIDE_FROM_ABI _Tp*
0187 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0188   return __c11_atomic_fetch_add(
0189       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0190 }
0191 template <class _Tp>
0192 _LIBCPP_HIDE_FROM_ABI _Tp*
0193 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0194   return __c11_atomic_fetch_add(
0195       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0196 }
0197 
0198 template <class _Tp>
0199 _LIBCPP_HIDE_FROM_ABI _Tp
0200 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0201   return __c11_atomic_fetch_sub(
0202       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0203 }
0204 template <class _Tp>
0205 _LIBCPP_HIDE_FROM_ABI _Tp
0206 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0207   return __c11_atomic_fetch_sub(
0208       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0209 }
0210 template <class _Tp>
0211 _LIBCPP_HIDE_FROM_ABI _Tp*
0212 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0213   return __c11_atomic_fetch_sub(
0214       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0215 }
0216 template <class _Tp>
0217 _LIBCPP_HIDE_FROM_ABI _Tp*
0218 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0219   return __c11_atomic_fetch_sub(
0220       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0221 }
0222 
0223 template <class _Tp>
0224 _LIBCPP_HIDE_FROM_ABI _Tp
0225 __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0226   return __c11_atomic_fetch_and(
0227       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0228 }
0229 template <class _Tp>
0230 _LIBCPP_HIDE_FROM_ABI _Tp
0231 __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0232   return __c11_atomic_fetch_and(
0233       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0234 }
0235 
0236 template <class _Tp>
0237 _LIBCPP_HIDE_FROM_ABI _Tp
0238 __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0239   return __c11_atomic_fetch_or(
0240       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0241 }
0242 template <class _Tp>
0243 _LIBCPP_HIDE_FROM_ABI _Tp
0244 __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0245   return __c11_atomic_fetch_or(
0246       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0247 }
0248 
0249 template <class _Tp>
0250 _LIBCPP_HIDE_FROM_ABI _Tp
0251 __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0252   return __c11_atomic_fetch_xor(
0253       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0254 }
0255 template <class _Tp>
0256 _LIBCPP_HIDE_FROM_ABI _Tp
0257 __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0258   return __c11_atomic_fetch_xor(
0259       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0260 }
0261 
0262 _LIBCPP_END_NAMESPACE_STD
0263 
0264 #endif // _LIBCPP___ATOMIC_SUPPORT_C11_H