[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