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 return SanitizerMask((Pos < kNumBitElem) ? 1ULL << Pos % kNumBitElem : 0,
56 (Pos >= kNumBitElem && Pos < kNumBitElem * 2)
57 ? 1ULL << Pos % kNumBitElem
63 for (
const auto &Val : maskLoToHigh)
64 total += llvm::countPopulation(Val);
69 for (
auto &Val : maskLoToHigh)
74 return countPopulation() == 1;
79 constexpr
explicit operator bool()
const {
80 return maskLoToHigh[0] || maskLoToHigh[1];
84 return maskLoToHigh[0] == V.maskLoToHigh[0] &&
85 maskLoToHigh[1] == V.maskLoToHigh[1];
88 SanitizerMask &operator&=(
const SanitizerMask &RHS) {
89 for (
unsigned k = 0; k < kNumElem; k++)
90 maskLoToHigh[k] &= RHS.maskLoToHigh[k];
95 for (
unsigned k = 0; k < kNumElem; k++)
96 maskLoToHigh[k] |= RHS.maskLoToHigh[k];
103 return !((*this) == RHS);
106 friend constexpr
inline SanitizerMask
operator~(SanitizerMask
v) {
107 return SanitizerMask(~v.maskLoToHigh[0], ~v.maskLoToHigh[1]);
110 friend constexpr
inline SanitizerMask
operator&(SanitizerMask
a,
111 const SanitizerMask &
b) {
112 return SanitizerMask(a.maskLoToHigh[0] & b.maskLoToHigh[0],
113 a.maskLoToHigh[1] & b.maskLoToHigh[1]);
116 friend constexpr
inline SanitizerMask
operator|(SanitizerMask
a,
117 const SanitizerMask &
b) {
118 return SanitizerMask(a.maskLoToHigh[0] | b.maskLoToHigh[0],
119 a.maskLoToHigh[1] | b.maskLoToHigh[1]);
132 #define SANITIZER(NAME, ID) SO_##ID, 133 #define SANITIZER_GROUP(NAME, ID, ALIAS) SO_##ID##Group, 134 #include "clang/Basic/Sanitizers.def" 138 #define SANITIZER(NAME, ID) \ 139 static constexpr SanitizerMask ID = SanitizerMask::bitPosToMask(SO_##ID); \ 140 static_assert(SanitizerMask::checkBitPos(SO_##ID), "Bit position too big."); 141 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 142 static constexpr SanitizerMask ID = SanitizerMask(ALIAS); \ 143 static constexpr SanitizerMask ID##Group = \ 144 SanitizerMask::bitPosToMask(SO_##ID##Group); \ 145 static_assert(SanitizerMask::checkBitPos(SO_##ID##Group), \ 146 "Bit position too big."); 147 #include "clang/Basic/Sanitizers.def" 153 assert(K.
isPowerOf2() &&
"Has to be a single sanitizer.");
154 return static_cast<bool>(Mask & K);
162 assert(K.isPowerOf2() &&
"Has to be a single sanitizer.");
163 Mask =
Value ? (Mask | K) : (Mask & ~K);
170 bool empty()
const {
return !Mask; }
186 return SanitizerKind::CFI | SanitizerKind::Integer |
188 SanitizerKind::Undefined | SanitizerKind::FloatDivideByZero;
193 #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.