diff --git a/libcxxabi/include/unwind.h b/libcxxabi/include/unwind.h index dd82bc9125d2..1e517b68bdce 100644 --- a/libcxxabi/include/unwind.h +++ b/libcxxabi/include/unwind.h @@ -206,37 +206,13 @@ extern _Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *context, _Unwind_VRS_RegClass regclass, uint32_t discriminator, _Unwind_VRS_DataRepresentation representation); +#endif -static inline uintptr_t _Unwind_GetGR(struct _Unwind_Context* context, - int index) { - uintptr_t value = 0; - _Unwind_VRS_Get(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32, &value); - return value; -} - -static inline void _Unwind_SetGR(struct _Unwind_Context* context, int index, - uintptr_t new_value) { - _Unwind_VRS_Set(context, _UVRSC_CORE, (uint32_t)index, - _UVRSD_UINT32, &new_value); -} - -static inline uintptr_t _Unwind_GetIP(struct _Unwind_Context* context) { - // remove the thumb-bit before returning - return (_Unwind_GetGR(context, 15) & (~(uintptr_t)0x1)); -} - -static inline void _Unwind_SetIP(struct _Unwind_Context* context, - uintptr_t new_value) { - uintptr_t thumb_bit = _Unwind_GetGR(context, 15) & ((uintptr_t)0x1); - _Unwind_SetGR(context, 15, new_value | thumb_bit); -} -#else extern uintptr_t _Unwind_GetGR(struct _Unwind_Context *context, int index); extern void _Unwind_SetGR(struct _Unwind_Context *context, int index, uintptr_t new_value); extern uintptr_t _Unwind_GetIP(struct _Unwind_Context *context); extern void _Unwind_SetIP(struct _Unwind_Context *, uintptr_t new_value); -#endif extern uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context *context); extern uintptr_t diff --git a/libcxxabi/src/Unwind/Unwind-EHABI.cpp b/libcxxabi/src/Unwind/Unwind-EHABI.cpp index eeefd3958d23..a1a1922c23f3 100644 --- a/libcxxabi/src/Unwind/Unwind-EHABI.cpp +++ b/libcxxabi/src/Unwind/Unwind-EHABI.cpp @@ -206,6 +206,28 @@ uint32_t RegisterRange(uint8_t start, uint8_t count_minus_one) { } // end anonymous namespace +uintptr_t _Unwind_GetGR(struct _Unwind_Context* context, int index) { + uintptr_t value = 0; + _Unwind_VRS_Get(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32, &value); + return value; +} + +void _Unwind_SetGR(struct _Unwind_Context* context, int index, uintptr_t + new_value) { + _Unwind_VRS_Set(context, _UVRSC_CORE, (uint32_t)index, + _UVRSD_UINT32, &new_value); +} + +uintptr_t _Unwind_GetIP(struct _Unwind_Context* context) { + // remove the thumb-bit before returning + return (_Unwind_GetGR(context, 15) & (~(uintptr_t)0x1)); +} + +void _Unwind_SetIP(struct _Unwind_Context* context, uintptr_t new_value) { + uintptr_t thumb_bit = _Unwind_GetGR(context, 15) & ((uintptr_t)0x1); + _Unwind_SetGR(context, 15, new_value | thumb_bit); +} + /** * Decodes an EHT entry. * diff --git a/libcxxabi/src/Unwind/UnwindCursor.hpp b/libcxxabi/src/Unwind/UnwindCursor.hpp index fa79afac3872..0350dfd2d954 100644 --- a/libcxxabi/src/Unwind/UnwindCursor.hpp +++ b/libcxxabi/src/Unwind/UnwindCursor.hpp @@ -638,7 +638,7 @@ struct EHABISectionIterator { } EHABISectionIterator(A& addressSpace, const UnwindInfoSections& sects, size_t i) - : _addressSpace(&addressSpace), _sects(§s), _i(i) {} + : _i(i), _addressSpace(&addressSpace), _sects(§s) {} _Self& operator++() { ++_i; return *this; } _Self& operator+=(size_t a) { _i += a; return *this; } diff --git a/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c b/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c index 601b3028f212..9a02052166b3 100644 --- a/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c +++ b/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c @@ -130,7 +130,7 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) { struct _Unwind_Context *context = (struct _Unwind_Context *)&cursor; size_t off; size_t len; - uint32_t* unwindInfo = (uint32_t *) frameInfo.unwind_info; + const uint32_t* unwindInfo = (uint32_t *) frameInfo.unwind_info; unwindInfo = decode_eht_entry(unwindInfo, &off, &len); if (unwindInfo == NULL) { return _URC_FAILURE;