forked from OSchip/llvm-project
Restore PrettyStackTrace state on crash.
Last part of PR11974. llvm-svn: 244339
This commit is contained in:
parent
af3f242016
commit
6362745a76
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue