summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLogan Chien <tzuhsiang.chien@gmail.com>2015-01-22 13:25:55 +0000
committerLogan Chien <tzuhsiang.chien@gmail.com>2015-01-22 13:25:55 +0000
commitad3ce5d4bbd9d9e4eff05eaf2d9b74799469c047 (patch)
treef9dd7d47a14a6daa7e6bf814ec0612ddc59e79a4 /include
parentac68492bc94f7d812b40e90038227ef69e245416 (diff)
Remove _Unwind_{Get,Set}{GR,IP} from ARM EHABI build.
This commit partially reverts r219629. This functions are not a part of ARM EHABI specification, and AFAIK, the de facto implementation does not export these functions. Without this change, any programs compiled with this unwind.h will be incompatible with other implementations due to linkage error. git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@226818 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/unwind.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/include/unwind.h b/include/unwind.h
index 1e517b6..ad91d25 100644
--- a/include/unwind.h
+++ b/include/unwind.h
@@ -208,11 +208,37 @@ _Unwind_VRS_Pop(_Unwind_Context *context, _Unwind_VRS_RegClass regclass,
_Unwind_VRS_DataRepresentation representation);
#endif
+#if LIBCXXABI_ARM_EHABI
+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