]> granicus.if.org Git - clang/commitdiff
Restore PrettyStackTrace state on crash.
authorNico Weber <nicolasweber@gmx.de>
Fri, 7 Aug 2015 17:48:57 +0000 (17:48 +0000)
committerNico Weber <nicolasweber@gmx.de>
Fri, 7 Aug 2015 17:48:57 +0000 (17:48 +0000)
Last part of PR11974.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244339 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseAST.cpp

index 6727afc1dd6c3b35c0393b5b4b85e370bc10efb5..ccf947984945c0c200119bfe88a87c6dace9fc72 100644 (file)
@@ -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<ResetStackCleanup,
+                                                   const void> {
+public:
+  ResetStackCleanup(llvm::CrashRecoveryContext *Context, const void *Top)
+      : llvm::CrashRecoveryContextCleanupBase<ResetStackCleanup, const void>(
+            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<const void, ResetStackCleanup>
+      CleanupPrettyStack(llvm::SavePrettyStackState());
   PrettyStackTraceParserEntry CrashInfo(P);
 
   // Recover resources if we crash before exiting this method.