Merged to 5.0 in r309290.
On Wed, Jul 26, 2017 at 3:55 PM, Saleem Abdulrasool via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: compnerd > Date: Wed Jul 26 15:55:23 2017 > New Revision: 309226 > > URL: http://llvm.org/viewvc/llvm-project?rev=309226&view=rev > Log: > Headers: improve ARM EHABI coverage of unwind.h > > Ensure that we define the `_Unwind_Control_Block` structure used on ARM > EHABI targets. This is needed for building libc++abi with the unwind.h > from the resource dir. A minor fallout of this is that we needed to > create a typedef for _Unwind_Exception to work across ARM EHABI and > non-EHABI targets. The structure definitions here are based originally > on the documentation from ARM under the "Exception Handling ABI for the > ARMĀ® Architecture" Section 7.2. They are then adjusted to more closely > reflect the definition in libunwind from LLVM. Those changes are > compatible in layout but permit easier use in libc++abi and help > maintain compatibility between libunwind and the compiler provided > definition. > > Modified: > cfe/trunk/lib/Headers/unwind.h > > Modified: cfe/trunk/lib/Headers/unwind.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/unwind.h?rev=309226&r1=309225&r2=309226&view=diff > ============================================================================== > --- cfe/trunk/lib/Headers/unwind.h (original) > +++ cfe/trunk/lib/Headers/unwind.h Wed Jul 26 15:55:23 2017 > @@ -76,7 +76,13 @@ typedef intptr_t _sleb128_t; > typedef uintptr_t _uleb128_t; > > struct _Unwind_Context; > +#if defined(__arm__) && !(defined(__USING_SJLJ_EXCEPTIONS__) || > defined(__ARM_DWARF_EH___)) > +struct _Unwind_Control_Block; > +typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */ > +#else > struct _Unwind_Exception; > +typedef struct _Unwind_Exception _Unwind_Exception; > +#endif > typedef enum { > _URC_NO_REASON = 0, > #if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \ > @@ -109,8 +115,42 @@ typedef enum { > } _Unwind_Action; > > typedef void (*_Unwind_Exception_Cleanup_Fn)(_Unwind_Reason_Code, > - struct _Unwind_Exception *); > + _Unwind_Exception *); > > +#if defined(__arm__) && !(defined(__USING_SJLJ_EXCEPTIONS__) || > defined(__ARM_DWARF_EH___)) > +typedef struct _Unwind_Control_Block _Unwind_Control_Block; > +typedef uint32_t _Unwind_EHT_Header; > + > +struct _Unwind_Control_Block { > + uint64_t exception_class; > + void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *); > + /* unwinder cache (private fields for the unwinder's use) */ > + struct { > + uint32_t reserved1; /* forced unwind stop function, 0 if not forced */ > + uint32_t reserved2; /* personality routine */ > + uint32_t reserved3; /* callsite */ > + uint32_t reserved4; /* forced unwind stop argument */ > + uint32_t reserved5; > + } unwinder_cache; > + /* propagation barrier cache (valid after phase 1) */ > + struct { > + uint32_t sp; > + uint32_t bitpattern[5]; > + } barrier_cache; > + /* cleanup cache (preserved over cleanup) */ > + struct { > + uint32_t bitpattern[4]; > + } cleanup_cache; > + /* personality cache (for personality's benefit) */ > + struct { > + uint32_t fnstart; /* function start address */ > + _Unwind_EHT_Header *ehtp; /* pointer to EHT entry header word */ > + uint32_t additional; /* additional data */ > + uint32_t reserved1; > + } pr_cache; > + long long int : 0; /* force alignment of next item to 8-byte boundary */ > +}; > +#else > struct _Unwind_Exception { > _Unwind_Exception_Class exception_class; > _Unwind_Exception_Cleanup_Fn exception_cleanup; > @@ -120,16 +160,18 @@ struct _Unwind_Exception { > * aligned". GCC has interpreted this to mean "use the maximum useful > * alignment for the target"; so do we. */ > } __attribute__((__aligned__)); > +#endif > > typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)(int, _Unwind_Action, > _Unwind_Exception_Class, > - struct _Unwind_Exception *, > + _Unwind_Exception *, > struct _Unwind_Context *, > void *); > > -typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)( > - int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, > - struct _Unwind_Context *); > +typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)(int, _Unwind_Action, > + > _Unwind_Exception_Class, > + _Unwind_Exception *, > + struct _Unwind_Context > *); > typedef _Unwind_Personality_Fn __personality_routine; > > typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)(struct _Unwind_Context *, > @@ -224,13 +266,12 @@ _Unwind_Ptr _Unwind_GetRegionStart(struc > > /* DWARF EH functions; currently not available on Darwin/ARM */ > #if !defined(__APPLE__) || !defined(__arm__) > - > -_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *); > -_Unwind_Reason_Code _Unwind_ForcedUnwind(struct _Unwind_Exception *, > - _Unwind_Stop_Fn, void *); > -void _Unwind_DeleteException(struct _Unwind_Exception *); > -void _Unwind_Resume(struct _Unwind_Exception *); > -_Unwind_Reason_Code _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *); > +_Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Exception *); > +_Unwind_Reason_Code _Unwind_ForcedUnwind(_Unwind_Exception *, > _Unwind_Stop_Fn, > + void *); > +void _Unwind_DeleteException(_Unwind_Exception *); > +void _Unwind_Resume(_Unwind_Exception *); > +_Unwind_Reason_Code _Unwind_Resume_or_Rethrow(_Unwind_Exception *); > > #endif > > @@ -241,11 +282,11 @@ typedef struct SjLj_Function_Context *_U > > void _Unwind_SjLj_Register(_Unwind_FunctionContext_t); > void _Unwind_SjLj_Unregister(_Unwind_FunctionContext_t); > -_Unwind_Reason_Code _Unwind_SjLj_RaiseException(struct _Unwind_Exception *); > -_Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind(struct _Unwind_Exception *, > +_Unwind_Reason_Code _Unwind_SjLj_RaiseException(_Unwind_Exception *); > +_Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind(_Unwind_Exception *, > _Unwind_Stop_Fn, void *); > -void _Unwind_SjLj_Resume(struct _Unwind_Exception *); > -_Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow(struct _Unwind_Exception > *); > +void _Unwind_SjLj_Resume(_Unwind_Exception *); > +_Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow(_Unwind_Exception *); > > void *_Unwind_FindEnclosingFunction(void *); > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits