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