[clang] dd4a730 - [NFCI][Sanitizer] Convert SpecialCaseList::Sections from StringMap to vector.
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 16 12:32:59 PDT 2025
Author: Qinkun Bao
Date: 2025-05-16T15:32:54-04:00
New Revision: dd4a73069c289985afc1ccfd0c512e5791ede404
URL: https://github.com/llvm/llvm-project/commit/dd4a73069c289985afc1ccfd0c512e5791ede404
DIFF: https://github.com/llvm/llvm-project/commit/dd4a73069c289985afc1ccfd0c512e5791ede404.diff
LOG: [NFCI][Sanitizer] Convert SpecialCaseList::Sections from StringMap to vector.
As discussed in https://github.com/llvm/llvm-project/pull/139772, SpecialCaseList::Sections can keep the order of Sections when parsing the case list.
Reviewers: thurstond, vitalybuka
Reviewed By: vitalybuka
Pull Request: https://github.com/llvm/llvm-project/pull/140127
Added:
Modified:
clang/lib/Basic/Diagnostic.cpp
clang/lib/Basic/ProfileList.cpp
clang/lib/Basic/SanitizerSpecialCaseList.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 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..2dbf04c6ede97 100644
--- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp
+++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
@@ -37,8 +37,7 @@ SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths,
}
void SanitizerSpecialCaseList::createSanitizerSections() {
- for (auto &It : Sections) {
- auto &S = It.second;
+ for (auto &S : Sections) {
SanitizerMask Mask;
#define SANITIZER(NAME, ID) \
diff --git a/llvm/include/llvm/Support/SpecialCaseList.h b/llvm/include/llvm/Support/SpecialCaseList.h
index ca2030abdc1f5..fc6dc93651f38 100644
--- a/llvm/include/llvm/Support/SpecialCaseList.h
+++ b/llvm/include/llvm/Support/SpecialCaseList.h
@@ -132,14 +132,15 @@ 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) : SectionMatcher(std::move(M)) {};
+ Section() : Section(std::make_unique<Matcher>()) {};
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 +155,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..335965f80d830 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -132,14 +132,17 @@ 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();
+ auto &Section = Sections.back();
+ Section.SectionStr = SectionStr;
+
+ 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;
}
@@ -212,8 +215,7 @@ bool SpecialCaseList::inSection(StringRef Section, StringRef Prefix,
unsigned SpecialCaseList::inSectionBlame(StringRef Section, StringRef Prefix,
StringRef Query,
StringRef Category) const {
- for (const auto &It : Sections) {
- const auto &S = It.getValue();
+ for (const auto &S : Sections) {
if (S.SectionMatcher->match(Section)) {
unsigned Blame = inSectionBlame(S.Entries, Prefix, Query, Category);
if (Blame)
More information about the cfe-commits
mailing list