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) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits