https://github.com/bricknerb updated https://github.com/llvm/llvm-project/pull/112552
>From 8ff7b52319c5525a4ff26c324c283c6b0d249de3 Mon Sep 17 00:00:00 2001 From: Boaz Brickner <brick...@google.com> Date: Tue, 15 Oct 2024 14:46:59 +0000 Subject: [PATCH 1/5] [clang] Dedupliate the logic that only warns once when stack is almost full. Zero diff in behavior. --- clang/include/clang/Basic/Stack.h | 27 +++++++++++++++++++ clang/include/clang/Sema/Sema.h | 6 ++--- clang/include/clang/Serialization/ASTReader.h | 6 +++-- clang/lib/Basic/Stack.cpp | 20 ++++++++++++++ clang/lib/CodeGen/CodeGenModule.cpp | 12 ++------- clang/lib/CodeGen/CodeGenModule.h | 6 ++--- clang/lib/Sema/Sema.cpp | 12 ++------- clang/lib/Sema/SemaTemplateInstantiate.cpp | 3 +-- clang/lib/Serialization/ASTReader.cpp | 21 +++++++-------- clang/lib/Serialization/ASTReaderDecl.cpp | 3 +-- 10 files changed, 71 insertions(+), 45 deletions(-) diff --git a/clang/include/clang/Basic/Stack.h b/clang/include/clang/Basic/Stack.h index 30ebd94aedd1f7..64367d8519bf84 100644 --- a/clang/include/clang/Basic/Stack.h +++ b/clang/include/clang/Basic/Stack.h @@ -16,6 +16,8 @@ #include <cstddef> +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Compiler.h" @@ -50,6 +52,31 @@ namespace clang { Fn(); #endif } + +class SingleWarningStackAwareExecutor { +public: + SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) + : DiagsRef(diags) {} + + /// Run some code with "sufficient" stack space. (Currently, at least 256K + /// is guaranteed). Produces a warning if we're low on stack space and + /// allocates more in that case. Use this in code that may recurse deeply to + /// avoid stack overflow. + void runWithSufficientStackSpace(SourceLocation Loc, + llvm::function_ref<void()> Fn); + + /// Check to see if we're low on stack space and produce a warning if we're + /// low on stack space (Currently, at least 256Kis guaranteed). + void warnOnStackNearlyExhausted(SourceLocation Loc); + +private: + /// Warn that the stack is nearly exhausted. + void warnStackExhausted(SourceLocation Loc); + + DiagnosticsEngine &DiagsRef; + bool WarnedStackExhausted = false; +}; + } // end namespace clang #endif // LLVM_CLANG_BASIC_STACK_H diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 0faa5aed4eec3b..9c846f2b6b12f0 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -49,6 +49,7 @@ #include "clang/Basic/PragmaKinds.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" +#include "clang/Basic/Stack.h" #include "clang/Basic/TemplateKinds.h" #include "clang/Basic/TokenKinds.h" #include "clang/Basic/TypeTraits.h" @@ -546,9 +547,6 @@ class Sema final : public SemaBase { /// Print out statistics about the semantic analysis. void PrintStats() const; - /// Warn that the stack is nearly exhausted. - void warnStackExhausted(SourceLocation Loc); - /// Run some code with "sufficient" stack space. (Currently, at least 256K is /// guaranteed). Produces a warning if we're low on stack space and allocates /// more in that case. Use this in code that may recurse deeply (for example, @@ -1183,7 +1181,7 @@ class Sema final : public SemaBase { std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo; bool WarnedDarwinSDKInfoMissing = false; - bool WarnedStackExhausted = false; + SingleWarningStackAwareExecutor StackAwareExecutor; Sema(const Sema &) = delete; void operator=(const Sema &) = delete; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index ee4e897b248882..2c6251ce0190c6 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -19,6 +19,7 @@ #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/OpenCLOptions.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/Stack.h" #include "clang/Basic/Version.h" #include "clang/Lex/ExternalPreprocessorSource.h" #include "clang/Lex/HeaderSearch.h" @@ -445,7 +446,7 @@ class ASTReader DiagnosticsEngine &Diags; // Sema has duplicate logic, but SemaObj can sometimes be null so ASTReader // has its own version. - bool WarnedStackExhausted = false; + SingleWarningStackAwareExecutor StackAwareExecutor; /// The semantic analysis object that will be processing the /// AST files and the translation unit that uses it. @@ -2180,7 +2181,8 @@ class ASTReader /// Report a diagnostic. DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const; - void warnStackExhausted(SourceLocation Loc); + void runWithSufficientStackSpace(SourceLocation Loc, + llvm::function_ref<void()> Fn); IdentifierInfo *DecodeIdentifierInfo(serialization::IdentifierID ID); diff --git a/clang/lib/Basic/Stack.cpp b/clang/lib/Basic/Stack.cpp index aa15d8e66950fa..476612e281422b 100644 --- a/clang/lib/Basic/Stack.cpp +++ b/clang/lib/Basic/Stack.cpp @@ -72,3 +72,23 @@ void clang::runWithSufficientStackSpaceSlow(llvm::function_ref<void()> Diag, Fn(); }, DesiredStackSize); } + +void clang::SingleWarningStackAwareExecutor::runWithSufficientStackSpace( + SourceLocation Loc, llvm::function_ref<void()> Fn) { + clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); +} + +void clang::SingleWarningStackAwareExecutor::warnOnStackNearlyExhausted( + SourceLocation Loc) { + if (isStackNearlyExhausted()) + warnStackExhausted(Loc); +} + +void clang::SingleWarningStackAwareExecutor::warnStackExhausted( + SourceLocation Loc) { + // Only warn about this once. + if (!WarnedStackExhausted) { + DiagsRef.Report(Loc, diag::warn_stack_exhausted); + WarnedStackExhausted = true; + } +} diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index b05ab3606a698b..3153ec8a2d00e3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -341,7 +341,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, : Context(C), LangOpts(C.getLangOpts()), FS(FS), HeaderSearchOpts(HSO), PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags), Target(C.getTargetInfo()), ABI(createCXXABI(*this)), - VMContext(M.getContext()), VTables(*this), + VMContext(M.getContext()), VTables(*this), StackAwareExecutor(diags), SanitizerMD(new SanitizerMetadata(*this)) { // Initialize the type cache. @@ -1594,17 +1594,9 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) { getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; } -void CodeGenModule::warnStackExhausted(SourceLocation Loc) { - // Only warn about this once. - if (!WarnedStackExhausted) { - getDiags().Report(Loc, diag::warn_stack_exhausted); - WarnedStackExhausted = true; - } -} - void CodeGenModule::runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref<void()> Fn) { - clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); + StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); } llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index fa82a81b05dd53..f4de284369384e 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -26,6 +26,7 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/NoSanitizeList.h" #include "clang/Basic/ProfileList.h" +#include "clang/Basic/Stack.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/XRayLists.h" #include "clang/Lex/PreprocessorOptions.h" @@ -336,7 +337,7 @@ class CodeGenModule : public CodeGenTypeCache { std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader; InstrProfStats PGOStats; std::unique_ptr<llvm::SanitizerStatReport> SanStats; - bool WarnedStackExhausted = false; + SingleWarningStackAwareExecutor StackAwareExecutor; // A set of references that have only been seen via a weakref so far. This is // used to remove the weak of the reference if we ever see a direct reference @@ -1298,9 +1299,6 @@ class CodeGenModule : public CodeGenTypeCache { /// Print out an error that codegen doesn't support the specified decl yet. void ErrorUnsupported(const Decl *D, const char *Type); - /// Warn that the stack is nearly exhausted. - void warnStackExhausted(SourceLocation Loc); - /// Run some code with "sufficient" stack space. (Currently, at least 256K is /// guaranteed). Produces a warning if we're low on stack space and allocates /// more in that case. Use this in code that may recurse deeply to avoid stack diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index f0d1634af529f0..edb13226758ad9 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -220,7 +220,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, AnalysisWarnings(*this), ThreadSafetyDeclCache(nullptr), LateTemplateParser(nullptr), LateTemplateParserCleanup(nullptr), OpaqueParser(nullptr), CurContext(nullptr), ExternalSource(nullptr), - CurScope(nullptr), Ident_super(nullptr), + StackAwareExecutor(Diags), CurScope(nullptr), Ident_super(nullptr), AMDGPUPtr(std::make_unique<SemaAMDGPU>(*this)), ARMPtr(std::make_unique<SemaARM>(*this)), AVRPtr(std::make_unique<SemaAVR>(*this)), @@ -562,17 +562,9 @@ Sema::~Sema() { SemaPPCallbackHandler->reset(); } -void Sema::warnStackExhausted(SourceLocation Loc) { - // Only warn about this once. - if (!WarnedStackExhausted) { - Diag(Loc, diag::warn_stack_exhausted); - WarnedStackExhausted = true; - } -} - void Sema::runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref<void()> Fn) { - clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); + StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); } bool Sema::makeUnavailableInSystemHeader(SourceLocation loc, diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 8c7f694c09042e..8fb503c6f7e639 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -806,8 +806,7 @@ void Sema::pushCodeSynthesisContext(CodeSynthesisContext Ctx) { // Check to see if we're low on stack space. We can't do anything about this // from here, but we can at least warn the user. - if (isStackNearlyExhausted()) - warnStackExhausted(Ctx.PointOfInstantiation); + StackAwareExecutor.warnOnStackNearlyExhausted(Ctx.PointOfInstantiation); } void Sema::popCodeSynthesisContext() { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 1b2473f2457344..2d4f00f0aac7d2 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -64,6 +64,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/SourceManagerInternals.h" #include "clang/Basic/Specifiers.h" +#include "clang/Basic/Stack.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "clang/Basic/TokenKinds.h" @@ -9648,18 +9649,15 @@ DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { return Diags.Report(Loc, DiagID); } -void ASTReader::warnStackExhausted(SourceLocation Loc) { +void ASTReader::runWithSufficientStackSpace(SourceLocation Loc, + llvm::function_ref<void()> Fn) { // When Sema is available, avoid duplicate errors. if (SemaObj) { - SemaObj->warnStackExhausted(Loc); + SemaObj->runWithSufficientStackSpace(Loc, Fn); return; } - if (WarnedStackExhausted) - return; - WarnedStackExhausted = true; - - Diag(Loc, diag::warn_stack_exhausted); + StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); } /// Retrieve the identifier table associated with the @@ -10509,13 +10507,14 @@ ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, bool AllowConfigurationMismatch, bool ValidateSystemInputs, bool ValidateASTInputFilesContent, bool UseGlobalIndex, std::unique_ptr<llvm::Timer> ReadTimer) - : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) + : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH) ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) : cast<ASTReaderListener>(new PCHValidator(PP, *this))), SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), - PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), - ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, - PCHContainerRdr, PP.getHeaderSearchInfo()), + PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), + StackAwareExecutor(Diags), PP(PP), ContextObj(Context), + ModuleMgr(PP.getFileManager(), ModuleCache, PCHContainerRdr, + PP.getHeaderSearchInfo()), DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), DisableValidationKind(DisableValidationKind), AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 1ccc810f415eb4..d4e392dcc6bcd0 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -4168,8 +4168,7 @@ Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) { D->setDeclContext(Context.getTranslationUnitDecl()); // Reading some declarations can result in deep recursion. - clang::runWithSufficientStackSpace([&] { warnStackExhausted(DeclLoc); }, - [&] { Reader.Visit(D); }); + runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); }); // If this declaration is also a declaration context, get the // offsets for its tables of lexical and visible declarations. >From ce69fc6ff697901f6a0f9c08f40a9acfed6f82e1 Mon Sep 17 00:00:00 2001 From: Boaz Brickner <brick...@google.com> Date: Tue, 15 Oct 2024 15:05:19 +0000 Subject: [PATCH 2/5] [clang] Fix indentation of SingleWarningStackAwareExecutor --- clang/include/clang/Basic/Stack.h | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/clang/include/clang/Basic/Stack.h b/clang/include/clang/Basic/Stack.h index 64367d8519bf84..e9ea4335a5c142 100644 --- a/clang/include/clang/Basic/Stack.h +++ b/clang/include/clang/Basic/Stack.h @@ -53,29 +53,29 @@ namespace clang { #endif } -class SingleWarningStackAwareExecutor { -public: - SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) - : DiagsRef(diags) {} + class SingleWarningStackAwareExecutor { + public: + SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) + : DiagsRef(diags) {} - /// Run some code with "sufficient" stack space. (Currently, at least 256K - /// is guaranteed). Produces a warning if we're low on stack space and - /// allocates more in that case. Use this in code that may recurse deeply to - /// avoid stack overflow. - void runWithSufficientStackSpace(SourceLocation Loc, - llvm::function_ref<void()> Fn); + /// Run some code with "sufficient" stack space. (Currently, at least 256K + /// is guaranteed). Produces a warning if we're low on stack space and + /// allocates more in that case. Use this in code that may recurse deeply to + /// avoid stack overflow. + void runWithSufficientStackSpace(SourceLocation Loc, + llvm::function_ref<void()> Fn); - /// Check to see if we're low on stack space and produce a warning if we're - /// low on stack space (Currently, at least 256Kis guaranteed). - void warnOnStackNearlyExhausted(SourceLocation Loc); + /// Check to see if we're low on stack space and produce a warning if we're + /// low on stack space (Currently, at least 256Kis guaranteed). + void warnOnStackNearlyExhausted(SourceLocation Loc); -private: - /// Warn that the stack is nearly exhausted. - void warnStackExhausted(SourceLocation Loc); + private: + /// Warn that the stack is nearly exhausted. + void warnStackExhausted(SourceLocation Loc); - DiagnosticsEngine &DiagsRef; - bool WarnedStackExhausted = false; -}; + DiagnosticsEngine &DiagsRef; + bool WarnedStackExhausted = false; + }; } // end namespace clang >From 5cd14de144f119c7cf9055a2dc8b18273e0ef28f Mon Sep 17 00:00:00 2001 From: Boaz Brickner <brick...@google.com> Date: Wed, 16 Oct 2024 13:25:56 +0200 Subject: [PATCH 3/5] [clang] Move SingleWarningStackAwareExecutor to a separate file. --- .../Basic/SingleWarningStackAwareExecutor.h | 45 +++++++++++++++++++ clang/include/clang/Basic/Stack.h | 27 ----------- clang/include/clang/Sema/Sema.h | 2 +- clang/lib/Basic/CMakeLists.txt | 1 + .../Basic/SingleWarningStackAwareExecutor.cpp | 36 +++++++++++++++ clang/lib/Basic/Stack.cpp | 20 --------- clang/lib/CodeGen/CodeGenModule.h | 2 +- 7 files changed, 84 insertions(+), 49 deletions(-) create mode 100644 clang/include/clang/Basic/SingleWarningStackAwareExecutor.h create mode 100644 clang/lib/Basic/SingleWarningStackAwareExecutor.cpp diff --git a/clang/include/clang/Basic/SingleWarningStackAwareExecutor.h b/clang/include/clang/Basic/SingleWarningStackAwareExecutor.h new file mode 100644 index 00000000000000..93fc103837d95b --- /dev/null +++ b/clang/include/clang/Basic/SingleWarningStackAwareExecutor.h @@ -0,0 +1,45 @@ +//===--- SingleWarningStackAwareExecutor.h - A utility for warning once when +// close to out of stack space -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Defines a utilitiy for warning once when close to out of stack space. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H +#define LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H + +#include "clang/Basic/Diagnostic.h" + +namespace clang { +class SingleWarningStackAwareExecutor { +public: + SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) : DiagsRef(diags) {} + + /// Run some code with "sufficient" stack space. (Currently, at least 256K + /// is guaranteed). Produces a warning if we're low on stack space and + /// allocates more in that case. Use this in code that may recurse deeply to + /// avoid stack overflow. + void runWithSufficientStackSpace(SourceLocation Loc, + llvm::function_ref<void()> Fn); + + /// Check to see if we're low on stack space and produce a warning if we're + /// low on stack space (Currently, at least 256Kis guaranteed). + void warnOnStackNearlyExhausted(SourceLocation Loc); + +private: + /// Warn that the stack is nearly exhausted. + void warnStackExhausted(SourceLocation Loc); + + DiagnosticsEngine &DiagsRef; + bool WarnedStackExhausted = false; +}; +} // end namespace clang + +#endif // LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H diff --git a/clang/include/clang/Basic/Stack.h b/clang/include/clang/Basic/Stack.h index e9ea4335a5c142..30ebd94aedd1f7 100644 --- a/clang/include/clang/Basic/Stack.h +++ b/clang/include/clang/Basic/Stack.h @@ -16,8 +16,6 @@ #include <cstddef> -#include "clang/Basic/Diagnostic.h" -#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Compiler.h" @@ -52,31 +50,6 @@ namespace clang { Fn(); #endif } - - class SingleWarningStackAwareExecutor { - public: - SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) - : DiagsRef(diags) {} - - /// Run some code with "sufficient" stack space. (Currently, at least 256K - /// is guaranteed). Produces a warning if we're low on stack space and - /// allocates more in that case. Use this in code that may recurse deeply to - /// avoid stack overflow. - void runWithSufficientStackSpace(SourceLocation Loc, - llvm::function_ref<void()> Fn); - - /// Check to see if we're low on stack space and produce a warning if we're - /// low on stack space (Currently, at least 256Kis guaranteed). - void warnOnStackNearlyExhausted(SourceLocation Loc); - - private: - /// Warn that the stack is nearly exhausted. - void warnStackExhausted(SourceLocation Loc); - - DiagnosticsEngine &DiagsRef; - bool WarnedStackExhausted = false; - }; - } // end namespace clang #endif // LLVM_CLANG_BASIC_STACK_H diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 9c846f2b6b12f0..76e6268e4e12ad 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -47,9 +47,9 @@ #include "clang/Basic/OperatorKinds.h" #include "clang/Basic/PartialDiagnostic.h" #include "clang/Basic/PragmaKinds.h" +#include "clang/Basic/SingleWarningStackAwareExecutor.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" -#include "clang/Basic/Stack.h" #include "clang/Basic/TemplateKinds.h" #include "clang/Basic/TokenKinds.h" #include "clang/Basic/TypeTraits.h" diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index e7ebc8f191aa6b..d653ada9c8b4b7 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -85,6 +85,7 @@ add_clang_library(clangBasic SanitizerSpecialCaseList.cpp Sanitizers.cpp Sarif.cpp + SingleWarningStackAwareExecutor.cpp SourceLocation.cpp SourceManager.cpp SourceMgrAdapter.cpp diff --git a/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp b/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp new file mode 100644 index 00000000000000..45f5c79973f8d1 --- /dev/null +++ b/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp @@ -0,0 +1,36 @@ +//===--- SingleWarningStackAwareExecutor.cpp - - A utility for warning once when +// close to out of stack space -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Defines a utilitiy for warning once when close to out of stack space. +/// +//===----------------------------------------------------------------------===// + +#include "clang/Basic/SingleWarningStackAwareExecutor.h" +#include "clang/Basic/Stack.h" + +void clang::SingleWarningStackAwareExecutor::runWithSufficientStackSpace( + SourceLocation Loc, llvm::function_ref<void()> Fn) { + clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); +} + +void clang::SingleWarningStackAwareExecutor::warnOnStackNearlyExhausted( + SourceLocation Loc) { + if (isStackNearlyExhausted()) + warnStackExhausted(Loc); +} + +void clang::SingleWarningStackAwareExecutor::warnStackExhausted( + SourceLocation Loc) { + // Only warn about this once. + if (!WarnedStackExhausted) { + DiagsRef.Report(Loc, diag::warn_stack_exhausted); + WarnedStackExhausted = true; + } +} diff --git a/clang/lib/Basic/Stack.cpp b/clang/lib/Basic/Stack.cpp index 476612e281422b..aa15d8e66950fa 100644 --- a/clang/lib/Basic/Stack.cpp +++ b/clang/lib/Basic/Stack.cpp @@ -72,23 +72,3 @@ void clang::runWithSufficientStackSpaceSlow(llvm::function_ref<void()> Diag, Fn(); }, DesiredStackSize); } - -void clang::SingleWarningStackAwareExecutor::runWithSufficientStackSpace( - SourceLocation Loc, llvm::function_ref<void()> Fn) { - clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); -} - -void clang::SingleWarningStackAwareExecutor::warnOnStackNearlyExhausted( - SourceLocation Loc) { - if (isStackNearlyExhausted()) - warnStackExhausted(Loc); -} - -void clang::SingleWarningStackAwareExecutor::warnStackExhausted( - SourceLocation Loc) { - // Only warn about this once. - if (!WarnedStackExhausted) { - DiagsRef.Report(Loc, diag::warn_stack_exhausted); - WarnedStackExhausted = true; - } -} diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index f4de284369384e..ca136c3829dac3 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -26,7 +26,7 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/NoSanitizeList.h" #include "clang/Basic/ProfileList.h" -#include "clang/Basic/Stack.h" +#include "clang/Basic/SingleWarningStackAwareExecutor.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/XRayLists.h" #include "clang/Lex/PreprocessorOptions.h" >From 59634b512d445409f6d5a988e78120d83c478630 Mon Sep 17 00:00:00 2001 From: Boaz Brickner <brick...@google.com> Date: Wed, 16 Oct 2024 16:41:04 +0200 Subject: [PATCH 4/5] [clang] Fix comment formatting. --- clang/lib/Basic/SingleWarningStackAwareExecutor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp b/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp index 45f5c79973f8d1..82d2da910a4ca9 100644 --- a/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp +++ b/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp @@ -1,5 +1,5 @@ -//===--- SingleWarningStackAwareExecutor.cpp - - A utility for warning once when -// close to out of stack space -------*- C++ -*-===// +//===--- SingleWarningStackAwareExecutor.cpp - - A utility for warning once +// when close to out of stack space -------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. >From 9baf99c4c3f563d12273b856b89e393a513d8985 Mon Sep 17 00:00:00 2001 From: Boaz Brickner <brick...@google.com> Date: Fri, 18 Oct 2024 10:02:19 +0200 Subject: [PATCH 5/5] [clang] Rename SingleWarningStackAwareExecutor to StackExhaustionHandler. --- ...ackAwareExecutor.h => StackExhaustionHandler.h} | 14 +++++++------- clang/include/clang/Sema/Sema.h | 4 ++-- clang/include/clang/Serialization/ASTReader.h | 4 ++-- clang/lib/Basic/CMakeLists.txt | 2 +- ...wareExecutor.cpp => StackExhaustionHandler.cpp} | 13 ++++++------- clang/lib/CodeGen/CodeGenModule.cpp | 4 ++-- clang/lib/CodeGen/CodeGenModule.h | 4 ++-- clang/lib/Sema/Sema.cpp | 4 ++-- clang/lib/Sema/SemaTemplateInstantiate.cpp | 2 +- clang/lib/Serialization/ASTReader.cpp | 4 ++-- 10 files changed, 27 insertions(+), 28 deletions(-) rename clang/include/clang/Basic/{SingleWarningStackAwareExecutor.h => StackExhaustionHandler.h} (74%) rename clang/lib/Basic/{SingleWarningStackAwareExecutor.cpp => StackExhaustionHandler.cpp} (67%) diff --git a/clang/include/clang/Basic/SingleWarningStackAwareExecutor.h b/clang/include/clang/Basic/StackExhaustionHandler.h similarity index 74% rename from clang/include/clang/Basic/SingleWarningStackAwareExecutor.h rename to clang/include/clang/Basic/StackExhaustionHandler.h index 93fc103837d95b..fb02b9521cb48f 100644 --- a/clang/include/clang/Basic/SingleWarningStackAwareExecutor.h +++ b/clang/include/clang/Basic/StackExhaustionHandler.h @@ -1,5 +1,5 @@ -//===--- SingleWarningStackAwareExecutor.h - A utility for warning once when -// close to out of stack space -------*- C++ -*-===// +//===--- StackExhaustionHandler.h - A utility for warning once when close to out +// of stack space -------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -12,15 +12,15 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H -#define LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H +#ifndef LLVM_CLANG_BASIC_STACK_EXHAUSTION_HANDLER_H +#define LLVM_CLANG_BASIC_STACK_EXHAUSTION_HANDLER_H #include "clang/Basic/Diagnostic.h" namespace clang { -class SingleWarningStackAwareExecutor { +class StackExhaustionHandler { public: - SingleWarningStackAwareExecutor(DiagnosticsEngine &diags) : DiagsRef(diags) {} + StackExhaustionHandler(DiagnosticsEngine &diags) : DiagsRef(diags) {} /// Run some code with "sufficient" stack space. (Currently, at least 256K /// is guaranteed). Produces a warning if we're low on stack space and @@ -42,4 +42,4 @@ class SingleWarningStackAwareExecutor { }; } // end namespace clang -#endif // LLVM_CLANG_BASIC_SINGLE_WARNING_STACK_AWARE_EXECUTOR_H +#endif // LLVM_CLANG_BASIC_STACK_EXHAUSTION_HANDLER_H diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 76e6268e4e12ad..877b47f7750fe5 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -47,9 +47,9 @@ #include "clang/Basic/OperatorKinds.h" #include "clang/Basic/PartialDiagnostic.h" #include "clang/Basic/PragmaKinds.h" -#include "clang/Basic/SingleWarningStackAwareExecutor.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" +#include "clang/Basic/StackExhaustionHandler.h" #include "clang/Basic/TemplateKinds.h" #include "clang/Basic/TokenKinds.h" #include "clang/Basic/TypeTraits.h" @@ -1181,7 +1181,7 @@ class Sema final : public SemaBase { std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo; bool WarnedDarwinSDKInfoMissing = false; - SingleWarningStackAwareExecutor StackAwareExecutor; + StackExhaustionHandler StackHandler; Sema(const Sema &) = delete; void operator=(const Sema &) = delete; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 2c6251ce0190c6..b476a40ebd2c8c 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -19,7 +19,7 @@ #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/OpenCLOptions.h" #include "clang/Basic/SourceLocation.h" -#include "clang/Basic/Stack.h" +#include "clang/Basic/StackExhaustionHandler.h" #include "clang/Basic/Version.h" #include "clang/Lex/ExternalPreprocessorSource.h" #include "clang/Lex/HeaderSearch.h" @@ -446,7 +446,7 @@ class ASTReader DiagnosticsEngine &Diags; // Sema has duplicate logic, but SemaObj can sometimes be null so ASTReader // has its own version. - SingleWarningStackAwareExecutor StackAwareExecutor; + StackExhaustionHandler StackHandler; /// The semantic analysis object that will be processing the /// AST files and the translation unit that uses it. diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index d653ada9c8b4b7..e11e1ac4a6fa63 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -85,11 +85,11 @@ add_clang_library(clangBasic SanitizerSpecialCaseList.cpp Sanitizers.cpp Sarif.cpp - SingleWarningStackAwareExecutor.cpp SourceLocation.cpp SourceManager.cpp SourceMgrAdapter.cpp Stack.cpp + StackExhaustionHandler.cpp TargetID.cpp TargetInfo.cpp Targets.cpp diff --git a/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp b/clang/lib/Basic/StackExhaustionHandler.cpp similarity index 67% rename from clang/lib/Basic/SingleWarningStackAwareExecutor.cpp rename to clang/lib/Basic/StackExhaustionHandler.cpp index 82d2da910a4ca9..24b499c810dbfe 100644 --- a/clang/lib/Basic/SingleWarningStackAwareExecutor.cpp +++ b/clang/lib/Basic/StackExhaustionHandler.cpp @@ -1,5 +1,5 @@ -//===--- SingleWarningStackAwareExecutor.cpp - - A utility for warning once -// when close to out of stack space -------*- C++ -*-===// +//===--- StackExhaustionHandler.cpp - - A utility for warning once when close +// to out of stack space -------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -12,22 +12,21 @@ /// //===----------------------------------------------------------------------===// -#include "clang/Basic/SingleWarningStackAwareExecutor.h" +#include "clang/Basic/StackExhaustionHandler.h" #include "clang/Basic/Stack.h" -void clang::SingleWarningStackAwareExecutor::runWithSufficientStackSpace( +void clang::StackExhaustionHandler::runWithSufficientStackSpace( SourceLocation Loc, llvm::function_ref<void()> Fn) { clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn); } -void clang::SingleWarningStackAwareExecutor::warnOnStackNearlyExhausted( +void clang::StackExhaustionHandler::warnOnStackNearlyExhausted( SourceLocation Loc) { if (isStackNearlyExhausted()) warnStackExhausted(Loc); } -void clang::SingleWarningStackAwareExecutor::warnStackExhausted( - SourceLocation Loc) { +void clang::StackExhaustionHandler::warnStackExhausted(SourceLocation Loc) { // Only warn about this once. if (!WarnedStackExhausted) { DiagsRef.Report(Loc, diag::warn_stack_exhausted); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 3153ec8a2d00e3..420c33a9678ebc 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -341,7 +341,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, : Context(C), LangOpts(C.getLangOpts()), FS(FS), HeaderSearchOpts(HSO), PreprocessorOpts(PPO), CodeGenOpts(CGO), TheModule(M), Diags(diags), Target(C.getTargetInfo()), ABI(createCXXABI(*this)), - VMContext(M.getContext()), VTables(*this), StackAwareExecutor(diags), + VMContext(M.getContext()), VTables(*this), StackHandler(diags), SanitizerMD(new SanitizerMetadata(*this)) { // Initialize the type cache. @@ -1596,7 +1596,7 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) { void CodeGenModule::runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref<void()> Fn) { - StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); + StackHandler.runWithSufficientStackSpace(Loc, Fn); } llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index ca136c3829dac3..1b77490e261c21 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -26,7 +26,7 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/NoSanitizeList.h" #include "clang/Basic/ProfileList.h" -#include "clang/Basic/SingleWarningStackAwareExecutor.h" +#include "clang/Basic/StackExhaustionHandler.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/XRayLists.h" #include "clang/Lex/PreprocessorOptions.h" @@ -337,7 +337,7 @@ class CodeGenModule : public CodeGenTypeCache { std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader; InstrProfStats PGOStats; std::unique_ptr<llvm::SanitizerStatReport> SanStats; - SingleWarningStackAwareExecutor StackAwareExecutor; + StackExhaustionHandler StackHandler; // A set of references that have only been seen via a weakref so far. This is // used to remove the weak of the reference if we ever see a direct reference diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index edb13226758ad9..5e9886a109468f 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -220,7 +220,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, AnalysisWarnings(*this), ThreadSafetyDeclCache(nullptr), LateTemplateParser(nullptr), LateTemplateParserCleanup(nullptr), OpaqueParser(nullptr), CurContext(nullptr), ExternalSource(nullptr), - StackAwareExecutor(Diags), CurScope(nullptr), Ident_super(nullptr), + StackHandler(Diags), CurScope(nullptr), Ident_super(nullptr), AMDGPUPtr(std::make_unique<SemaAMDGPU>(*this)), ARMPtr(std::make_unique<SemaARM>(*this)), AVRPtr(std::make_unique<SemaAVR>(*this)), @@ -564,7 +564,7 @@ Sema::~Sema() { void Sema::runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref<void()> Fn) { - StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); + StackHandler.runWithSufficientStackSpace(Loc, Fn); } bool Sema::makeUnavailableInSystemHeader(SourceLocation loc, diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 8fb503c6f7e639..a0b381f4090e18 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -806,7 +806,7 @@ void Sema::pushCodeSynthesisContext(CodeSynthesisContext Ctx) { // Check to see if we're low on stack space. We can't do anything about this // from here, but we can at least warn the user. - StackAwareExecutor.warnOnStackNearlyExhausted(Ctx.PointOfInstantiation); + StackHandler.warnOnStackNearlyExhausted(Ctx.PointOfInstantiation); } void Sema::popCodeSynthesisContext() { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 2d4f00f0aac7d2..1cf6c9352f3686 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9657,7 +9657,7 @@ void ASTReader::runWithSufficientStackSpace(SourceLocation Loc, return; } - StackAwareExecutor.runWithSufficientStackSpace(Loc, Fn); + StackHandler.runWithSufficientStackSpace(Loc, Fn); } /// Retrieve the identifier table associated with the @@ -10512,7 +10512,7 @@ ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, : cast<ASTReaderListener>(new PCHValidator(PP, *this))), SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), - StackAwareExecutor(Diags), PP(PP), ContextObj(Context), + StackHandler(Diags), PP(PP), ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, PCHContainerRdr, PP.getHeaderSearchInfo()), DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits