[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