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