xref: /llvm-project/clang/lib/Basic/StackExhaustionHandler.cpp (revision 09cc75e2ccc3616e1cb3b17f2fb99cb3bb323b12)
1*09cc75e2SBoaz Brickner //===--- StackExhaustionHandler.cpp -  - A utility for warning once when close
2*09cc75e2SBoaz Brickner // to out of stack space -------*- C++ -*-===//
3*09cc75e2SBoaz Brickner //
4*09cc75e2SBoaz Brickner // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*09cc75e2SBoaz Brickner // See https://llvm.org/LICENSE.txt for license information.
6*09cc75e2SBoaz Brickner // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*09cc75e2SBoaz Brickner //
8*09cc75e2SBoaz Brickner //===----------------------------------------------------------------------===//
9*09cc75e2SBoaz Brickner ///
10*09cc75e2SBoaz Brickner /// \file
11*09cc75e2SBoaz Brickner /// Defines a utilitiy for warning once when close to out of stack space.
12*09cc75e2SBoaz Brickner ///
13*09cc75e2SBoaz Brickner //===----------------------------------------------------------------------===//
14*09cc75e2SBoaz Brickner 
15*09cc75e2SBoaz Brickner #include "clang/Basic/StackExhaustionHandler.h"
16*09cc75e2SBoaz Brickner #include "clang/Basic/Stack.h"
17*09cc75e2SBoaz Brickner 
18*09cc75e2SBoaz Brickner void clang::StackExhaustionHandler::runWithSufficientStackSpace(
19*09cc75e2SBoaz Brickner     SourceLocation Loc, llvm::function_ref<void()> Fn) {
20*09cc75e2SBoaz Brickner   clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn);
21*09cc75e2SBoaz Brickner }
22*09cc75e2SBoaz Brickner 
23*09cc75e2SBoaz Brickner void clang::StackExhaustionHandler::warnOnStackNearlyExhausted(
24*09cc75e2SBoaz Brickner     SourceLocation Loc) {
25*09cc75e2SBoaz Brickner   if (isStackNearlyExhausted())
26*09cc75e2SBoaz Brickner     warnStackExhausted(Loc);
27*09cc75e2SBoaz Brickner }
28*09cc75e2SBoaz Brickner 
29*09cc75e2SBoaz Brickner void clang::StackExhaustionHandler::warnStackExhausted(SourceLocation Loc) {
30*09cc75e2SBoaz Brickner   // Only warn about this once.
31*09cc75e2SBoaz Brickner   if (!WarnedStackExhausted) {
32*09cc75e2SBoaz Brickner     DiagsRef.Report(Loc, diag::warn_stack_exhausted);
33*09cc75e2SBoaz Brickner     WarnedStackExhausted = true;
34*09cc75e2SBoaz Brickner   }
35*09cc75e2SBoaz Brickner }
36