Skip to content

Commit 2159b8d

Browse files
committed
ASTUnit::LoadFromASTFile(): recover the resources from an ASTReader if it crashes during PCH validation.
llvm-svn: 130886
1 parent 37d44bd commit 2159b8d

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

clang/lib/Frontend/ASTUnit.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,11 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename,
579579

580580
Reader.reset(new ASTReader(AST->getSourceManager(), AST->getFileManager(),
581581
AST->getDiagnostics()));
582+
583+
// Recover resources if we crash before exiting this method.
584+
llvm::CrashRecoveryContextCleanupRegistrar<ASTReader>
585+
ReaderCleanup(Reader.get());
586+
582587
Reader->setListener(new ASTInfoCollector(LangInfo, HeaderInfo, TargetTriple,
583588
Predefines, Counter));
584589

@@ -633,6 +638,11 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename,
633638
// AST file as needed.
634639
ASTReader *ReaderPtr = Reader.get();
635640
llvm::OwningPtr<ExternalASTSource> Source(Reader.take());
641+
642+
// Unregister the cleanup for ASTReader. It will get cleaned up
643+
// by the ASTUnit cleanup.
644+
ReaderCleanup.unregister();
645+
636646
Context.setExternalSource(Source);
637647

638648
// Create an AST consumer, even though it isn't used.

0 commit comments

Comments
 (0)