File indexing completed on 2026-05-10 08:44:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_SUPPORT_ATOMICORDERING_H
0018 #define LLVM_SUPPORT_ATOMICORDERING_H
0019
0020 #include <cstddef>
0021
0022 namespace llvm {
0023
0024
0025
0026
0027
0028 enum class AtomicOrderingCABI {
0029 relaxed = 0,
0030 consume = 1,
0031 acquire = 2,
0032 release = 3,
0033 acq_rel = 4,
0034 seq_cst = 5,
0035 };
0036
0037 bool operator<(AtomicOrderingCABI, AtomicOrderingCABI) = delete;
0038 bool operator>(AtomicOrderingCABI, AtomicOrderingCABI) = delete;
0039 bool operator<=(AtomicOrderingCABI, AtomicOrderingCABI) = delete;
0040 bool operator>=(AtomicOrderingCABI, AtomicOrderingCABI) = delete;
0041
0042
0043
0044 template <typename Int> inline bool isValidAtomicOrderingCABI(Int I) {
0045 return (Int)AtomicOrderingCABI::relaxed <= I &&
0046 I <= (Int)AtomicOrderingCABI::seq_cst;
0047 }
0048
0049
0050
0051
0052
0053
0054
0055
0056 enum class AtomicOrdering : unsigned {
0057 NotAtomic = 0,
0058 Unordered = 1,
0059 Monotonic = 2,
0060
0061 Acquire = 4,
0062 Release = 5,
0063 AcquireRelease = 6,
0064 SequentiallyConsistent = 7,
0065 LAST = SequentiallyConsistent
0066 };
0067
0068 bool operator<(AtomicOrdering, AtomicOrdering) = delete;
0069 bool operator>(AtomicOrdering, AtomicOrdering) = delete;
0070 bool operator<=(AtomicOrdering, AtomicOrdering) = delete;
0071 bool operator>=(AtomicOrdering, AtomicOrdering) = delete;
0072
0073
0074
0075 template <typename Int> inline bool isValidAtomicOrdering(Int I) {
0076 return static_cast<Int>(AtomicOrdering::NotAtomic) <= I &&
0077 I <= static_cast<Int>(AtomicOrdering::SequentiallyConsistent) &&
0078 I != 3;
0079 }
0080
0081
0082 inline const char *toIRString(AtomicOrdering ao) {
0083 static const char *names[8] = {"not_atomic", "unordered", "monotonic",
0084 "consume", "acquire", "release",
0085 "acq_rel", "seq_cst"};
0086 return names[static_cast<size_t>(ao)];
0087 }
0088
0089
0090
0091 inline bool isStrongerThan(AtomicOrdering AO, AtomicOrdering Other) {
0092 static const bool lookup[8][8] = {
0093
0094 {false, false, false, false, false, false, false, false},
0095 { true, false, false, false, false, false, false, false},
0096 { true, true, false, false, false, false, false, false},
0097 { true, true, true, false, false, false, false, false},
0098 { true, true, true, true, false, false, false, false},
0099 { true, true, true, false, false, false, false, false},
0100 { true, true, true, true, true, true, false, false},
0101 { true, true, true, true, true, true, true, false},
0102 };
0103 return lookup[static_cast<size_t>(AO)][static_cast<size_t>(Other)];
0104 }
0105
0106 inline bool isAtLeastOrStrongerThan(AtomicOrdering AO, AtomicOrdering Other) {
0107 static const bool lookup[8][8] = {
0108
0109 { true, false, false, false, false, false, false, false},
0110 { true, true, false, false, false, false, false, false},
0111 { true, true, true, false, false, false, false, false},
0112 { true, true, true, true, false, false, false, false},
0113 { true, true, true, true, true, false, false, false},
0114 { true, true, true, false, false, true, false, false},
0115 { true, true, true, true, true, true, true, false},
0116 { true, true, true, true, true, true, true, true},
0117 };
0118 return lookup[static_cast<size_t>(AO)][static_cast<size_t>(Other)];
0119 }
0120
0121 inline bool isStrongerThanUnordered(AtomicOrdering AO) {
0122 return isStrongerThan(AO, AtomicOrdering::Unordered);
0123 }
0124
0125 inline bool isStrongerThanMonotonic(AtomicOrdering AO) {
0126 return isStrongerThan(AO, AtomicOrdering::Monotonic);
0127 }
0128
0129 inline bool isAcquireOrStronger(AtomicOrdering AO) {
0130 return isAtLeastOrStrongerThan(AO, AtomicOrdering::Acquire);
0131 }
0132
0133 inline bool isReleaseOrStronger(AtomicOrdering AO) {
0134 return isAtLeastOrStrongerThan(AO, AtomicOrdering::Release);
0135 }
0136
0137
0138
0139 inline AtomicOrdering getMergedAtomicOrdering(AtomicOrdering AO,
0140 AtomicOrdering Other) {
0141 if ((AO == AtomicOrdering::Acquire && Other == AtomicOrdering::Release) ||
0142 (AO == AtomicOrdering::Release && Other == AtomicOrdering::Acquire))
0143 return AtomicOrdering::AcquireRelease;
0144 return isStrongerThan(AO, Other) ? AO : Other;
0145 }
0146
0147 inline AtomicOrderingCABI toCABI(AtomicOrdering AO) {
0148 static const AtomicOrderingCABI lookup[8] = {
0149 AtomicOrderingCABI::relaxed,
0150 AtomicOrderingCABI::relaxed,
0151 AtomicOrderingCABI::relaxed,
0152 AtomicOrderingCABI::consume,
0153 AtomicOrderingCABI::acquire,
0154 AtomicOrderingCABI::release,
0155 AtomicOrderingCABI::acq_rel,
0156 AtomicOrderingCABI::seq_cst,
0157 };
0158 return lookup[static_cast<size_t>(AO)];
0159 }
0160
0161 }
0162
0163 #endif