[PATCH][cxxabi] ARM EHABI zero-cost exception handling for libc++abi

Jonathan Roelofs jonathan at codesourcery.com
Mon Apr 14 14:23:55 PDT 2014



On 4/14/14, 1:51 PM, Nick Kledzik wrote:
>
> On Apr 13, 2014, at 3:16 AM, Logan Chien <tzuhsiang.chien at gmail.com> wrote:
>
>> Hi,
>>
>> I have worked on ARM EHABI zero-cost exception handling for libc++abi.
>>
>> With the attached patch, I can compile and run all libc++abi unittests on ARM Linux.
>>
>> Is it OK to commit?  Thanks.
>>
>
>> diff --git a/include/unwind.h b/include/unwind.h
>> index c5acd93..e57d756 100644
>> --- a/include/unwind.h
>> +++ b/include/unwind.h
>> @@ -23,8 +23,24 @@
>>   #define LIBUNWIND_UNAVAIL
>>   #endif
>>
>> +#if !defined(LIBCXXABI_SJLJ)
>> +#  if defined(__arm__)
>> +#    if defined(__APPLE__)
>> +#      define LIBCXXABI_ARM_EHABI 0
>> +#      define LIBCXXABI_SJLJ 1
>> +#    else
>> +#      define LIBCXXABI_ARM_EHABI 1
>> +#      define LIBCXXABI_SJLJ 0
>> +#    endif
>> +#  else
>> +#    define LIBCXXABI_ARM_EHABI 0
>> +#    define LIBCXXABI_SJLJ 0
>> +#  endif
>> +#endif
> I recently found that the compiler has a built-in define  __USING_SJLJ_EXCEPTIONS__ that is set when compiling for setjump/longjump based exceptions.  Is there are similar built-in for ARM EHABI?  If so, we can set these up without testing for __arm__ or __APPLE__.  In fact, LIBCXXABI_SJLJ can be replaced with __USING_SJLJ_EXCEPTIONS__.  And perhaps LIBCXXABI_ARM_EHABI can be replaced with some built-in?
__ARM_EABI_UNWINDER__ perhaps?  I'm not exactly sure what the semantics of it 
are, and I don't see a definition for it in Clang.  In libgcc's unwinder it's 
defined in one of the arm config files. I suppose that makes it not a builtin 
then....
>
>> diff --git a/src/cxa_exception.cpp b/src/cxa_exception.cpp
>> index 744dddd..27a55c5 100644
>> --- a/src/cxa_exception.cpp
>> +++ b/src/cxa_exception.cpp
>> @@ -232,7 +232,7 @@ __cxa_throw(void* thrown_object, std::type_info* tinfo, void (*dest)(void*))
>>       globals->uncaughtExceptions += 1;   // Not atomically, since globals are thread-local
>>
>>       exception_header->unwindHeader.exception_cleanup = exception_cleanup_func;
>> -#if __arm__
>> +#if LIBCXXABI_SJLJ
>>       _Unwind_SjLj_RaiseException(&exception_header->unwindHeader);
>>   #else
> I like the conditional test for SJLJ instead of the processor, but as I recently discovered, most of the existing __arm__ tests can be changed to __USING_SJLJ_EXCEPTIONS__ tests.
>
> -Nick
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded



More information about the cfe-commits mailing list