master
  1/**
  2 * This file has no copyright assigned and is placed in the Public Domain.
  3 * This file is part of the mingw-w64 runtime package.
  4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5 */
  6#ifndef _INC_SETJMP
  7#define _INC_SETJMP
  8
  9#include <crtdefs.h>
 10
 11#pragma pack(push,_CRT_PACKING)
 12
 13#ifndef NULL
 14#ifdef __cplusplus
 15#ifndef _WIN64
 16#define NULL 0
 17#else
 18#define NULL 0LL
 19#endif  /* W64 */
 20#else
 21#define NULL ((void *)0)
 22#endif
 23#endif
 24
 25#ifdef __cplusplus
 26extern "C" {
 27#endif
 28
 29#if (defined(_X86_) && !defined(__x86_64))
 30
 31#define _JBLEN 16
 32#define _JBTYPE int
 33
 34  typedef struct __JUMP_BUFFER {
 35    unsigned long Ebp;
 36    unsigned long Ebx;
 37    unsigned long Edi;
 38    unsigned long Esi;
 39    unsigned long Esp;
 40    unsigned long Eip;
 41    unsigned long Registration;
 42    unsigned long TryLevel;
 43    unsigned long Cookie;
 44    unsigned long UnwindFunc;
 45    unsigned long UnwindData[6];
 46  } _JUMP_BUFFER;
 47
 48#elif defined(__ia64__)
 49
 50  typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
 51    __MINGW_EXTENSION __int64 LowPart;
 52    __MINGW_EXTENSION __int64 HighPart;
 53  } SETJMP_FLOAT128;
 54
 55#define _JBLEN 33
 56  typedef SETJMP_FLOAT128 _JBTYPE;
 57
 58  typedef struct __JUMP_BUFFER {
 59
 60    unsigned long iAReserved[6];
 61
 62    unsigned long Registration;
 63    unsigned long TryLevel;
 64    unsigned long Cookie;
 65    unsigned long UnwindFunc;
 66
 67    unsigned long UnwindData[6];
 68
 69    SETJMP_FLOAT128 FltS0;
 70    SETJMP_FLOAT128 FltS1;
 71    SETJMP_FLOAT128 FltS2;
 72    SETJMP_FLOAT128 FltS3;
 73    SETJMP_FLOAT128 FltS4;
 74    SETJMP_FLOAT128 FltS5;
 75    SETJMP_FLOAT128 FltS6;
 76    SETJMP_FLOAT128 FltS7;
 77    SETJMP_FLOAT128 FltS8;
 78    SETJMP_FLOAT128 FltS9;
 79    SETJMP_FLOAT128 FltS10;
 80    SETJMP_FLOAT128 FltS11;
 81    SETJMP_FLOAT128 FltS12;
 82    SETJMP_FLOAT128 FltS13;
 83    SETJMP_FLOAT128 FltS14;
 84    SETJMP_FLOAT128 FltS15;
 85    SETJMP_FLOAT128 FltS16;
 86    SETJMP_FLOAT128 FltS17;
 87    SETJMP_FLOAT128 FltS18;
 88    SETJMP_FLOAT128 FltS19;
 89    __MINGW_EXTENSION __int64 FPSR;
 90    __MINGW_EXTENSION __int64 StIIP;
 91    __MINGW_EXTENSION __int64 BrS0;
 92    __MINGW_EXTENSION __int64 BrS1;
 93    __MINGW_EXTENSION __int64 BrS2;
 94    __MINGW_EXTENSION __int64 BrS3;
 95    __MINGW_EXTENSION __int64 BrS4;
 96    __MINGW_EXTENSION __int64 IntS0;
 97    __MINGW_EXTENSION __int64 IntS1;
 98    __MINGW_EXTENSION __int64 IntS2;
 99    __MINGW_EXTENSION __int64 IntS3;
100    __MINGW_EXTENSION __int64 RsBSP;
101    __MINGW_EXTENSION __int64 RsPFS;
102    __MINGW_EXTENSION __int64 ApUNAT;
103    __MINGW_EXTENSION __int64 ApLC;
104    __MINGW_EXTENSION __int64 IntSp;
105    __MINGW_EXTENSION __int64 IntNats;
106    __MINGW_EXTENSION __int64 Preds;
107
108  } _JUMP_BUFFER;
109
110#elif defined(__x86_64)
111
112  typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
113    __MINGW_EXTENSION unsigned __int64 Part[2];
114  } SETJMP_FLOAT128;
115
116#define _JBLEN 16
117  typedef SETJMP_FLOAT128 _JBTYPE;
118
119  typedef struct _JUMP_BUFFER {
120    __MINGW_EXTENSION unsigned __int64 Frame;
121    __MINGW_EXTENSION unsigned __int64 Rbx;
122    __MINGW_EXTENSION unsigned __int64 Rsp;
123    __MINGW_EXTENSION unsigned __int64 Rbp;
124    __MINGW_EXTENSION unsigned __int64 Rsi;
125    __MINGW_EXTENSION unsigned __int64 Rdi;
126    __MINGW_EXTENSION unsigned __int64 R12;
127    __MINGW_EXTENSION unsigned __int64 R13;
128    __MINGW_EXTENSION unsigned __int64 R14;
129    __MINGW_EXTENSION unsigned __int64 R15;
130    __MINGW_EXTENSION unsigned __int64 Rip;
131    unsigned long MxCsr;
132    unsigned short FpCsr;
133    unsigned short Spare;
134    SETJMP_FLOAT128 Xmm6;
135    SETJMP_FLOAT128 Xmm7;
136    SETJMP_FLOAT128 Xmm8;
137    SETJMP_FLOAT128 Xmm9;
138    SETJMP_FLOAT128 Xmm10;
139    SETJMP_FLOAT128 Xmm11;
140    SETJMP_FLOAT128 Xmm12;
141    SETJMP_FLOAT128 Xmm13;
142    SETJMP_FLOAT128 Xmm14;
143    SETJMP_FLOAT128 Xmm15;
144  } _JUMP_BUFFER;
145
146#elif defined(_ARM_)
147
148#define _JBLEN 28
149#define _JBTYPE int
150
151  typedef struct __JUMP_BUFFER {
152    unsigned long Frame;
153    unsigned long R4;
154    unsigned long R5;
155    unsigned long R6;
156    unsigned long R7;
157    unsigned long R8;
158    unsigned long R9;
159    unsigned long R10;
160    unsigned long R11;
161    unsigned long Sp;
162    unsigned long Pc;
163    unsigned long Fpscr;
164    unsigned long long D[8];
165  } _JUMP_BUFFER;
166
167#elif defined(_ARM64_)
168
169#define _JBLEN 24
170#define _JBTYPE unsigned __int64
171
172  typedef struct __JUMP_BUFFER {
173    unsigned __int64 Frame;
174    unsigned __int64 Reserved;
175    unsigned __int64 X19;
176    unsigned __int64 X20;
177    unsigned __int64 X21;
178    unsigned __int64 X22;
179    unsigned __int64 X23;
180    unsigned __int64 X24;
181    unsigned __int64 X25;
182    unsigned __int64 X26;
183    unsigned __int64 X27;
184    unsigned __int64 X28;
185    unsigned __int64 Fp;
186    unsigned __int64 Lr;
187    unsigned __int64 Sp;
188    unsigned long Fpcr;
189    unsigned long Fpsr;
190    double D[8];
191  } _JUMP_BUFFER;
192
193#else
194
195#define _JBLEN 1
196#define _JBTYPE int
197
198#endif
199
200#ifndef _JMP_BUF_DEFINED
201  typedef _JBTYPE jmp_buf[_JBLEN];
202#define _JMP_BUF_DEFINED
203#endif
204
205_CRTIMP __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value);
206
207void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void);
208
209#pragma push_macro("__has_builtin")
210#ifndef __has_builtin
211  #define __has_builtin(x) 0
212#endif
213
214#ifdef _UCRT
215#  ifdef _WIN64
216#    define _setjmp __intrinsic_setjmpex
217#  else
218#    define _setjmp __intrinsic_setjmp
219#  endif
220#elif defined(__aarch64__)
221     /* ARM64 msvcrt.dll lacks _setjmp, only has _setjmpex. */
222#  define _setjmp _setjmpex
223#endif
224#ifndef _INC_SETJMPEX
225#  if defined(_X86_) || defined(__i386__)
226#    define setjmp(BUF) _setjmp3((BUF), NULL)
227#  elif !defined(__SEH__) || defined(__USE_MINGW_SETJMP_NON_SEH)
228#    if defined(__arm__) || defined(__aarch64__)
229#      define setjmp(BUF) __mingw_setjmp((BUF))
230#      define longjmp __mingw_longjmp
231      int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __mingw_setjmp(jmp_buf _Buf);
232      __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __mingw_longjmp(jmp_buf _Buf,int _Value);
233#    else
234#      define setjmp(BUF) _setjmp((BUF), NULL)
235#    endif
236#  elif __has_builtin(__builtin_sponentry)
237#    define setjmp(BUF) _setjmp((BUF), __builtin_sponentry())
238#  elif (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
239#    define setjmp(BUF) _setjmp((BUF), mingw_getsp())
240#  else
241#    define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0))
242#  endif
243  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx);
244  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx);
245#else
246#  undef setjmp
247#  ifdef __SEH__
248#    if (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
249#      define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
250#      define setjmpex(BUF) _setjmpex((BUF), mingw_getsp())
251#    else
252#      define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0))
253#      define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0))
254#    endif
255#  else
256#    define setjmp(BUF) _setjmpex((BUF), NULL)
257#    define setjmpex(BUF) _setjmpex((BUF), NULL)
258#  endif
259  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx);
260#endif
261
262#pragma pop_macro("__has_builtin")
263
264#ifdef __cplusplus
265}
266#endif
267
268#pragma pack(pop)
269#endif