File indexing completed on 2026-05-10 08:44:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_SUPPORT_MANAGEDSTATIC_H
0014 #define LLVM_SUPPORT_MANAGEDSTATIC_H
0015
0016 #include <atomic>
0017 #include <cstddef>
0018
0019 namespace llvm {
0020
0021
0022 template <class C> struct object_creator {
0023 static void *call() { return new C(); }
0024 };
0025
0026
0027
0028 template <typename T> struct object_deleter {
0029 static void call(void *Ptr) { delete (T *)Ptr; }
0030 };
0031 template <typename T, size_t N> struct object_deleter<T[N]> {
0032 static void call(void *Ptr) { delete[](T *)Ptr; }
0033 };
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 #if !defined(_MSC_VER) || (_MSC_VER >= 1925) || defined(__clang__)
0045 #define LLVM_USE_CONSTEXPR_CTOR
0046 #endif
0047
0048
0049 class ManagedStaticBase {
0050 protected:
0051 #ifdef LLVM_USE_CONSTEXPR_CTOR
0052 mutable std::atomic<void *> Ptr{};
0053 mutable void (*DeleterFn)(void *) = nullptr;
0054 mutable const ManagedStaticBase *Next = nullptr;
0055 #else
0056
0057
0058 mutable std::atomic<void *> Ptr;
0059 mutable void (*DeleterFn)(void *);
0060 mutable const ManagedStaticBase *Next;
0061 #endif
0062
0063 void RegisterManagedStatic(void *(*creator)(), void (*deleter)(void*)) const;
0064
0065 public:
0066 #ifdef LLVM_USE_CONSTEXPR_CTOR
0067 constexpr ManagedStaticBase() = default;
0068 #endif
0069
0070
0071 bool isConstructed() const { return Ptr != nullptr; }
0072
0073 void destroy() const;
0074 };
0075
0076
0077
0078
0079
0080
0081 template <class C, class Creator = object_creator<C>,
0082 class Deleter = object_deleter<C>>
0083 class ManagedStatic : public ManagedStaticBase {
0084 public:
0085
0086 C &operator*() {
0087 void *Tmp = Ptr.load(std::memory_order_acquire);
0088 if (!Tmp)
0089 RegisterManagedStatic(Creator::call, Deleter::call);
0090
0091 return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
0092 }
0093
0094 C *operator->() { return &**this; }
0095
0096 const C &operator*() const {
0097 void *Tmp = Ptr.load(std::memory_order_acquire);
0098 if (!Tmp)
0099 RegisterManagedStatic(Creator::call, Deleter::call);
0100
0101 return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
0102 }
0103
0104 const C *operator->() const { return &**this; }
0105
0106
0107
0108 C *claim() {
0109 return static_cast<C *>(Ptr.exchange(nullptr));
0110 }
0111 };
0112
0113
0114 void llvm_shutdown();
0115
0116
0117
0118 struct llvm_shutdown_obj {
0119 llvm_shutdown_obj() = default;
0120 ~llvm_shutdown_obj() { llvm_shutdown(); }
0121 };
0122
0123 }
0124
0125 #endif