llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-support Author: Qinkun Bao (qinkunbao) <details> <summary>Changes</summary> In this way, SpecialCaseList::Sections can keep the order of Sections when parsing the case list. --- Patch is 23.43 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/140115.diff 5 Files Affected: - (modified) clang/lib/Basic/Diagnostic.cpp (+89-77) - (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..fcf86cc4c234c 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -67,12 +67,12 @@ const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB, return DB; } -static void DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT, - StringRef Modifier, StringRef Argument, - ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs, - SmallVectorImpl<char> &Output, - void *Cookie, - ArrayRef<intptr_t> QualTypeVals) { +static void +DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT, + StringRef Modifier, StringRef Argument, + ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs, + SmallVectorImpl<char> &Output, void *Cookie, + ArrayRef<intptr_t> QualTypeVals) { StringRef Str = "<can't format argument>"; Output.append(Str.begin(), Str.end()); } @@ -94,9 +94,7 @@ DiagnosticsEngine::~DiagnosticsEngine() { setClient(nullptr); } -void DiagnosticsEngine::dump() const { - DiagStatesByLoc.dump(*SourceMgr); -} +void DiagnosticsEngine::dump() const { DiagStatesByLoc.dump(*SourceMgr); } void DiagnosticsEngine::dump(StringRef DiagName) const { DiagStatesByLoc.dump(*SourceMgr, DiagName); @@ -259,7 +257,8 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr, bool PrintedOuterHeading = false; auto PrintOuterHeading = [&] { - if (PrintedOuterHeading) return; + if (PrintedOuterHeading) + return; PrintedOuterHeading = true; llvm::errs() << "File " << &File << " <FileID " << ID.getHashValue() @@ -272,8 +271,8 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr, llvm::errs() << " parent " << File.Parent << " <FileID " << Decomp.first.getHashValue() << "> "; SrcMgr.getLocForStartOfFile(Decomp.first) - .getLocWithOffset(Decomp.second) - .print(llvm::errs(), SrcMgr); + .getLocWithOffset(Decomp.second) + .print(llvm::errs(), SrcMgr); } if (File.HasLocalTransitions) llvm::errs() << " has_local_transitions"; @@ -286,14 +285,15 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr, for (DiagStatePoint &Transition : File.StateTransitions) { bool PrintedInnerHeading = false; auto PrintInnerHeading = [&] { - if (PrintedInnerHeading) return; + if (PrintedInnerHeading) + return; PrintedInnerHeading = true; PrintOuterHeading(); llvm::errs() << " "; SrcMgr.getLocForStartOfFile(ID) - .getLocWithOffset(Transition.Offset) - .print(llvm::errs(), SrcMgr); + .getLocWithOffset(Transition.Offset) + .print(llvm::errs(), SrcMgr); llvm::errs() << ": state " << Transition.State << ":\n"; }; @@ -316,11 +316,21 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr, llvm::errs() << ": "; switch (Mapping.second.getSeverity()) { - case diag::Severity::Ignored: llvm::errs() << "ignored"; break; - case diag::Severity::Remark: llvm::errs() << "remark"; break; - case diag::Severity::Warning: llvm::errs() << "warning"; break; - case diag::Severity::Error: llvm::errs() << "error"; break; - case diag::Severity::Fatal: llvm::errs() << "fatal"; break; + case diag::Severity::Ignored: + llvm::errs() << "ignored"; + break; + case diag::Severity::Remark: + llvm::errs() << "remark"; + break; + case diag::Severity::Warning: + llvm::errs() << "warning"; + break; + case diag::Severity::Error: + llvm::errs() << "error"; + break; + case diag::Severity::Fatal: + llvm::errs() << "fatal"; + break; } if (!Mapping.second.isUser()) @@ -533,16 +543,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 +564,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 +577,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; } } @@ -662,8 +676,8 @@ bool DiagnosticsEngine::EmitDiagnostic(const DiagnosticBuilder &DB, Diagnostic Info(this, DB); // Figure out the diagnostic level of this message. - DiagnosticIDs::Level DiagLevel - = Diags->getDiagnosticLevel(Info.getID(), Info.getLocation(), *this); + DiagnosticIDs::Level DiagLevel = + Diags->getDiagnosticLevel(Info.getID(), Info.getLocation(), *this); Emitted = (DiagLevel != DiagnosticIDs::Ignored); if (Emitted) { @@ -715,7 +729,7 @@ Diagnostic::Diagnostic(const DiagnosticsEngine *DO, SourceLocation DiagLoc, DiagnosticConsumer::~DiagnosticConsumer() = default; void DiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, - const Diagnostic &Info) { + const Diagnostic &Info) { if (!IncludeInDiagnosticCounts()) return; @@ -729,7 +743,7 @@ void DiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, template <std::size_t StrLen> static bool ModifierIs(const char *Modifier, unsigned ModifierLen, const char (&Str)[StrLen]) { - return StrLen-1 == ModifierLen && memcmp(Modifier, Str, StrLen-1) == 0; + return StrLen - 1 == ModifierLen && memcmp(Modifier, Str, StrLen - 1) == 0; } /// ScanForward - Scans forward, looking for the given character, skipping @@ -737,20 +751,25 @@ static bool ModifierIs(const char *Modifier, unsigned ModifierLen, static const char *ScanFormat(const char *I, const char *E, char Target) { unsigned Depth = 0; - for ( ; I != E; ++I) { - if (Depth == 0 && *I == Target) return I; - if (Depth != 0 && *I == '}') Depth--; + for (; I != E; ++I) { + if (Depth == 0 && *I == Target) + return I; + if (Depth != 0 && *I == '}') + Depth--; if (*I == '%') { I++; - if (I == E) break; + if (I == E) + break; // Escaped characters get implicitly skipped here. // Format specifier. if (!isDigit(*I) && !isPunctuation(*I)) { - for (I++; I != E && !isDigit(*I) && *I != '{'; I++) ; - if (I == E) break; + for (I++; I != E && !isDigit(*I) && *I != '{'; I++) + ; + if (I == E) + break; if (*I == '{') Depth++; } @@ -767,14 +786,15 @@ static const char *ScanFormat(const char *I, const char *E, char Target) { static void HandleSelectModifier(const Diagnostic &DInfo, unsigned ValNo, const char *Argument, unsigned ArgumentLen, SmallVectorImpl<char> &OutStr) { - const char *ArgumentEnd = Argument+ArgumentLen; + const char *ArgumentEnd = Argument + ArgumentLen; // Skip over 'ValNo' |'s. while (ValNo) { const char *NextVal = ScanFormat(Argument, ArgumentEnd, '|'); - assert(NextVal != ArgumentEnd && "Value for integer select modifier was" + assert(NextVal != ArgumentEnd && + "Value for integer select modifier was" " larger than the number of options in the diagnostic string!"); - Argument = NextVal+1; // Skip this string. + Argument = NextVal + 1; // Skip this string. --ValNo; } @@ -973,15 +993,13 @@ static const char *getTokenDescForDiagnostic(tok::TokenKind Kind) { /// FormatDiagnostic - Format this diagnostic into a string, substituting the /// formal arguments into the %0 slots. The result is appended onto the Str /// array. -void Diagnostic:: -FormatDiagnostic(SmallVectorImpl<char> &OutStr) const { +void Diagnostic::FormatDiagnostic(SmallVectorImpl<char> &OutStr) const { if (StoredDiagMessage.has_value()) { OutStr.append(StoredDiagMessage->begin(), StoredDiagMessage->end()); return; } - StringRef Diag = - getDiags()->getDiagnosticIDs()->getDescription(getID()); + StringRef Diag = getDiags()->getDiagnosticIDs()->getDescription(getID()); FormatDiagnostic(Diag.begin(), Diag.end(), OutStr); } @@ -1031,9 +1049,8 @@ void clang::EscapeStringForDiagnostic(StringRef Str, } } -void Diagnostic:: -FormatDiagnostic(const char *DiagStr, const char *DiagEnd, - SmallVectorImpl<char> &OutStr) const { +void Diagnostic::FormatDiagnostic(const char *DiagStr, const char *DiagEnd, + SmallVectorImpl<char> &OutStr) const { // When the diagnostic string is only "%0", the entire string is being given // by an outside source. Remove unprintable characters from this string // and skip all the other string processing. @@ -1067,7 +1084,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, DiagStr = StrEnd; continue; } else if (isPunctuation(DiagStr[1])) { - OutStr.push_back(DiagStr[1]); // %% -> %. + OutStr.push_back(DiagStr[1]); // %% -> %. DiagStr += 2; continue; } @@ -1086,10 +1103,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, // Check to see if we have a modifier. If so eat it. if (!isDigit(DiagStr[0])) { Modifier = DiagStr; - while (DiagStr[0] == '-' || - (DiagStr[0] >= 'a' && DiagStr[0] <= 'z')) + while (DiagStr[0] == '-' || (DiagStr[0] >= 'a' && DiagStr[0] <= 'z')) ++DiagStr; - ModifierLen = DiagStr-Modifier; + ModifierLen = DiagStr - Modifier; // If we have an argument, get it next. if (DiagStr[0] == '{') { @@ -1098,8 +1114,8 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, DiagStr = ScanFormat(DiagStr, DiagEnd, '}'); assert(DiagStr != DiagEnd && "Mismatched {}'s in diagnostic string!"); - ArgumentLen = DiagStr-Argument; - ++DiagStr; // Skip }. + ArgumentLen = DiagStr - Argument; + ++DiagStr; // Skip }. } } @@ -1113,7 +1129,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, if (ModifierIs(Modifier, ModifierLen, "diff")) { assert(*DiagStr == ',' && isDigit(*(DiagStr + 1)) && "Invalid format for diff modifier"); - ++DiagStr; // Comma. + ++DiagStr; // Comma. ArgNo2 = *DiagStr++ - '0'; DiagnosticsEngine::ArgumentKind Kind2 = getArgKind(ArgNo2); if (Kind == DiagnosticsEngine::ak_qualtype && @@ -1131,8 +1147,8 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, "Found too many '|'s in a %diff modifier!"); const char *FirstDollar = ScanFormat(Argument, Pipe, '$'); const char *SecondDollar = ScanFormat(FirstDollar + 1, Pipe, '$'); - const char ArgStr1[] = { '%', static_cast<char>('0' + ArgNo) }; - const char ArgStr2[] = { '%', static_cast<char>('0' + ArgNo2) }; + const char ArgStr1[] = {'%', static_cast<char>('0' + ArgNo)}; + const char ArgStr2[] = {'%', static_cast<char>('0' + ArgNo2)}; FormatDiagnostic(Argument, FirstDollar, OutStr); FormatDiagnostic(ArgStr1, ArgStr1 + 2, OutStr); FormatDiagnostic(FirstDollar + 1, SecondDollar, OutStr); @@ -1256,8 +1272,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, getDiags()->ConvertArgToString(Kind, getRawArg(ArgNo), StringRef(Modifier, ModifierLen), StringRef(Argument, ArgumentLen), - FormattedArgs, - OutStr, QualTypeVals); + FormattedArgs, OutStr, QualTypeVals); break; case DiagnosticsEngine::ak_qualtype_pair: { // Create a struct with all the info needed for printing. @@ -1280,8 +1295,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, getDiags()->ConvertArgToString(Kind, val, StringRef(Modifier, ModifierLen), StringRef(Argument, ArgumentLen), - FormattedArgs, - Tree, QualTypeVals); + FormattedArgs, Tree, QualTypeVals); // If there is no tree information, fall back to regular printing. if (!Tree.empty()) { FormatDiagnostic(Pipe + 1, ArgumentEnd, OutStr); @@ -1303,11 +1317,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, getDiags()->ConvertArgToString(Kind, val, StringRef(Modifier, ModifierLen), StringRef(Argument, ArgumentLen), - FormattedArgs, - OutStr, QualTypeVals); + FormattedArgs, OutStr, QualTypeVals); if (!TDT.TemplateDiffUsed) - FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype, - TDT.FromType)); + FormattedArgs.push_back( + std::make_pair(DiagnosticsEngine::ak_qualtype, TDT.FromType)); // Append middle text FormatDiagnostic(FirstDollar + 1, SecondDollar, OutStr); @@ -1317,11 +1330,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, getDiags()->ConvertArgToString(Kind, val, StringRef(Modifier, ModifierLen), StringRef(Argument, ArgumentLen), - FormattedArgs, - OutStr, QualTypeVals); + FormattedArgs, OutStr, QualTypeVals); if (!TDT.TemplateDiffUsed) - FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype, - TDT.ToType)); + FormattedArgs.push_back( + std::make_pair(DiagnosticsEngine::ak_qualtype, TDT.ToType)); // Append end text FormatDiagnostic(SecondDollar + 1, Pipe, OutStr); @@ -1337,8 +1349,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, else if (Kind != DiagnosticsEngine::ak_std_string) FormattedArgs.push_back(std::make_pair(Kind, getRawArg(ArgNo))); else - FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_c_string, - (intptr_t)getArgStdStr(ArgNo).c_str())); + FormattedArgs.push_back( + std::make_pair(DiagnosticsEngine::ak_c_string, + (intptr_t)getArgStdStr(ArgNo).c_str())); } // Append the type tree to the end of the diagnostics. @@ -1352,8 +1365,9 @@ StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level, unsigned ID, StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level, const Diagnostic &Info) : ID(Info.getID()), Level(Level) { - assert((Info.getLocation().isInvalid() || Info.hasSourceManager()) && - "Valid source location without setting a source manager for diagnostic"); + assert( + (Info.getLocation().isInvalid() || Info.hasSourceManager()) && + "Valid source location without setting a source manager for diagnostic"); if (Info.getLocation().isValid()) Loc = FullSourceLoc(Info.getLocation(), Info.getSourceManager()); SmallString<64> Message; @@ -1368,9 +1382,8 @@ StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level, unsigned ID, ArrayRef<CharSourceRange> Ranges, ArrayRef<FixItHint> FixIts) : ID(ID), Level(Level), Loc(Loc), Message(Message), - Ranges(Ranges.begin(), Ranges.end()), FixIts(FixIts.begin(), FixIts.end()) -{ -} + Ranges(Ranges.begin(), Ranges.end()), + FixIts(FixIts.begin(), FixIts.end()) {} llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS, const StoredDiagnostic &SD) { @@ -1391,8 +1404,7 @@ void IgnoringDiagConsumer::anchor() {} ForwardingDiagnosticConsumer::~ForwardingDiagnosticConsumer() = default; void ForwardingDiagnosticConsumer::HandleDiagnostic( - DiagnosticsEngine::Level DiagLevel, - const Diagnostic &Info) { + DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) { Target.HandleDiagnostic(DiagLevel, Info); } 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..1c1e51632bd8a 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... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/140115 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits