From: Nico Weber Date: Fri, 7 Aug 2015 17:48:57 +0000 (+0000) Subject: Restore PrettyStackTrace state on crash. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0ae15908e4102a9975b6478f1df1fb4dda9a0206;p=clang Restore PrettyStackTrace state on crash. Last part of PR11974. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244339 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseAST.cpp b/lib/Parse/ParseAST.cpp index 6727afc1dd..ccf9479849 100644 --- a/lib/Parse/ParseAST.cpp +++ b/lib/Parse/ParseAST.cpp @@ -30,6 +30,21 @@ using namespace clang; namespace { +/// Resets LLVM's pretty stack state so that stack traces are printed correctly +/// when there are nested CrashRecoveryContexts and the inner one recovers from +/// a crash. +class ResetStackCleanup + : public llvm::CrashRecoveryContextCleanupBase { +public: + ResetStackCleanup(llvm::CrashRecoveryContext *Context, const void *Top) + : llvm::CrashRecoveryContextCleanupBase( + Context, Top) {} + void recoverResources() override { + llvm::RestorePrettyStackState(resource); + } +}; + /// If a crash happens while the parser is active, an entry is printed for it. class PrettyStackTraceParserEntry : public llvm::PrettyStackTraceEntry { const Parser &P; @@ -113,6 +128,8 @@ void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) { new Parser(S.getPreprocessor(), S, SkipFunctionBodies)); Parser &P = *ParseOP.get(); + llvm::CrashRecoveryContextCleanupRegistrar + CleanupPrettyStack(llvm::SavePrettyStackState()); PrettyStackTraceParserEntry CrashInfo(P); // Recover resources if we crash before exiting this method.