diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-05-04 23:27:12 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-05-04 23:27:12 +0000 |
commit | 8c647deada0c0e8407b4ced00ff09be1261fe147 (patch) | |
tree | d5f0f2a252c38ca6ad8fa92de133fb00f8f7730d /lib/Frontend/ASTUnit.cpp | |
parent | bd61e341d6efb9b3eaee97e48f98876af128349c (diff) |
ASTUnit::LoadFromASTFile(): recover the resources from an ASTReader if it crashes during PCH validation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130886 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/ASTUnit.cpp')
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 88653b2240..0d0fecdcf4 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -579,6 +579,11 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, Reader.reset(new ASTReader(AST->getSourceManager(), AST->getFileManager(), AST->getDiagnostics())); + + // Recover resources if we crash before exiting this method. + llvm::CrashRecoveryContextCleanupRegistrar<ASTReader> + ReaderCleanup(Reader.get()); + Reader->setListener(new ASTInfoCollector(LangInfo, HeaderInfo, TargetTriple, Predefines, Counter)); @@ -633,6 +638,11 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, // AST file as needed. ASTReader *ReaderPtr = Reader.get(); llvm::OwningPtr<ExternalASTSource> Source(Reader.take()); + + // Unregister the cleanup for ASTReader. It will get cleaned up + // by the ASTUnit cleanup. + ReaderCleanup.unregister(); + Context.setExternalSource(Source); // Create an AST consumer, even though it isn't used. |