master
  1//===------------------------------- unwind.h -----------------------------===//
  2//
  3//                     The LLVM Compiler Infrastructure
  4//
  5// This file is dual licensed under the MIT and the University of Illinois Open
  6// Source Licenses. See LICENSE.TXT for details.
  7//
  8//
  9// C++ ABI Level 1 ABI documented at:
 10//   http://mentorembedded.github.io/cxx-abi/abi-eh.html
 11//
 12//===----------------------------------------------------------------------===//
 13
 14#ifndef _UNWIND_H
 15#define _UNWIND_H
 16
 17#include <stdint.h>
 18#include <stddef.h>
 19
 20typedef enum {
 21  _URC_NO_REASON = 0,
 22  _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
 23  _URC_FATAL_PHASE2_ERROR = 2,
 24  _URC_FATAL_PHASE1_ERROR = 3,
 25  _URC_NORMAL_STOP = 4,
 26  _URC_END_OF_STACK = 5,
 27  _URC_HANDLER_FOUND = 6,
 28  _URC_INSTALL_CONTEXT = 7,
 29  _URC_CONTINUE_UNWIND = 8
 30} _Unwind_Reason_Code;
 31
 32typedef enum {
 33  _UA_SEARCH_PHASE = 1,
 34  _UA_CLEANUP_PHASE = 2,
 35  _UA_HANDLER_FRAME = 4,
 36  _UA_FORCE_UNWIND = 8,
 37  _UA_END_OF_STACK = 16 /* GCC extension */
 38} _Unwind_Action;
 39
 40struct _Unwind_Context;
 41
 42struct _Unwind_Exception {
 43  uint64_t exception_class;
 44  void (*exception_cleanup)(_Unwind_Reason_Code, struct _Unwind_Exception *);
 45  uintptr_t private_1;
 46  uintptr_t private_2;
 47} __attribute__((__aligned__));
 48
 49typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)(int, _Unwind_Action, uint64_t,
 50                                               struct _Unwind_Exception *,
 51                                               struct _Unwind_Context *,
 52                                               void *);
 53
 54typedef _Unwind_Reason_Code (*__personality_routine)(int, _Unwind_Action,
 55                                                     uint64_t,
 56                                                     struct _Unwind_Exception *,
 57                                                     struct _Unwind_Context *);
 58
 59#ifdef _UNWIND_GCC_EXTENSIONS
 60struct dwarf_eh_bases {
 61  void *tbase;
 62  void *dbase;
 63  void *func;
 64};
 65#endif
 66
 67__BEGIN_DECLS
 68
 69_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *);
 70void _Unwind_Resume(struct _Unwind_Exception *) __dead;
 71_Unwind_Reason_Code _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *);
 72_Unwind_Reason_Code _Unwind_ForcedUnwind(struct _Unwind_Exception *,
 73                                         _Unwind_Stop_Fn, void *);
 74void _Unwind_DeleteException(struct _Unwind_Exception *);
 75uintptr_t _Unwind_GetGR(struct _Unwind_Context *, int);
 76void _Unwind_SetGR(struct _Unwind_Context *, int, uintptr_t);
 77uintptr_t _Unwind_GetIP(struct _Unwind_Context *);
 78uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *, int *);
 79uintptr_t _Unwind_GetCFA(struct _Unwind_Context *);
 80void _Unwind_SetIP(struct _Unwind_Context *, uintptr_t);
 81uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context *);
 82uintptr_t _Unwind_GetLanguageSpecificData(struct _Unwind_Context *);
 83uintptr_t _Unwind_GetDataRelBase(struct _Unwind_Context *);
 84uintptr_t _Unwind_GetTextRelBase(struct _Unwind_Context *);
 85
 86typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)(struct _Unwind_Context *,
 87                                                void *);
 88_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void *);
 89void *_Unwind_FindEnclosingFunction(void *);
 90
 91void __register_frame(const void *);
 92void __register_frame_info(const void *, void *);
 93void __deregister_frame(const void *);
 94void *__deregister_frame_info(const void *);
 95
 96#ifdef _UNWIND_GCC_EXTENSIONS
 97void *_Unwind_Find_FDE(void *, struct dwarf_eh_bases *);
 98#endif
 99
100__END_DECLS
101
102#endif // _UNWIND_H