14 #ifndef LLVM_CLANG_BASIC_SANITIZERS_H
15 #define LLVM_CLANG_BASIC_SANITIZERS_H
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Support/HashBuilder.h"
20 #include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
40 static constexpr
unsigned kNumElem = 2;
44 static constexpr
unsigned kNumBits =
sizeof(decltype(maskLoToHigh)) * 8;
46 static constexpr
unsigned kNumBitElem =
sizeof(decltype(maskLoToHigh[0])) * 8;
49 : maskLoToHigh{mask1, mask2} {}
55 return Pos < kNumBits;
60 uint64_t mask1 = (Pos < kNumBitElem) ? 1ULL << (Pos % kNumBitElem) : 0;
61 uint64_t mask2 = (Pos >= kNumBitElem && Pos < (kNumBitElem * 2))
62 ? 1ULL << (Pos % kNumBitElem)
70 for (
auto &Val : maskLoToHigh)
80 template <
typename HasherT, llvm::endianness Endianness>
81 friend void addHash(llvm::HashBuilder<HasherT, Endianness> &HBuilder,
83 HBuilder.addRange(&
SM.maskLoToHigh[0], &
SM.maskLoToHigh[kNumElem]);
86 constexpr
explicit operator bool()
const {
87 return maskLoToHigh[0] || maskLoToHigh[1];
91 return maskLoToHigh[0] ==
V.maskLoToHigh[0] &&
92 maskLoToHigh[1] ==
V.maskLoToHigh[1];
96 for (
unsigned k = 0; k < kNumElem; k++)
97 maskLoToHigh[k] &= RHS.maskLoToHigh[k];
102 for (
unsigned k = 0; k < kNumElem; k++)
103 maskLoToHigh[k] |= RHS.maskLoToHigh[k];
110 return !((*this) == RHS);
120 a.maskLoToHigh[1] &
b.maskLoToHigh[1]);
126 a.maskLoToHigh[1] |
b.maskLoToHigh[1]);
139 #define SANITIZER(NAME, ID) SO_##ID,
140 #define SANITIZER_GROUP(NAME, ID, ALIAS) SO_##ID##Group,
141 #include "clang/Basic/Sanitizers.def"
145 #define SANITIZER(NAME, ID) \
146 static constexpr SanitizerMask ID = SanitizerMask::bitPosToMask(SO_##ID); \
147 static_assert(SanitizerMask::checkBitPos(SO_##ID), "Bit position too big.");
148 #define SANITIZER_GROUP(NAME, ID, ALIAS) \
149 static constexpr SanitizerMask ID = SanitizerMask(ALIAS); \
150 static constexpr SanitizerMask ID##Group = \
151 SanitizerMask::bitPosToMask(SO_##ID##Group); \
152 static_assert(SanitizerMask::checkBitPos(SO_##ID##Group), \
153 "Bit position too big.");
154 #include "clang/Basic/Sanitizers.def"
160 assert(K.
isPowerOf2() &&
"Has to be a single sanitizer.");
161 return static_cast<bool>(
Mask & K);
169 assert(K.
isPowerOf2() &&
"Has to be a single sanitizer.");
199 return SanitizerKind::CFI | SanitizerKind::Integer |
209 llvm::AsanDetectStackUseAfterReturnMode mode);
211 llvm::AsanDetectStackUseAfterReturnMode
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
friend void addHash(llvm::HashBuilder< HasherT, Endianness > &HBuilder, const SanitizerMask &SM)
constexpr bool operator==(const SanitizerMask &V) const
constexpr bool operator!() const
llvm::hash_code hash_value() const
SanitizerMask & operator|=(const SanitizerMask &RHS)
constexpr friend SanitizerMask operator|(SanitizerMask a, const SanitizerMask &b)
static constexpr bool checkBitPos(const unsigned Pos)
constexpr friend SanitizerMask operator~(SanitizerMask v)
SanitizerMask & operator&=(const SanitizerMask &RHS)
unsigned countPopulation() const
constexpr friend SanitizerMask operator&(SanitizerMask a, const SanitizerMask &b)
constexpr bool operator!=(const SanitizerMask &RHS) const
static constexpr SanitizerMask bitPosToMask(const unsigned Pos)
Create a mask with a bit enabled at position Pos.
constexpr XRayInstrMask All
unsigned kind
All of the diagnostics that can be emitted by the frontend.
The JSON file list parser is used to communicate input to InstallAPI.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
StringRef AsanDtorKindToString(llvm::AsanDtorKind kind)
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
SanitizerMask expandSanitizerGroups(SanitizerMask Kinds)
For each sanitizer group bit set in Kinds, set the bits for sanitizers this group enables.
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
llvm::hash_code hash_value(const CustomizableOptional< T > &O)
llvm::AsanDtorKind AsanDtorKindFromString(StringRef kind)
llvm::AsanDetectStackUseAfterReturnMode AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr)
StringRef AsanDetectStackUseAfterReturnModeToString(llvm::AsanDetectStackUseAfterReturnMode mode)
Diagnostic wrappers for TextAPI types for error reporting.
void set(SanitizerMask K)
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool empty() const
Returns true if no sanitizers are enabled.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.