зеркало из https://github.com/microsoft/clang.git
Migrate 'PrettySTackTraceParserEntry' object out of Parser, and have it constructed within ParseAST. This avoids double crashes
during crash recovery. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128056 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
55c02585de
Коммит
614f96a7cf
|
@ -76,7 +76,6 @@ class Parser : public CodeCompletionHandler {
|
|||
friend class ColonProtectionRAIIObject;
|
||||
friend class InMessageExpressionRAIIObject;
|
||||
friend class ParenBraceBracketBalancer;
|
||||
PrettyStackTraceParserEntry CrashInfo;
|
||||
|
||||
Preprocessor &PP;
|
||||
|
||||
|
|
|
@ -45,9 +45,7 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
|
|||
CompletionConsumer));
|
||||
|
||||
// Recover resources if we crash before exiting this method.
|
||||
llvm::CrashRecoveryContextCleanupRegistrar
|
||||
SemaCleanupInCrash(llvm::CrashRecoveryContextCleanup::
|
||||
create<Sema>(S.get()));
|
||||
llvm::CrashRecoveryContextCleanupRegistrar<Sema> CleaupSema(S.get());
|
||||
|
||||
ParseAST(*S.get(), PrintStats);
|
||||
}
|
||||
|
@ -61,7 +59,15 @@ void clang::ParseAST(Sema &S, bool PrintStats) {
|
|||
|
||||
ASTConsumer *Consumer = &S.getASTConsumer();
|
||||
|
||||
Parser P(S.getPreprocessor(), S);
|
||||
llvm::OwningPtr<Parser> ParseOP(new Parser(S.getPreprocessor(), S));
|
||||
Parser &P = *ParseOP.get();
|
||||
|
||||
PrettyStackTraceParserEntry CrashInfo(P);
|
||||
|
||||
// Recover resources if we crash before exiting this method.
|
||||
llvm::CrashRecoveryContextCleanupRegistrar<Parser>
|
||||
CleaupParser(ParseOP.get());
|
||||
|
||||
S.getPreprocessor().EnterMainSourceFile();
|
||||
P.Initialize();
|
||||
S.Initialize();
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
using namespace clang;
|
||||
|
||||
Parser::Parser(Preprocessor &pp, Sema &actions)
|
||||
: CrashInfo(*this), PP(pp), Actions(actions), Diags(PP.getDiagnostics()),
|
||||
: PP(pp), Actions(actions), Diags(PP.getDiagnostics()),
|
||||
GreaterThanIsOperator(true), ColonIsSacred(false),
|
||||
InMessageExpression(false), TemplateParameterDepth(0) {
|
||||
Tok.setKind(tok::eof);
|
||||
|
|
Загрузка…
Ссылка в новой задаче