[clang] [llvm] Convert SpecialCaseList::Sections from StringMap to vector. (PR #140127)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 15 12:29:23 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
@llvm/pr-subscribers-clang
Author: Qinkun Bao (qinkunbao)
<details>
<summary>Changes</summary>
In this way, SpecialCaseList::Sections can keep the order of Sections
when parsing the case list.
---
Full diff: https://github.com/llvm/llvm-project/pull/140127.diff
5 Files Affected:
- (modified) clang/lib/Basic/Diagnostic.cpp (+11-7)
- (modified) clang/lib/Basic/ProfileList.cpp (+1-1)
- (modified) clang/lib/Basic/SanitizerSpecialCaseList.cpp (+2-3)
- (modified) llvm/include/llvm/Support/SpecialCaseList.h (+6-4)
- (modified) llvm/lib/Support/SpecialCaseList.cpp (+16-13)
``````````diff
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);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/140127
More information about the cfe-commits
mailing list