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

Reply via email to