diff --git a/src/sema_manager.cc b/src/sema_manager.cc index 805a5ee5..dca5b03b 100644 --- a/src/sema_manager.cc +++ b/src/sema_manager.cc @@ -327,19 +327,26 @@ buildCompilerInstance(Session &session, std::unique_ptr ci, bool parse(CompilerInstance &clang) { SyntaxOnlyAction action; - if (!action.BeginSourceFile(clang, clang.getFrontendOpts().Inputs[0])) - return false; + llvm::CrashRecoveryContext crc; + bool ok = false; + auto run = [&]() { + if (!action.BeginSourceFile(clang, clang.getFrontendOpts().Inputs[0])) + return; #if LLVM_VERSION_MAJOR >= 9 // rL364464 - if (llvm::Error e = action.Execute()) { - llvm::consumeError(std::move(e)); - return false; - } + if (llvm::Error e = action.Execute()) { + llvm::consumeError(std::move(e)); + return; + } #else - if (!action.Execute()) - return false; + if (!action.Execute()) + return; #endif - action.EndSourceFile(); - return true; + action.EndSourceFile(); + ok = true; + }; + if (!crc.RunSafely(run)) + LOG_S(ERROR) << "clang crashed"; + return ok; } void buildPreamble(Session &session, CompilerInvocation &ci,