From b44ad60835fd3663e135ed231a5791f4efc21861 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Mon, 13 Oct 2014 21:01:30 +0000 Subject: [PATCH] Correctly export _Unwind_[GS]et(GR|IP) for EHABI. These need to have normal linkage instead of being static inline as many libraries expect to be able to declare these and have the linker find them rather than needing to include the header. http://mentorembedded.github.io/cxx-abi/abi-eh.html Also clean up some warnings while I'm here. Reviewers: jroelofs, kledzik Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D5754 llvm-svn: 219629 --- libcxxabi/include/unwind.h | 26 +------------------------- libcxxabi/src/Unwind/Unwind-EHABI.cpp | 22 ++++++++++++++++++++++ libcxxabi/src/Unwind/UnwindCursor.hpp | 2 +- libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c | 2 +- 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/libcxxabi/include/unwind.h b/libcxxabi/include/unwind.h index dd82bc9..1e517b6 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 eeefd39..a1a1922 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 fa79afa..0350dfd 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 601b3028..9a02052 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; -- 2.7.4