[clang] [sanitizer] Parse weighted sanitizer args and -fno-sanitize-top-hot (PR #121619)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 3 19:04:36 PST 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff 4075ddad7183e6f0b66e2c8cc7a03b461a8038e6 ca1fabc5ea75af0acdd1969c0ad505e04103e1c9 --extensions h,cpp -- clang/include/clang/Basic/CodeGenOptions.h clang/include/clang/Basic/Sanitizers.h clang/include/clang/Driver/SanitizerArgs.h clang/lib/Basic/Sanitizers.cpp clang/lib/Driver/SanitizerArgs.cpp clang/lib/Frontend/CompilerInvocation.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h
index f69f52e49a..39eabe0b1e 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -385,7 +385,8 @@ public:
SanitizerSet SanitizeMergeHandlers;
/// Set of top hotness thresholds, specifying the fraction of code that is
- /// excluded from sanitization (0 = skip none, 0.1 = skip hottest 10%, 1.0 = skip all).
+ /// excluded from sanitization (0 = skip none, 0.1 = skip hottest 10%, 1.0 =
+ /// skip all).
SanitizerMaskWeights NoSanitizeTopHot = {0};
/// List of backend command-line options for -fembed-bitcode.
diff --git a/clang/include/clang/Basic/Sanitizers.h b/clang/include/clang/Basic/Sanitizers.h
index fa6b557819..f179fe5027 100644
--- a/clang/include/clang/Basic/Sanitizers.h
+++ b/clang/include/clang/Basic/Sanitizers.h
@@ -194,13 +194,15 @@ SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups);
/// The relevant weight(s) are updated in the passed array.
/// Individual weights are never reset to zero unless explicitly set
/// (e.g., 'null=0.0').
-SanitizerMask parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskWeights Weights);
+SanitizerMask parseSanitizerWeightedValue(StringRef Value, bool AllowGroups,
+ SanitizerMaskWeights Weights);
/// Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
void serializeSanitizerSet(SanitizerSet Set,
SmallVectorImpl<StringRef> &Values);
-/// Serialize a SanitizerMaskWeights into values for -fsanitize= or -fno-sanitize=.
+/// Serialize a SanitizerMaskWeights into values for -fsanitize= or
+/// -fno-sanitize=.
void serializeSanitizerMaskWeights(const SanitizerMaskWeights Weights,
SmallVectorImpl<StringRef> &Values);
diff --git a/clang/lib/Basic/Sanitizers.cpp b/clang/lib/Basic/Sanitizers.cpp
index adfab2d3af..c0e08ccfcd 100644
--- a/clang/lib/Basic/Sanitizers.cpp
+++ b/clang/lib/Basic/Sanitizers.cpp
@@ -36,31 +36,34 @@ SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) {
return ParsedKind;
}
-SanitizerMask clang::parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskWeights Weights) {
+SanitizerMask clang::parseSanitizerWeightedValue(StringRef Value,
+ bool AllowGroups,
+ SanitizerMaskWeights Weights) {
SanitizerMask ParsedKind = llvm::StringSwitch<SanitizerMask>(Value)
-#define SANITIZER(NAME, ID) .StartsWith(NAME"=", SanitizerKind::ID)
+#define SANITIZER(NAME, ID) .StartsWith(NAME "=", SanitizerKind::ID)
#define SANITIZER_GROUP(NAME, ID, ALIAS) \
- .StartsWith(NAME"=", AllowGroups ? SanitizerKind::ID##Group : SanitizerMask())
+ .StartsWith(NAME "=", \
+ AllowGroups ? SanitizerKind::ID##Group : SanitizerMask())
#include "clang/Basic/Sanitizers.def"
- .Default(SanitizerMask());
+ .Default(SanitizerMask());
if (ParsedKind && Weights) {
- size_t equalsIndex = Value.find_first_of('=');
- if (equalsIndex != llvm::StringLiteral::npos) {
- double arg;
- if ( (Value.size() > (equalsIndex + 1))
- && !Value.substr(equalsIndex + 1).getAsDouble(arg)) {
- // AllowGroups is already taken into account for ParsedKind,
- // hence we unconditionally expandSanitizerGroups.
- SanitizerMask ExpandedKind = expandSanitizerGroups(ParsedKind);
-
- for (unsigned int i = 0; i < SanitizerKind::SO_Count; i++) {
- if(ExpandedKind & SanitizerMask::bitPosToMask(i)) {
- Weights[i] = arg;
- }
- }
+ size_t equalsIndex = Value.find_first_of('=');
+ if (equalsIndex != llvm::StringLiteral::npos) {
+ double arg;
+ if ((Value.size() > (equalsIndex + 1)) &&
+ !Value.substr(equalsIndex + 1).getAsDouble(arg)) {
+ // AllowGroups is already taken into account for ParsedKind,
+ // hence we unconditionally expandSanitizerGroups.
+ SanitizerMask ExpandedKind = expandSanitizerGroups(ParsedKind);
+
+ for (unsigned int i = 0; i < SanitizerKind::SO_Count; i++) {
+ if (ExpandedKind & SanitizerMask::bitPosToMask(i)) {
+ Weights[i] = arg;
}
+ }
}
+ }
}
return ParsedKind;
@@ -75,10 +78,11 @@ void clang::serializeSanitizerSet(SanitizerSet Set,
}
void clang::serializeSanitizerMaskWeights(const SanitizerMaskWeights Weights,
- SmallVectorImpl<StringRef> &Values) {
+ SmallVectorImpl<StringRef> &Values) {
#define SANITIZER(NAME, ID) \
- if (Weights[SanitizerKind::SO_##ID]) \
- Values.push_back(std::string(NAME) + "=" + std::to_string(Weights[SanitizerKind::SO_##ID]));
+ if (Weights[SanitizerKind::SO_##ID]) \
+ Values.push_back(std::string(NAME) + "=" + \
+ std::to_string(Weights[SanitizerKind::SO_##ID]));
#include "clang/Basic/Sanitizers.def"
}
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 0f500ca14c..bac24dc824 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -111,7 +111,8 @@ enum BinaryMetadataFeature {
/// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any
/// invalid components. Returns a SanitizerMask.
static SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
- bool DiagnoseErrors, SanitizerMaskWeights Weights);
+ bool DiagnoseErrors,
+ SanitizerMaskWeights Weights);
/// Parse -f(no-)?sanitize-coverage= flag values, diagnosing any invalid
/// components. Returns OR of members of \c CoverageFeature enumeration.
@@ -722,7 +723,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
MergeKinds &= Kinds;
// Parse -fno-sanitize-top-hot flags
- SanitizerMask HotMask = parseNoSanitizeHotArgs (D, Args, DiagnoseErrors, TopHot);
+ SanitizerMask HotMask =
+ parseNoSanitizeHotArgs(D, Args, DiagnoseErrors, TopHot);
(void)HotMask;
// Setup ignorelist files.
@@ -1147,8 +1149,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// Zero out TopHot for unused sanitizers
for (unsigned int i = 0; i < SanitizerKind::SO_Count; i++) {
- if (!(Sanitizers.Mask & SanitizerMask::bitPosToMask(i)))
- TopHot[i] = 0;
+ if (!(Sanitizers.Mask & SanitizerMask::bitPosToMask(i)))
+ TopHot[i] = 0;
}
}
@@ -1167,10 +1169,11 @@ static std::string toString(const clang::SanitizerSet &Sanitizers) {
static std::string toString(const clang::SanitizerMaskWeights &Weights) {
std::string Res;
#define SANITIZER(NAME, ID) \
- if (Weights[SanitizerKind::SO_##ID]) { \
+ if (Weights[SanitizerKind::SO_##ID]) { \
if (!Res.empty()) \
Res += ","; \
- Res += std::string(NAME) + "=" + std::to_string(Weights[SanitizerKind::SO_##ID]); \
+ Res += std::string(NAME) + "=" + \
+ std::to_string(Weights[SanitizerKind::SO_##ID]); \
}
#include "clang/Basic/Sanitizers.def"
return Res;
@@ -1329,8 +1332,7 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
std::string TopHotStr = toString(TopHot);
if (TopHotStr != "")
- CmdArgs.push_back(
- Args.MakeArgString("-fno-sanitize-top-hot=" + TopHotStr));
+ CmdArgs.push_back(Args.MakeArgString("-fno-sanitize-top-hot=" + TopHotStr));
addSpecialCaseListOpt(Args, CmdArgs,
"-fsanitize-ignorelist=", UserIgnorelistFiles);
@@ -1498,18 +1500,18 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
}
SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
- bool DiagnoseErrors, SanitizerMaskWeights Weights) {
- assert(
- (A->getOption().matches(options::OPT_fsanitize_EQ) ||
- A->getOption().matches(options::OPT_fno_sanitize_EQ) ||
- A->getOption().matches(options::OPT_fsanitize_recover_EQ) ||
- A->getOption().matches(options::OPT_fno_sanitize_recover_EQ) ||
- A->getOption().matches(options::OPT_fsanitize_trap_EQ) ||
- A->getOption().matches(options::OPT_fno_sanitize_trap_EQ) ||
- A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) ||
- A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ) ||
- A->getOption().matches(options::OPT_fno_sanitize_top_hot_EQ)) &&
- "Invalid argument in parseArgValues!");
+ bool DiagnoseErrors,
+ SanitizerMaskWeights Weights) {
+ assert((A->getOption().matches(options::OPT_fsanitize_EQ) ||
+ A->getOption().matches(options::OPT_fno_sanitize_EQ) ||
+ A->getOption().matches(options::OPT_fsanitize_recover_EQ) ||
+ A->getOption().matches(options::OPT_fno_sanitize_recover_EQ) ||
+ A->getOption().matches(options::OPT_fsanitize_trap_EQ) ||
+ A->getOption().matches(options::OPT_fno_sanitize_trap_EQ) ||
+ A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) ||
+ A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ) ||
+ A->getOption().matches(options::OPT_fno_sanitize_top_hot_EQ)) &&
+ "Invalid argument in parseArgValues!");
SanitizerMask Kinds;
for (int i = 0, n = A->getNumValues(); i != n; ++i) {
const char *Value = A->getValue(i);
@@ -1519,7 +1521,9 @@ SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
0 == strcmp("all", Value))
Kind = SanitizerMask();
else if (A->getOption().matches(options::OPT_fno_sanitize_top_hot_EQ)) {
- assert(Weights && "Null weights parameter provided for parsing fno_sanitize_top_hot!");
+ assert(
+ Weights &&
+ "Null weights parameter provided for parsing fno_sanitize_top_hot!");
Kind = parseSanitizerWeightedValue(Value, /*AllowGroups=*/true, Weights);
} else {
assert((!Weights) && "Non-null weights parameter erroneously provided!");
``````````
</details>
https://github.com/llvm/llvm-project/pull/121619
More information about the cfe-commits
mailing list