diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2010-08-18 18:43:17 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2010-08-18 18:43:17 +0000 |
| commit | 583c3b775e7503a9636ea45e35ea5603e09026cc (patch) | |
| tree | 9e5825f799f8d04dbc4aa6f6038414bad801cd37 /clang/tools | |
| parent | c91f2fff9892a0da71fd05d1b6596a832cdffee1 (diff) | |
| download | bcm5719-llvm-583c3b775e7503a9636ea45e35ea5603e09026cc.tar.gz bcm5719-llvm-583c3b775e7503a9636ea45e35ea5603e09026cc.zip | |
libclang: Put clang_parseTranslationUnit inside a crash recovery context.
llvm-svn: 111387
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index e0720e788a9..829873e74fe 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -1209,16 +1209,31 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, unsaved_files, num_unsaved_files, CXTranslationUnit_DetailedPreprocessingRecord); } + +struct ParseTranslationUnitInfo { + CXIndex CIdx; + const char *source_filename; + const char **command_line_args; + int num_command_line_args; + struct CXUnsavedFile *unsaved_files; + unsigned num_unsaved_files; + unsigned options; + CXTranslationUnit result; +}; +void clang_parseTranslationUnit_Impl(void *UserData) { + ParseTranslationUnitInfo *PTUI = + static_cast<ParseTranslationUnitInfo*>(UserData); + CXIndex CIdx = PTUI->CIdx; + const char *source_filename = PTUI->source_filename; + const char **command_line_args = PTUI->command_line_args; + int num_command_line_args = PTUI->num_command_line_args; + struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files; + unsigned num_unsaved_files = PTUI->num_unsaved_files; + unsigned options = PTUI->options; + PTUI->result = 0; -CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, - const char *source_filename, - const char **command_line_args, - int num_command_line_args, - struct CXUnsavedFile *unsaved_files, - unsigned num_unsaved_files, - unsigned options) { if (!CIdx) - return 0; + return; CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); @@ -1307,7 +1322,8 @@ CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, } } - return Unit.take(); + PTUI->result = Unit.take(); + return; } // Build up the arguments for invoking 'clang'. @@ -1343,7 +1359,7 @@ CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, std::vector<llvm::sys::Path> TemporaryFiles; std::vector<std::string> RemapArgs; if (RemapFiles(num_unsaved_files, unsaved_files, RemapArgs, TemporaryFiles)) - return 0; + return; // The pointers into the elements of RemapArgs are stable because we // won't be adding anything to RemapArgs after this point. @@ -1459,7 +1475,26 @@ CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, TemporaryFiles[i].eraseFromDisk(); } - return ATU; + PTUI->result = ATU; +} +CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, + const char *source_filename, + const char **command_line_args, + int num_command_line_args, + struct CXUnsavedFile *unsaved_files, + unsigned num_unsaved_files, + unsigned options) { + ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args, + num_command_line_args, unsaved_files, num_unsaved_files, + options, 0 }; + llvm::CrashRecoveryContext CRC; + + if (!CRC.RunSafely(clang_parseTranslationUnit_Impl, &PTUI)) { + // FIXME: Find a way to report the crash. + return 0; + } + + return PTUI.result; } unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { @@ -1473,7 +1508,7 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, return static_cast<ASTUnit *>(TU)->Save(FileName); } - + void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { if (CTUnit) delete static_cast<ASTUnit *>(CTUnit); |

