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    __MINGW_EXTENSION unsigned __int64 Spare;
132    SETJMP_FLOAT128 Xmm6;
133    SETJMP_FLOAT128 Xmm7;
134    SETJMP_FLOAT128 Xmm8;
135    SETJMP_FLOAT128 Xmm9;
136    SETJMP_FLOAT128 Xmm10;
137    SETJMP_FLOAT128 Xmm11;
138    SETJMP_FLOAT128 Xmm12;
139    SETJMP_FLOAT128 Xmm13;
140    SETJMP_FLOAT128 Xmm14;
141    SETJMP_FLOAT128 Xmm15;
142  } _JUMP_BUFFER;
143
144#elif defined(_ARM_)
145
146#define _JBLEN 28
147#define _JBTYPE int
148
149  typedef struct __JUMP_BUFFER {
150    unsigned long Frame;
151    unsigned long R4;
152    unsigned long R5;
153    unsigned long R6;
154    unsigned long R7;
155    unsigned long R8;
156    unsigned long R9;
157    unsigned long R10;
158    unsigned long R11;
159    unsigned long Sp;
160    unsigned long Pc;
161    unsigned long Fpscr;
162    unsigned long long D[8];
163  } _JUMP_BUFFER;
164
165#endif
166
167#ifndef _JMP_BUF_DEFINED
168  typedef _JBTYPE jmp_buf[_JBLEN];
169#define _JMP_BUF_DEFINED
170#endif
171
172void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void);
173
174#ifndef USE_NO_MINGW_SETJMP_TWO_ARGS
175#  ifndef _INC_SETJMPEX
176#    ifdef _WIN64
177#     if (__MINGW_GCC_VERSION < 40702)
178#      define setjmp(BUF) _setjmp((BUF), mingw_getsp())
179#     else
180#      define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0))
181#     endif
182#    else
183#      define setjmp(BUF) _setjmp3((BUF), NULL)
184#    endif
185  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx);
186  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx);
187#  else
188#    undef setjmp
189#    ifdef _WIN64
190#     if (__MINGW_GCC_VERSION < 40702)
191#      define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
192#      define setjmpex(BUF) _setjmpex((BUF), mingw_getsp())
193#     else
194#      define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0))
195#      define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0))
196#     endif
197#    else
198#      define setjmp(BUF) _setjmpex((BUF), NULL)
199#      define setjmpex(BUF) _setjmpex((BUF), NULL)
200#    endif
201  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx);
202#  endif
203
204#else
205
206#  ifndef _INC_SETJMPEX
207#    define setjmp _setjmp
208#  endif
209
210  int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf);
211#endif
212
213  __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/;
214  __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value);
215
216#ifdef __cplusplus
217}
218#endif
219
220#pragma pack(pop)
221#endif
222