summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseAST.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-08-07 17:48:57 +0000
committerNico Weber <nicolasweber@gmx.de>2015-08-07 17:48:57 +0000
commit6362745a767ee747a27c98397574f9cafbb371ad (patch)
tree684232a9f12859c989d197ce95d22f347302131c /clang/lib/Parse/ParseAST.cpp
parentaf3f242016130387f45798b165399bfcaa7ca0b8 (diff)
downloadbcm5719-llvm-6362745a767ee747a27c98397574f9cafbb371ad.tar.gz
bcm5719-llvm-6362745a767ee747a27c98397574f9cafbb371ad.zip
Restore PrettyStackTrace state on crash.
Last part of PR11974. llvm-svn: 244339
Diffstat (limited to 'clang/lib/Parse/ParseAST.cpp')
-rw-r--r--clang/lib/Parse/ParseAST.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseAST.cpp b/clang/lib/Parse/ParseAST.cpp
index 6727afc1dd6..ccf94798494 100644
--- a/clang/lib/Parse/ParseAST.cpp
+++ b/clang/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<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.
OpenPOWER on IntegriCloud