Use CrashRecoveryContextCleanup objects to recover an ASTUnit if we crash in ASTUnit::LoadFromCommandLine() and ASTUnit::LoadFromCompilerInvocation().

llvm-svn: 127851
This commit is contained in:
Ted Kremenek 2011-03-18 02:06:56 +00:00
parent 750028b6f4
commit 4422bfea50
1 changed files with 18 additions and 0 deletions

View File

@ -44,6 +44,7 @@
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/CrashRecoveryContext.h"
#include <cstdlib>
#include <cstdio>
#include <sys/stat.h>
@ -500,6 +501,12 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename,
unsigned NumRemappedFiles,
bool CaptureDiagnostics) {
llvm::OwningPtr<ASTUnit> AST(new ASTUnit(true));
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar
ASTUnitCleanup(llvm::CrashRecoveryContextCleanup::
create<ASTUnit>(AST.get()));
ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
AST->OnlyLocalDecls = OnlyLocalDecls;
@ -1579,6 +1586,11 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
AST->Invocation.reset(CI);
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar
ASTUnitCleanup(llvm::CrashRecoveryContextCleanup::
create<ASTUnit>(AST.get()));
return AST->LoadFromCompilerInvocation(PrecompilePreamble)? 0 : AST.take();
}
@ -1704,6 +1716,12 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
AST->NumStoredDiagnosticsInPreamble = StoredDiagnostics.size();
AST->StoredDiagnostics.swap(StoredDiagnostics);
AST->Invocation.reset(CI.take());
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar
ASTUnitCleanup(llvm::CrashRecoveryContextCleanup::
create<ASTUnit>(AST.get()));
return AST->LoadFromCompilerInvocation(PrecompilePreamble) ? 0 : AST.take();
}