From 1946e68dab09b4eec02a742e61d2928abd5fc60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 29 May 2025 13:00:07 +0200 Subject: [PATCH 1/2] [clang][Basic] Optimize getDiagnosticSeverity() Try not to call getDiagInfo() as often and only do it if we really have to. --- clang/lib/Basic/DiagnosticIDs.cpp | 36 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index f01ff4df84e6a..ae1484519e812 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -543,26 +543,32 @@ DiagnosticIDs::getDiagnosticSeverity(unsigned DiagID, SourceLocation Loc, return Result; const auto &SM = Diag.getSourceManager(); - - bool ShowInSystemHeader = - IsCustomDiag - ? CustomDiagInfo->getDescription(DiagID).ShouldShowInSystemHeader() - : !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemHeader; - // If we are in a system header, we ignore it. We look at the diagnostic class // because we also want to ignore extensions and warnings in -Werror and // -pedantic-errors modes, which *map* warnings/extensions to errors. - if (State->SuppressSystemWarnings && !ShowInSystemHeader && Loc.isValid() && - SM.isInSystemHeader(SM.getExpansionLoc(Loc))) - return diag::Severity::Ignored; - + if (State->SuppressSystemWarnings && Loc.isValid() && + SM.isInSystemHeader(SM.getExpansionLoc(Loc))) { + bool ShowInSystemHeader = false; + if (IsCustomDiag) + ShowInSystemHeader = + CustomDiagInfo->getDescription(DiagID).ShouldShowInSystemHeader(); + else if (const StaticDiagInfoRec *Rec = GetDiagInfo(DiagID)) + ShowInSystemHeader = Rec->WarnShowInSystemHeader; + + if (!ShowInSystemHeader) + return diag::Severity::Ignored; + } // We also ignore warnings due to system macros - bool ShowInSystemMacro = - !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemMacro; - if (State->SuppressSystemWarnings && !ShowInSystemMacro && Loc.isValid() && - SM.isInSystemMacro(Loc)) - return diag::Severity::Ignored; + if (State->SuppressSystemWarnings && Loc.isValid() && + SM.isInSystemMacro(Loc)) { + + bool ShowInSystemMacro = false; + if (const StaticDiagInfoRec *Rec = GetDiagInfo(DiagID)) + ShowInSystemMacro = Rec->WarnShowInSystemMacro; + if (!ShowInSystemMacro) + return diag::Severity::Ignored; + } // Clang-diagnostics pragmas always take precedence over suppression mapping. if (!Mapping.isPragma() && Diag.isSuppressedViaMapping(DiagID, Loc)) return diag::Severity::Ignored; From 130122f17475978a9e8d7385daa130778cffa17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 29 May 2025 16:20:18 +0200 Subject: [PATCH 2/2] Fix default values --- clang/lib/Basic/DiagnosticIDs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index ae1484519e812..138bc7a22ce10 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -548,7 +548,7 @@ DiagnosticIDs::getDiagnosticSeverity(unsigned DiagID, SourceLocation Loc, // -pedantic-errors modes, which *map* warnings/extensions to errors. if (State->SuppressSystemWarnings && Loc.isValid() && SM.isInSystemHeader(SM.getExpansionLoc(Loc))) { - bool ShowInSystemHeader = false; + bool ShowInSystemHeader = true; if (IsCustomDiag) ShowInSystemHeader = CustomDiagInfo->getDescription(DiagID).ShouldShowInSystemHeader(); @@ -562,7 +562,7 @@ DiagnosticIDs::getDiagnosticSeverity(unsigned DiagID, SourceLocation Loc, if (State->SuppressSystemWarnings && Loc.isValid() && SM.isInSystemMacro(Loc)) { - bool ShowInSystemMacro = false; + bool ShowInSystemMacro = true; if (const StaticDiagInfoRec *Rec = GetDiagInfo(DiagID)) ShowInSystemMacro = Rec->WarnShowInSystemMacro;