r309226 - Headers: improve ARM EHABI coverage of unwind.h
Evgenii Stepanov via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 11 13:12:42 PDT 2017
Hi,
I've noticed that the code in
compiler-rt/lib/builtins/gcc_personality_v0.c refers to
_Unwind_Exception as "struct _Unwind_Exception". With this change, it
is not a struct anymore on ARM. Should that code be fixed, or is it a
problem in this change?
compiler-rt/lib/builtins/gcc_personality_v0.c:153:23: error:
declaration of 'struct _Unwind_Exception' will not be visible outside
of this function [-Werror,-Wvisibility]
continueUnwind(struct _Unwind_Exception *exceptionObject,
On Thu, Jul 27, 2017 at 9:46 AM, Hans Wennborg via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Merged to 5.0 in r309290.
>
> On Wed, Jul 26, 2017 at 3:55 PM, Saleem Abdulrasool via cfe-commits
> <cfe-commits at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list