[cfe-dev] [PATCH 2/3] Fixes incorrect #ifs for SJ/LJ exceptions

Jonathan Roelofs jonathan at codesourcery.com
Tue Apr 22 13:24:35 PDT 2014


LGTM

Jon

On 4/22/14, 12:59 PM, Dan Albert wrote:
> Sorry for the delay. I've attached a revised patch.
>
> I opted to switch unwind.h to the more generic definition as well since that
> seems cleaner. Let me know if there's a good reason to do otherwise.
>
> - Dan
>
>
> On Wed, Apr 16, 2014 at 11:18 AM, Jonathan Roelofs <jonathan at codesourcery.com
> <mailto:jonathan at codesourcery.com>> wrote:
>
>     Dan,
>
>     I think that it would be a good idea to keep libc++abi from depending on
>     this particular unwinder, because not all targets are going to use it, and
>     they really are two separate components.  Also, I've read rumors that folks
>     want to move said unwinder over to the compiler-rt repository...
>
>     Therefore the guards in cxa_exception.cpp and cxa_personality.cpp should be
>     using __USING_SJLJ_EXCEPTIONS__ instead (which is defined by the compiler
>     when setjmp-longjmp exceptions are being used).  In unwind.h, to me it still
>     makes sense to use _LIBUNWIND_BUILD_SJLJ_APIS, but its definition needs to
>     be pulled in from config.h.
>
>     Jon
>
>
>     On 4/16/14, 9:29 AM, Dan Albert wrote:
>
>         The was working because, given __APPLE__, _LIBUNWIND_BUILD_SJLJ_APIS was
>         set to
>         __arm__, but other ARM targets not using SJ/LJ will fail to compile.
>         ---
>            include/unwind.h        | 2 +-
>            src/cxa_exception.cpp   | 6 +++---
>            src/cxa_personality.cpp | 2 +-
>            3 files changed, 5 insertions(+), 5 deletions(-)
>
>         diff --git a/include/unwind.h b/include/unwind.h
>         index c5acd93..50e2d4b 100644
>         --- a/include/unwind.h
>         +++ b/include/unwind.h
>         @@ -83,7 +83,7 @@ extern "C" {
>            //
>            // The following are the base functions documented by the C++ ABI
>            //
>         -#if __arm__
>         +#if _LIBUNWIND_BUILD_SJLJ_APIS
>            extern _Unwind_Reason_Code
>                _Unwind_SjLj_RaiseException(__struct _Unwind_Exception
>         *exception_object);
>            extern void _Unwind_SjLj_Resume(struct _Unwind_Exception
>         *exception_object);
>         diff --git a/src/cxa_exception.cpp b/src/cxa_exception.cpp
>         index 744dddd..787d8a8 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 _LIBUNWIND_BUILD_SJLJ_APIS
>                _Unwind_SjLj_RaiseException(&__exception_header->__unwindHeader);
>            #else
>                _Unwind_RaiseException(&__exception_header->__unwindHeader);
>         @@ -465,7 +465,7 @@ __cxa_rethrow()
>                    //   nothing
>                    globals->caughtExceptions = 0;
>                }
>         -#if __arm__
>         +#if _LIBUNWIND_BUILD_SJLJ_APIS
>                _Unwind_SjLj_RaiseException(&__exception_header->__unwindHeader);
>            #else
>                _Unwind_RaiseException(&__exception_header->__unwindHeader);
>         @@ -594,7 +594,7 @@ __cxa_rethrow_primary___exception(void* thrown_object)
>
>         setDependentExceptionClass(&__dep_exception_header->__unwindHeader);
>                    __cxa_get_globals()->__uncaughtExceptions += 1;
>                    dep_exception_header->__unwindHeader.exception_cleanup =
>         dependent_exception_cleanup;
>         -#if __arm__
>         +#if _LIBUNWIND_BUILD_SJLJ_APIS
>
>         _Unwind_SjLj_RaiseException(&__dep_exception_header->__unwindHeader);
>            #else
>                    _Unwind_RaiseException(&dep___exception_header->__unwindHeader);
>         diff --git a/src/cxa_personality.cpp b/src/cxa_personality.cpp
>         index 81104b8..32a3127 100644
>         --- a/src/cxa_personality.cpp
>         +++ b/src/cxa_personality.cpp
>         @@ -838,7 +838,7 @@ _UA_CLEANUP_PHASE
>            */
>
>            _Unwind_Reason_Code
>         -#if __arm__
>         +#if _LIBUNWIND_BUILD_SJLJ_APIS
>            __gxx_personality_sj0
>            #else
>            __gxx_personality_v0
>
>
>     --
>     Jon Roelofs
>     jonathan at codesourcery.com <mailto:jonathan at codesourcery.com>
>     CodeSourcery / Mentor Embedded
>
>

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



More information about the cfe-dev mailing list