unwind.h revision e7346c15021adbc9bc9b45fd28b7e56ebe88f49f
1d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola/*===---- unwind.h - Stack unwinding ----------------------------------------=== 2d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * 3d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * Permission is hereby granted, free of charge, to any person obtaining a copy 4d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * of this software and associated documentation files (the "Software"), to deal 5d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * in the Software without restriction, including without limitation the rights 6d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * copies of the Software, and to permit persons to whom the Software is 8d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * furnished to do so, subject to the following conditions: 9d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * 10d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * The above copyright notice and this permission notice shall be included in 11d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * all copies or substantial portions of the Software. 12d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * 13d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * THE SOFTWARE. 20d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola * 21d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola *===-----------------------------------------------------------------------=== 22d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola */ 23d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 24d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola/* See "Data Definitions for libgcc_s" in the Linux Standard Base.*/ 25d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 26ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#ifndef __CLANG_UNWIND_H 27ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#define __CLANG_UNWIND_H 28ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer 29f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin#if __has_include_next(<unwind.h>) 307dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne/* Darwin (from 11.x on) and libunwind provide an unwind.h. If that's available, 317dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne * use it. libunwind wraps some of its definitions in #ifdef _GNU_SOURCE, 32f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin * so define that around the include.*/ 33f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# ifndef _GNU_SOURCE 34f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# define _SHOULD_UNDEFINE_GNU_SOURCE 35f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# define _GNU_SOURCE 36f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# endif 37be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// libunwind's unwind.h reflects the current visibility. However, Mozilla 38be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// builds with -fvisibility=hidden and relies on gcc's unwind.h to reset the 39be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// visibility to default and export its contents. gcc also allows users to 40be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// override its override by #defining HIDE_EXPORTS (but note, this only obeys 41be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// the user's -fvisibility setting; it doesn't hide any exports on its own). We 42be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola// imitate gcc's header here: 43be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# ifdef HIDE_EXPORTS 44be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# include_next <unwind.h> 45be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# else 46be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# pragma GCC visibility push(default) 47be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# include_next <unwind.h> 48be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# pragma GCC visibility pop 49be5ff2f830d1833891051472d29818aa9f783cceRafael Espindola# endif 50f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# ifdef _SHOULD_UNDEFINE_GNU_SOURCE 51f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# undef _GNU_SOURCE 52f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# undef _SHOULD_UNDEFINE_GNU_SOURCE 53f18a87b1ce1be5ccc3b6b3dbd4f15374710e237bJeffrey Yasskin# endif 54d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#else 55d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 56d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#include <stdint.h> 57d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 58d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#ifdef __cplusplus 59d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindolaextern "C" { 60d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#endif 61d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 629b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola/* It is a bit strange for a header to play with the visibility of the 639b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola symbols it declares, but this matches gcc's behavior and some programs 649b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola depend on it */ 65ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#ifndef HIDE_EXPORTS 669b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola#pragma GCC visibility push(default) 67ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#endif 689b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola 697dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef uintptr_t _Unwind_Word; 707dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef intptr_t _Unwind_Sword; 717dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef uintptr_t _Unwind_Ptr; 727dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef uintptr_t _Unwind_Internal_Ptr; 737dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef uint64_t _Unwind_Exception_Class; 747dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 75347124d34566c4fef5a1673a30638e23304ba865Peter Collingbournetypedef intptr_t _sleb128_t; 76347124d34566c4fef5a1673a30638e23304ba865Peter Collingbournetypedef uintptr_t _uleb128_t; 77347124d34566c4fef5a1673a30638e23304ba865Peter Collingbourne 78d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindolastruct _Unwind_Context; 797dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournestruct _Unwind_Exception; 80d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindolatypedef enum { 81d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_NO_REASON = 0, 82d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_FOREIGN_EXCEPTION_CAUGHT = 1, 83d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 84d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_FATAL_PHASE2_ERROR = 2, 85d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_FATAL_PHASE1_ERROR = 3, 86d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_NORMAL_STOP = 4, 87d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 88d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_END_OF_STACK = 5, 89d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_HANDLER_FOUND = 6, 90d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_INSTALL_CONTEXT = 7, 91d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola _URC_CONTINUE_UNWIND = 8 92d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola} _Unwind_Reason_Code; 93d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 947dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef enum { 957dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _UA_SEARCH_PHASE = 1, 967dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _UA_CLEANUP_PHASE = 2, 977dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 987dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _UA_HANDLER_FRAME = 4, 997dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _UA_FORCE_UNWIND = 8, 1007dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _UA_END_OF_STACK = 16 /* gcc extension to C++ ABI */ 1017dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne} _Unwind_Action; 1027dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 1037dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef void (*_Unwind_Exception_Cleanup_Fn)(_Unwind_Reason_Code, 1047dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne struct _Unwind_Exception *); 1057dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 1067dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournestruct _Unwind_Exception { 1077dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _Unwind_Exception_Class exception_class; 1087dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _Unwind_Exception_Cleanup_Fn exception_cleanup; 1097dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _Unwind_Word private_1; 1107dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _Unwind_Word private_2; 1117dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne /* The Itanium ABI requires that _Unwind_Exception objects are "double-word 1127dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne * aligned". GCC has interpreted this to mean "use the maximum useful 1137dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne * alignment for the target"; so do we. */ 1147dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne} __attribute__((__aligned__)); 1157dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 1167dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)(int, _Unwind_Action, 1177dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne _Unwind_Exception_Class, 1187dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne struct _Unwind_Exception *, 1197dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne struct _Unwind_Context *, 1207dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne void *); 1217dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 122112586cef341143febbf6b781df6491c07db0e91Peter Collingbournetypedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)( 123112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, 124112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne struct _Unwind_Context *); 1257dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef _Unwind_Personality_Fn __personality_routine; 1267dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 127112586cef341143febbf6b781df6491c07db0e91Peter Collingbournetypedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)(struct _Unwind_Context *, 128112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne void *); 129f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 130e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg#if defined(__arm__) && !defined(__APPLE__) 131f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 13238c5d0a8f33f11661501760c67398e66e327e501Logan Chientypedef enum { 13338c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSC_CORE = 0, /* integer register */ 13438c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSC_VFP = 1, /* vfp */ 13538c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSC_WMMXD = 3, /* Intel WMMX data register */ 13638c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSC_WMMXC = 4 /* Intel WMMX control register */ 13738c5d0a8f33f11661501760c67398e66e327e501Logan Chien} _Unwind_VRS_RegClass; 13838c5d0a8f33f11661501760c67398e66e327e501Logan Chien 13938c5d0a8f33f11661501760c67398e66e327e501Logan Chientypedef enum { 14038c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSD_UINT32 = 0, 14138c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSD_VFPX = 1, 14238c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSD_UINT64 = 3, 14338c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSD_FLOAT = 4, 14438c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSD_DOUBLE = 5 14538c5d0a8f33f11661501760c67398e66e327e501Logan Chien} _Unwind_VRS_DataRepresentation; 14638c5d0a8f33f11661501760c67398e66e327e501Logan Chien 14738c5d0a8f33f11661501760c67398e66e327e501Logan Chientypedef enum { 14838c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSR_OK = 0, 14938c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSR_NOT_IMPLEMENTED = 1, 15038c5d0a8f33f11661501760c67398e66e327e501Logan Chien _UVRSR_FAILED = 2 15138c5d0a8f33f11661501760c67398e66e327e501Logan Chien} _Unwind_VRS_Result; 152f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 1534f918aed75d4927e88365541c7200f0b5fe5014bDavid Blaikie_Unwind_VRS_Result _Unwind_VRS_Get(struct _Unwind_Context *__context, 1544f918aed75d4927e88365541c7200f0b5fe5014bDavid Blaikie _Unwind_VRS_RegClass __regclass, 1554f918aed75d4927e88365541c7200f0b5fe5014bDavid Blaikie uint32_t __regno, 1564f918aed75d4927e88365541c7200f0b5fe5014bDavid Blaikie _Unwind_VRS_DataRepresentation __representation, 1574f918aed75d4927e88365541c7200f0b5fe5014bDavid Blaikie void *__valuep); 158f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 159e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg_Unwind_VRS_Result _Unwind_VRS_Set(struct _Unwind_Context *__context, 160e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_VRS_RegClass __regclass, 161e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg uint32_t __regno, 162e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_VRS_DataRepresentation __representation, 163e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg void *__valuep); 1647dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 165e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgstatic __inline__ 166e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg_Unwind_Word _Unwind_GetGR(struct _Unwind_Context *__context, int __index) { 167e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_Word __value; 168e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_VRS_Get(__context, _UVRSC_CORE, __index, _UVRSD_UINT32, &__value); 169e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg return __value; 170e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg} 171e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg 172e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgstatic __inline__ 173e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgvoid _Unwind_SetGR(struct _Unwind_Context *__context, int __index, 174e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_Word __value) { 175e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_VRS_Set(__context, _UVRSC_CORE, __index, _UVRSD_UINT32, &__value); 176e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg} 177e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg 178e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgstatic __inline__ 179e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg_Unwind_Word _Unwind_GetIP(struct _Unwind_Context *__context) { 180e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_Word __ip = _Unwind_GetGR(__context, 15); 181e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg return __ip & ~(_Unwind_Word)(0x1); /* Remove thumb mode bit. */ 182e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg} 183e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg 184e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgstatic __inline__ 185e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborgvoid _Unwind_SetIP(struct _Unwind_Context *__context, _Unwind_Word __value) { 186e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_Word __thumb_mode_bit = _Unwind_GetGR(__context, 15) & 0x1; 187e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg _Unwind_SetGR(__context, 15, __value | __thumb_mode_bit); 188e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg} 189e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg#else 1907dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Word _Unwind_GetGR(struct _Unwind_Context *, int); 1917dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_SetGR(struct _Unwind_Context *, int, _Unwind_Word); 1927dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 1937dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Word _Unwind_GetIP(struct _Unwind_Context *); 1947dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_SetIP(struct _Unwind_Context *, _Unwind_Word); 195e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg#endif 196e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg 197e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg 198e7346c15021adbc9bc9b45fd28b7e56ebe88f49fHans Wennborg_Unwind_Word _Unwind_GetIPInfo(struct _Unwind_Context *, int *); 1997dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2007dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Word _Unwind_GetCFA(struct _Unwind_Context *); 2017dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2027dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid *_Unwind_GetLanguageSpecificData(struct _Unwind_Context *); 2037dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2047dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Ptr _Unwind_GetRegionStart(struct _Unwind_Context *); 2057dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2067dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne/* DWARF EH functions; currently not available on Darwin/ARM */ 2077dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne#if !defined(__APPLE__) || !defined(__arm__) 2087dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2097dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *); 210112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne_Unwind_Reason_Code _Unwind_ForcedUnwind(struct _Unwind_Exception *, 211112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne _Unwind_Stop_Fn, void *); 2127dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_DeleteException(struct _Unwind_Exception *); 2137dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_Resume(struct _Unwind_Exception *); 2147dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Reason_Code _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *); 2157dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2167dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne#endif 2177dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2187dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void *); 2197dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2207dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne/* setjmp(3)/longjmp(3) stuff */ 2217dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournetypedef struct SjLj_Function_Context *_Unwind_FunctionContext_t; 2227dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2237dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_SjLj_Register(_Unwind_FunctionContext_t); 2247dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_SjLj_Unregister(_Unwind_FunctionContext_t); 2257dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Reason_Code _Unwind_SjLj_RaiseException(struct _Unwind_Exception *); 226112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne_Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind(struct _Unwind_Exception *, 227112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne _Unwind_Stop_Fn, void *); 2287dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid _Unwind_SjLj_Resume(struct _Unwind_Exception *); 2297dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow(struct _Unwind_Exception *); 2307dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2317dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid *_Unwind_FindEnclosingFunction(void *); 2327dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2337dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne#ifdef __APPLE__ 2347dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 235112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne_Unwind_Ptr _Unwind_GetDataRelBase(struct _Unwind_Context *) 236112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne __attribute__((unavailable)); 237112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne_Unwind_Ptr _Unwind_GetTextRelBase(struct _Unwind_Context *) 238112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne __attribute__((unavailable)); 2397dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2407dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne/* Darwin-specific functions */ 2417dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __register_frame(const void *); 2427dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __deregister_frame(const void *); 2437dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2447dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournestruct dwarf_eh_bases { 2457dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne uintptr_t tbase; 2467dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne uintptr_t dbase; 2477dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne uintptr_t func; 2487dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne}; 2497dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid *_Unwind_Find_FDE(const void *, struct dwarf_eh_bases *); 2507dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 2517dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __register_frame_info_bases(const void *, void *, void *, void *) 2527dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne __attribute__((unavailable)); 2537dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __register_frame_info(const void *, void *) __attribute__((unavailable)); 2547dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __register_frame_info_table_bases(const void *, void*, void *, void *) 2557dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne __attribute__((unavailable)); 256112586cef341143febbf6b781df6491c07db0e91Peter Collingbournevoid __register_frame_info_table(const void *, void *) 257112586cef341143febbf6b781df6491c07db0e91Peter Collingbourne __attribute__((unavailable)); 2587dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __register_frame_table(const void *) __attribute__((unavailable)); 2597dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __deregister_frame_info(const void *) __attribute__((unavailable)); 2607dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbournevoid __deregister_frame_info_bases(const void *)__attribute__((unavailable)); 2617dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne 262f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov#else 263f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 2647dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Ptr _Unwind_GetDataRelBase(struct _Unwind_Context *); 2657dc8e8175a3a1d4e40819932165e26b01091541ePeter Collingbourne_Unwind_Ptr _Unwind_GetTextRelBase(struct _Unwind_Context *); 266f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 267f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov#endif 268f5f18bfde0e46c154cf0207c895f917d0b50d53fEvgeniy Stepanov 269d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 270ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#ifndef HIDE_EXPORTS 2719b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola#pragma GCC visibility pop 272ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#endif 2739b7568da31b0dc97e15253391cb100e9958d3d78Rafael Espindola 274d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#ifdef __cplusplus 275d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola} 276d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#endif 277d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola 278d85c1e9800213d2a8750215f6980ae67411cac72Rafael Espindola#endif 279ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer 280ccdb2a5e0ab4b0a7fc9d3859c6bb1676182169d5Benjamin Kramer#endif /* __CLANG_UNWIND_H */ 281