14 #ifndef LLVM_CLANG_BASIC_SANITIZERS_H 15 #define LLVM_CLANG_BASIC_SANITIZERS_H 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Support/MathExtras.h" 35 static constexpr
unsigned kNumElem = 2;
37 uint64_t maskLoToHigh[kNumElem]{};
39 static constexpr
unsigned kNumBits =
sizeof(decltype(maskLoToHigh)) * 8;
41 static constexpr
unsigned kNumBitElem =
sizeof(decltype(maskLoToHigh[0])) * 8;
44 : maskLoToHigh{mask1, mask2} {}
47 SanitizerMask() =
default;
50 return Pos < kNumBits;
55 uint64_t mask1 = (Pos < kNumBitElem) ? 1ULL << (Pos % kNumBitElem) : 0;
56 uint64_t mask2 = (Pos >= kNumBitElem && Pos < (kNumBitElem * 2))
57 ? 1ULL << (Pos % kNumBitElem)
59 return SanitizerMask(mask1, mask2);
64 for (
const auto &Val : maskLoToHigh)
65 total += llvm::countPopulation(Val);
70 for (
auto &Val : maskLoToHigh)
75 return countPopulation() == 1;
80 constexpr
explicit operator bool()
const {
81 return maskLoToHigh[0] || maskLoToHigh[1];
85 return maskLoToHigh[0] == V.maskLoToHigh[0] &&
86 maskLoToHigh[1] == V.maskLoToHigh[1];
89 SanitizerMask &operator&=(
const SanitizerMask &RHS) {
90 for (
unsigned k = 0; k < kNumElem; k++)
91 maskLoToHigh[k] &= RHS.maskLoToHigh[k];
96 for (
unsigned k = 0; k < kNumElem; k++)
97 maskLoToHigh[k] |= RHS.maskLoToHigh[k];
104 return !((*this) == RHS);
107 friend constexpr
inline SanitizerMask
operator~(SanitizerMask
v) {
108 return SanitizerMask(~v.maskLoToHigh[0], ~v.maskLoToHigh[1]);
111 friend constexpr
inline SanitizerMask
operator&(SanitizerMask a,
112 const SanitizerMask &b) {
113 return SanitizerMask(a.maskLoToHigh[0] & b.maskLoToHigh[0],
114 a.maskLoToHigh[1] & b.maskLoToHigh[1]);
117 friend constexpr
inline SanitizerMask
operator|(SanitizerMask a,
118 const SanitizerMask &b) {
119 return SanitizerMask(a.maskLoToHigh[0] | b.maskLoToHigh[0],
120 a.maskLoToHigh[1] | b.maskLoToHigh[1]);
133 #define SANITIZER(NAME, ID) SO_##ID, 134 #define SANITIZER_GROUP(NAME, ID, ALIAS) SO_##ID##Group, 135 #include "clang/Basic/Sanitizers.def" 139 #define SANITIZER(NAME, ID) \ 140 static constexpr SanitizerMask ID = SanitizerMask::bitPosToMask(SO_##ID); \ 141 static_assert(SanitizerMask::checkBitPos(SO_##ID), "Bit position too big."); 142 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 143 static constexpr SanitizerMask ID = SanitizerMask(ALIAS); \ 144 static constexpr SanitizerMask ID##Group = \ 145 SanitizerMask::bitPosToMask(SO_##ID##Group); \ 146 static_assert(SanitizerMask::checkBitPos(SO_##ID##Group), \ 147 "Bit position too big."); 148 #include "clang/Basic/Sanitizers.def" 154 assert(K.
isPowerOf2() &&
"Has to be a single sanitizer.");
155 return static_cast<bool>(Mask & K);
163 assert(K.isPowerOf2() &&
"Has to be a single sanitizer.");
164 Mask =
Value ? (Mask | K) : (Mask & ~K);
171 bool empty()
const {
return !Mask; }
187 return SanitizerKind::CFI | SanitizerKind::Integer |
189 SanitizerKind::Undefined | SanitizerKind::FloatDivideByZero;
194 #endif // LLVM_CLANG_BASIC_SANITIZERS_H
unsigned countPopulation() const
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
constexpr bool operator==(const SanitizerMask &V) const
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
constexpr XRayInstrMask All
DiagnosticLevelMask operator &(DiagnosticLevelMask LHS, DiagnosticLevelMask RHS)
llvm::hash_code hash_value(const clang::SanitizerMask &Arg)
friend constexpr SanitizerMask operator~(SanitizerMask v)
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
constexpr bool operator!() const
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
static constexpr SanitizerMask bitPosToMask(const unsigned Pos)
Create a mask with a bit enabled at position Pos.
constexpr bool operator!=(const SanitizerMask &RHS) const
Dataflow Directional Tag Classes.
static constexpr bool checkBitPos(const unsigned Pos)
SanitizerMask & operator|=(const SanitizerMask &RHS)
bool empty() const
Returns true if no sanitizers are enabled.
friend constexpr SanitizerMask operator|(SanitizerMask a, const SanitizerMask &b)
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
SanitizerMask expandSanitizerGroups(SanitizerMask Kinds)
For each sanitizer group bit set in Kinds, set the bits for sanitizers this group enables...
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.