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