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

Douglas Gregor dgregor at apple.com
Thu Aug 19 10:07:10 PDT 2010


On Aug 19, 2010, at 9:05 AM, Daniel Dunbar wrote:

> On Wed, Aug 18, 2010 at 1:29 PM, Douglas Gregor <dgregor at apple.com> wrote:
>> 
>> 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.
> 
> Yes, shame we can't use blocks here though. :)

Well, we could do cool function object tricks rather than icky void pointers :)

>> Are you planning on updating the remaining libclang entry points?
> 
> I did clang_reparseTranslationUnit, but I wasn't necessarily planning
> on doing any more. My thoughts here were that parsing is the only
> thing we can't reasonably test fully. For everything else in CIndex I
> would hope that we could shake the bugs out just with good testing
> coverage.
> 
> Were there specific entry points you were wondering about?

clang_codeCompleteAt is the only other one that greatly concerns me.

	- Doug





More information about the cfe-commits mailing list