[clang] [llvm] [NFCI][Sanitizer] Convert SpecialCaseList::Sections from StringMap to vector. (PR #140127)
Qinkun Bao via cfe-commits
cfe-commits at lists.llvm.org
Fri May 16 08:22:11 PDT 2025
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 <qinkun at 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 <qinkun at 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,
More information about the cfe-commits
mailing list