Author: Qinkun Bao
Date: 2025-05-23T20:23:13-04:00
New Revision: e9dbf31be5475a691fca26e56ba8b27337ba31b6

URL: 
https://github.com/llvm/llvm-project/commit/e9dbf31be5475a691fca26e56ba8b27337ba31b6
DIFF: 
https://github.com/llvm/llvm-project/commit/e9dbf31be5475a691fca26e56ba8b27337ba31b6.diff

LOG: [NFCI][Sanitizer] Convert Matcher::Globs from StringMap to vector. 
(#140964)

As discussed in https://github.com/llvm/llvm-project/pull/139772 and
https://github.com/llvm/llvm-project/pull/140529, Matcher::Globs can
keep the order when parsing the case list.

Added: 
    

Modified: 
    clang/lib/Basic/Diagnostic.cpp
    llvm/include/llvm/Support/SpecialCaseList.h
    llvm/lib/Support/SpecialCaseList.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index 22821418c7078..5dc5991a294e3 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -553,7 +553,12 @@ void 
WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
     // Each section has a matcher with that section's name, attached to that
     // line.
     const auto &DiagSectionMatcher = Entry.SectionMatcher;
-    unsigned DiagLine = DiagSectionMatcher->Globs.at(DiagName).second;
+    unsigned DiagLine = 0;
+    for (const auto &Glob : DiagSectionMatcher->Globs)
+      if (Glob->Name == DiagName) {
+        DiagLine = Glob->LineNo;
+        break;
+      }
     LineAndSectionEntry.emplace_back(DiagLine, &Entry);
   }
   llvm::sort(LineAndSectionEntry);
@@ -625,12 +630,12 @@ bool WarningsSpecialCaseList::globsMatches(
     StringRef Category = Entry.getKey();
     const llvm::SpecialCaseList::Matcher &Matcher = Entry.getValue();
     bool IsPositive = Category != "emit";
-    for (const auto &[Pattern, Glob] : Matcher.Globs) {
-      if (Pattern.size() < LongestMatch.size())
+    for (const auto &Glob : Matcher.Globs) {
+      if (Glob->Name.size() < LongestMatch.size())
         continue;
-      if (!Glob.first.match(FilePath))
+      if (!Glob->Pattern.match(FilePath))
         continue;
-      LongestMatch = Pattern;
+      LongestMatch = Glob->Name;
       LongestIsPositive = IsPositive;
     }
   }

diff  --git a/llvm/include/llvm/Support/SpecialCaseList.h 
b/llvm/include/llvm/Support/SpecialCaseList.h
index fc6dc93651f38..653a3b14ebf03 100644
--- a/llvm/include/llvm/Support/SpecialCaseList.h
+++ b/llvm/include/llvm/Support/SpecialCaseList.h
@@ -125,7 +125,17 @@ class SpecialCaseList {
     // Returns zero if no match is found.
     LLVM_ABI unsigned match(StringRef Query) const;
 
-    StringMap<std::pair<GlobPattern, unsigned>> Globs;
+    struct Glob {
+      std::string Name;
+      unsigned LineNo;
+      GlobPattern Pattern;
+      // neither copyable nor movable because GlobPattern contains
+      // Glob::StringRef that points to Glob::Name.
+      Glob(Glob &&) = delete;
+      Glob() = default;
+    };
+
+    std::vector<std::unique_ptr<Matcher::Glob>> Globs;
     std::vector<std::pair<std::unique_ptr<Regex>, unsigned>> RegExes;
   };
 

diff  --git a/llvm/lib/Support/SpecialCaseList.cpp 
b/llvm/lib/Support/SpecialCaseList.cpp
index dddf84cbb1ced..47ff3e24706a4 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -53,24 +53,22 @@ Error SpecialCaseList::Matcher::insert(StringRef Pattern, 
unsigned LineNumber,
     return Error::success();
   }
 
-  auto [It, DidEmplace] = Globs.try_emplace(Pattern);
-  if (DidEmplace) {
-    // We must be sure to use the string in the map rather than the provided
-    // reference which could be destroyed before match() is called
-    Pattern = It->getKey();
-    auto &Pair = It->getValue();
-    if (auto Err = GlobPattern::create(Pattern, /*MaxSubPatterns=*/1024)
-                       .moveInto(Pair.first))
-      return Err;
-    Pair.second = LineNumber;
-  }
+  auto Glob = std::make_unique<Matcher::Glob>();
+  Glob->Name = Pattern.str();
+  Glob->LineNo = LineNumber;
+  // We must be sure to use the string in `Glob` rather than the provided
+  // reference which could be destroyed before match() is called
+  if (auto Err = GlobPattern::create(Glob->Name, /*MaxSubPatterns=*/1024)
+                     .moveInto(Glob->Pattern))
+    return Err;
+  Globs.push_back(std::move(Glob));
   return Error::success();
 }
 
 unsigned SpecialCaseList::Matcher::match(StringRef Query) const {
-  for (const auto &[Pattern, Pair] : Globs)
-    if (Pair.first.match(Query))
-      return Pair.second;
+  for (const auto &Glob : Globs)
+    if (Glob->Pattern.match(Query))
+      return Glob->LineNo;
   for (const auto &[Regex, LineNumber] : RegExes)
     if (Regex->match(Query))
       return LineNumber;


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to