[cfe-commits] r111387 - in /cfe/trunk: test/Index/crash-recovery.c tools/libclang/CIndex.cpp

Douglas Gregor dgregor at apple.com
Wed Aug 18 13:29:10 PDT 2010


On Aug 18, 2010, at 11:43 AM, Daniel Dunbar wrote:

> Author: ddunbar
> Date: Wed Aug 18 13:43:17 2010
> New Revision: 111387
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=111387&view=rev
> Log:
> libclang: Put clang_parseTranslationUnit inside a crash recovery context.
> 
> Added:
>    cfe/trunk/test/Index/crash-recovery.c
> Modified:
>    cfe/trunk/tools/libclang/CIndex.cpp
> 
> Added: cfe/trunk/test/Index/crash-recovery.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/crash-recovery.c?rev=111387&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/crash-recovery.c (added)
> +++ cfe/trunk/test/Index/crash-recovery.c Wed Aug 18 13:43:17 2010
> @@ -0,0 +1,7 @@
> +// RUN: not c-index-test -test-load-source all %s 2> %t.err
> +// RUN: FileCheck < %t.err -check-prefix=CHECK-LOAD-SOURCE-CRASH %s
> +// CHECK-LOAD-SOURCE-CRASH: Unable to load translation unit
> +//
> +// XFAIL: win32
> +
> +#pragma clang __debug crash
> 
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=111387&r1=111386&r2=111387&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Wed Aug 18 13:43:17 2010
> @@ -1209,16 +1209,31 @@
>                                     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 @@
>       }
>     }
> 
> -    return Unit.take();
> +    PTUI->result = Unit.take();
> +    return;
>   }
> 
>   // Build up the arguments for invoking 'clang'.
> @@ -1343,7 +1359,7 @@
>   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 @@
>       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;
> +  }

Nifty, this looks fairly easy to use. Are you planning on updating the remaining libclang entry points?

	- Doug 





More information about the cfe-commits mailing list