14#include "llvm/ADT/Hashing.h"
15#include "llvm/ADT/StringSwitch.h"
16#include "llvm/Support/Format.h"
17#include "llvm/Support/raw_ostream.h"
45std::optional<std::vector<unsigned>>
47 std::vector<unsigned> ScaledCutoffs;
49 bool AnyCutoff =
false;
53 ScaledCutoffs.push_back(
lround(std::clamp(*
C, 0.0, 1.0) * ScalingFactor));
56 ScaledCutoffs.push_back(0);
68#define SANITIZER(NAME, ID) constexpr SanitizerMask SanitizerKind::ID;
69#define SANITIZER_GROUP(NAME, ID, ALIAS) \
70 constexpr SanitizerMask SanitizerKind::ID; \
71 constexpr SanitizerMask SanitizerKind::ID##Group;
72#include "clang/Basic/Sanitizers.def"
76#define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID)
77#define SANITIZER_GROUP(NAME, ID, ALIAS) \
78 .Case(NAME, AllowGroups ? SanitizerKind::ID##Group : SanitizerMask())
79#include "clang/Basic/Sanitizers.def"
87#define SANITIZER(NAME, ID) .StartsWith(NAME "=", SanitizerKind::ID)
88#define SANITIZER_GROUP(NAME, ID, ALIAS) \
89 .StartsWith(NAME "=", \
90 AllowGroups ? SanitizerKind::ID##Group : SanitizerMask())
91#include "clang/Basic/Sanitizers.def"
96 auto [N, W] =
Value.split(
'=');
98 if (W.getAsDouble(A) || A < 0.0 || A > 1.0)
108#define SANITIZER(NAME, ID) \
109 if (Set.has(SanitizerKind::ID)) \
110 Values.push_back(NAME);
111#include "clang/Basic/Sanitizers.def"
116#define SANITIZER(NAME, ID) \
117 if (auto C = Cutoffs[SanitizerKind::SO_##ID]) { \
119 llvm::raw_string_ostream OS(Str); \
120 OS << NAME "=" << llvm::format("%.8f", *C); \
121 Values.emplace_back(StringRef(Str).rtrim('0')); \
123#include "clang/Basic/Sanitizers.def"
127#define SANITIZER(NAME, ID)
128#define SANITIZER_GROUP(NAME, ID, ALIAS) \
129 if (Kinds & SanitizerKind::ID##Group) \
130 Kinds |= SanitizerKind::ID;
131#include "clang/Basic/Sanitizers.def"
136 return llvm::hash_combine_range(&maskLoToHigh[0], &maskLoToHigh[kNumElem]);
142 for (
const auto &Val : maskLoToHigh)
143 total += llvm::popcount(Val);
153 case llvm::AsanDtorKind::None:
155 case llvm::AsanDtorKind::Global:
157 case llvm::AsanDtorKind::Invalid:
164 return llvm::StringSwitch<llvm::AsanDtorKind>(kindStr)
165 .Case(
"none", llvm::AsanDtorKind::None)
166 .Case(
"global", llvm::AsanDtorKind::Global)
167 .Default(llvm::AsanDtorKind::Invalid);
171 llvm::AsanDetectStackUseAfterReturnMode mode) {
173 case llvm::AsanDetectStackUseAfterReturnMode::Always:
175 case llvm::AsanDetectStackUseAfterReturnMode::Runtime:
177 case llvm::AsanDetectStackUseAfterReturnMode::Never:
179 case llvm::AsanDetectStackUseAfterReturnMode::Invalid:
185llvm::AsanDetectStackUseAfterReturnMode
187 return llvm::StringSwitch<llvm::AsanDetectStackUseAfterReturnMode>(modeStr)
188 .Case(
"always", llvm::AsanDetectStackUseAfterReturnMode::Always)
189 .Case(
"runtime", llvm::AsanDetectStackUseAfterReturnMode::Runtime)
190 .Case(
"never", llvm::AsanDetectStackUseAfterReturnMode::Never)
191 .Default(llvm::AsanDetectStackUseAfterReturnMode::Invalid);
static const double SanitizerMaskCutoffsEps
Defines the clang::SanitizerKind enum.
void clear(SanitizerMask K=SanitizerKind::All)
void set(SanitizerMask K, double V)
std::optional< double > operator[](unsigned Kind) const
std::optional< std::vector< unsigned > > getAllScaled(unsigned ScalingFactor) const
llvm::hash_code hash_value() const
unsigned countPopulation() const
static constexpr SanitizerMask bitPosToMask(const unsigned Pos)
Create a mask with a bit enabled at position Pos.
The JSON file list parser is used to communicate input to InstallAPI.
StringRef AsanDtorKindToString(llvm::AsanDtorKind kind)
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
SanitizerMask expandSanitizerGroups(SanitizerMask Kinds)
For each sanitizer group bit set in Kinds, set the bits for sanitizers this group enables.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into command line arguments.
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)