https://github.com/qinkunbao updated 
https://github.com/llvm/llvm-project/pull/140127

>From 4628b851c94c83c3d8fdbaa650a5c2aedf35d26c Mon Sep 17 00:00:00 2001
From: Qinkun Bao <qin...@google.com>
Date: Thu, 15 May 2025 19:28:42 +0000
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
 =?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.6
---
 clang/lib/Basic/Diagnostic.cpp               | 18 +++++++-----
 clang/lib/Basic/ProfileList.cpp              |  2 +-
 clang/lib/Basic/SanitizerSpecialCaseList.cpp |  5 ++--
 llvm/include/llvm/Support/SpecialCaseList.h  | 10 ++++---
 llvm/lib/Support/SpecialCaseList.cpp         | 29 +++++++++++---------
 5 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index 538c1d18a8ac1..586273ab88bd3 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -533,16 +533,20 @@ void 
WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
   // Drop the default section introduced by special case list, we only support
   // exact diagnostic group names.
   // FIXME: We should make this configurable in the parser instead.
-  Sections.erase("*");
+  // FIXME: C++20 can use std::erase_if(Sections, [](Section &sec) { return
+  // sec.SectionStr == "*"; });
+  Sections.erase(
+      std::remove_if(Sections.begin(), Sections.end(),
+                     [](Section &sec) { return sec.SectionStr == "*"; }),
+      Sections.end());
   // Make sure we iterate sections by their line numbers.
-  std::vector<std::pair<unsigned, const llvm::StringMapEntry<Section> *>>
-      LineAndSectionEntry;
+  std::vector<std::pair<unsigned, const Section *>> LineAndSectionEntry;
   LineAndSectionEntry.reserve(Sections.size());
   for (const auto &Entry : Sections) {
-    StringRef DiagName = Entry.getKey();
+    StringRef DiagName = Entry.SectionStr;
     // Each section has a matcher with that section's name, attached to that
     // line.
-    const auto &DiagSectionMatcher = Entry.getValue().SectionMatcher;
+    const auto &DiagSectionMatcher = Entry.SectionMatcher;
     unsigned DiagLine = DiagSectionMatcher->Globs.at(DiagName).second;
     LineAndSectionEntry.emplace_back(DiagLine, &Entry);
   }
@@ -550,7 +554,7 @@ void 
WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
   static constexpr auto WarningFlavor = clang::diag::Flavor::WarningOrError;
   for (const auto &[_, SectionEntry] : LineAndSectionEntry) {
     SmallVector<diag::kind> GroupDiags;
-    StringRef DiagGroup = SectionEntry->getKey();
+    StringRef DiagGroup = SectionEntry->SectionStr;
     if (Diags.getDiagnosticIDs()->getDiagnosticsInGroup(
             WarningFlavor, DiagGroup, GroupDiags)) {
       StringRef Suggestion =
@@ -563,7 +567,7 @@ void 
WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
     for (diag::kind Diag : GroupDiags)
       // We're intentionally overwriting any previous mappings here to make 
sure
       // latest one takes precedence.
-      DiagToSection[Diag] = &SectionEntry->getValue();
+      DiagToSection[Diag] = SectionEntry;
   }
 }
 
diff --git a/clang/lib/Basic/ProfileList.cpp b/clang/lib/Basic/ProfileList.cpp
index 01b8d7a073432..f2383c76853ec 100644
--- a/clang/lib/Basic/ProfileList.cpp
+++ b/clang/lib/Basic/ProfileList.cpp
@@ -37,7 +37,7 @@ class ProfileSpecialCaseList : public llvm::SpecialCaseList {
 
   bool hasPrefix(StringRef Prefix) const {
     for (const auto &It : Sections)
-      if (It.second.Entries.count(Prefix) > 0)
+      if (It.Entries.count(Prefix) > 0)
         return true;
     return false;
   }
diff --git a/clang/lib/Basic/SanitizerSpecialCaseList.cpp 
b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
index b02e868cdaa44..8af46c74535ae 100644
--- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp
+++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
@@ -38,11 +38,10 @@ SanitizerSpecialCaseList::createOrDie(const 
std::vector<std::string> &Paths,
 
 void SanitizerSpecialCaseList::createSanitizerSections() {
   for (auto &It : Sections) {
-    auto &S = It.second;
     SanitizerMask Mask;
 
 #define SANITIZER(NAME, ID)                                                    
\
-  if (S.SectionMatcher->match(NAME))                                           
\
+  if (It.SectionMatcher->match(NAME))                                          
\
     Mask |= SanitizerKind::ID;
 #define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID)
 
@@ -50,7 +49,7 @@ void SanitizerSpecialCaseList::createSanitizerSections() {
 #undef SANITIZER
 #undef SANITIZER_GROUP
 
-    SanitizerSections.emplace_back(Mask, S.Entries);
+    SanitizerSections.emplace_back(Mask, It.Entries);
   }
 }
 
diff --git a/llvm/include/llvm/Support/SpecialCaseList.h 
b/llvm/include/llvm/Support/SpecialCaseList.h
index ca2030abdc1f5..4f4c097c7162a 100644
--- a/llvm/include/llvm/Support/SpecialCaseList.h
+++ b/llvm/include/llvm/Support/SpecialCaseList.h
@@ -132,14 +132,16 @@ class SpecialCaseList {
   using SectionEntries = StringMap<StringMap<Matcher>>;
 
   struct Section {
-    Section(std::unique_ptr<Matcher> M) : SectionMatcher(std::move(M)){};
-    Section() : Section(std::make_unique<Matcher>()) {}
+    Section(std::unique_ptr<Matcher> M, StringRef str)
+        : SectionMatcher(std::move(M)), SectionStr(SectionStr) {};
+    Section(StringRef str) : Section(std::make_unique<Matcher>(), str) {};
 
     std::unique_ptr<Matcher> SectionMatcher;
     SectionEntries Entries;
+    std::string SectionStr;
   };
 
-  StringMap<Section> Sections;
+  std::vector<Section> Sections;
 
   LLVM_ABI Expected<Section *> addSection(StringRef SectionStr, unsigned 
LineNo,
                                           bool UseGlobs = true);
@@ -154,6 +156,6 @@ class SpecialCaseList {
                                    StringRef Category) const;
 };
 
-}  // namespace llvm
+} // namespace llvm
 
 #endif // LLVM_SUPPORT_SPECIALCASELIST_H
diff --git a/llvm/lib/Support/SpecialCaseList.cpp 
b/llvm/lib/Support/SpecialCaseList.cpp
index 7a23421eaeb89..76c705c097aaa 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -132,14 +132,16 @@ bool SpecialCaseList::createInternal(const MemoryBuffer 
*MB,
 Expected<SpecialCaseList::Section *>
 SpecialCaseList::addSection(StringRef SectionStr, unsigned LineNo,
                             bool UseGlobs) {
-  auto [It, DidEmplace] = Sections.try_emplace(SectionStr);
-  auto &Section = It->getValue();
-  if (DidEmplace)
-    if (auto Err = Section.SectionMatcher->insert(SectionStr, LineNo, 
UseGlobs))
-      return createStringError(errc::invalid_argument,
-                               "malformed section at line " + Twine(LineNo) +
-                                   ": '" + SectionStr +
-                                   "': " + toString(std::move(Err)));
+  Sections.emplace_back(SectionStr);
+  auto &Section = Sections.back();
+
+  if (auto Err = Section.SectionMatcher->insert(SectionStr, LineNo, UseGlobs)) 
{
+    return createStringError(errc::invalid_argument,
+                             "malformed section at line " + Twine(LineNo) +
+                                 ": '" + SectionStr +
+                                 "': " + toString(std::move(Err)));
+  }
+
   return &Section;
 }
 
@@ -213,9 +215,8 @@ unsigned SpecialCaseList::inSectionBlame(StringRef Section, 
StringRef Prefix,
                                          StringRef Query,
                                          StringRef Category) const {
   for (const auto &It : Sections) {
-    const auto &S = It.getValue();
-    if (S.SectionMatcher->match(Section)) {
-      unsigned Blame = inSectionBlame(S.Entries, Prefix, Query, Category);
+    if (It.SectionMatcher->match(Section)) {
+      unsigned Blame = inSectionBlame(It.Entries, Prefix, Query, Category);
       if (Blame)
         return Blame;
     }
@@ -227,9 +228,11 @@ unsigned SpecialCaseList::inSectionBlame(const 
SectionEntries &Entries,
                                          StringRef Prefix, StringRef Query,
                                          StringRef Category) const {
   SectionEntries::const_iterator I = Entries.find(Prefix);
-  if (I == Entries.end()) return 0;
+  if (I == Entries.end())
+    return 0;
   StringMap<Matcher>::const_iterator II = I->second.find(Category);
-  if (II == I->second.end()) return 0;
+  if (II == I->second.end())
+    return 0;
 
   return II->getValue().match(Query);
 }

>From 716a389c97f7122647b6cb768c7d3863a44a2f4e Mon Sep 17 00:00:00 2001
From: Qinkun Bao <qin...@google.com>
Date: Fri, 16 May 2025 04:05:41 +0000
Subject: [PATCH 2/2] Convert SpecialCaseList::Sections from StringMap to
 vector.

Created using spr 1.3.6
---
 llvm/include/llvm/Support/SpecialCaseList.h | 5 ++---
 llvm/lib/Support/SpecialCaseList.cpp        | 3 ++-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/include/llvm/Support/SpecialCaseList.h 
b/llvm/include/llvm/Support/SpecialCaseList.h
index 4f4c097c7162a..fc6dc93651f38 100644
--- a/llvm/include/llvm/Support/SpecialCaseList.h
+++ b/llvm/include/llvm/Support/SpecialCaseList.h
@@ -132,9 +132,8 @@ class SpecialCaseList {
   using SectionEntries = StringMap<StringMap<Matcher>>;
 
   struct Section {
-    Section(std::unique_ptr<Matcher> M, StringRef str)
-        : SectionMatcher(std::move(M)), SectionStr(SectionStr) {};
-    Section(StringRef str) : Section(std::make_unique<Matcher>(), str) {};
+    Section(std::unique_ptr<Matcher> M) : SectionMatcher(std::move(M)) {};
+    Section() : Section(std::make_unique<Matcher>()) {};
 
     std::unique_ptr<Matcher> SectionMatcher;
     SectionEntries Entries;
diff --git a/llvm/lib/Support/SpecialCaseList.cpp 
b/llvm/lib/Support/SpecialCaseList.cpp
index 76c705c097aaa..9f044ced3a17c 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -132,8 +132,9 @@ bool SpecialCaseList::createInternal(const MemoryBuffer *MB,
 Expected<SpecialCaseList::Section *>
 SpecialCaseList::addSection(StringRef SectionStr, unsigned LineNo,
                             bool UseGlobs) {
-  Sections.emplace_back(SectionStr);
+  Sections.emplace_back();
   auto &Section = Sections.back();
+  Section.SectionStr = SectionStr;
 
   if (auto Err = Section.SectionMatcher->insert(SectionStr, LineNo, UseGlobs)) 
{
     return createStringError(errc::invalid_argument,

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

Reply via email to