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(__i386__)
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 /* Following fields are only for new _setjmp3(), the are not for old _setjmp(). */
44 unsigned long Cookie;
45 unsigned long UnwindFunc;
46 unsigned long UnwindData[6];
47 } _JUMP_BUFFER;
48
49#elif defined(__ia64__)
50
51 typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
52 __MINGW_EXTENSION __int64 LowPart;
53 __MINGW_EXTENSION __int64 HighPart;
54 } SETJMP_FLOAT128;
55
56#define _JBLEN 33
57 typedef SETJMP_FLOAT128 _JBTYPE;
58
59 typedef struct __JUMP_BUFFER {
60
61 unsigned long iAReserved[6];
62
63 unsigned long Registration;
64 unsigned long TryLevel;
65 unsigned long Cookie;
66 unsigned long UnwindFunc;
67
68 unsigned long UnwindData[6];
69
70 SETJMP_FLOAT128 FltS0;
71 SETJMP_FLOAT128 FltS1;
72 SETJMP_FLOAT128 FltS2;
73 SETJMP_FLOAT128 FltS3;
74 SETJMP_FLOAT128 FltS4;
75 SETJMP_FLOAT128 FltS5;
76 SETJMP_FLOAT128 FltS6;
77 SETJMP_FLOAT128 FltS7;
78 SETJMP_FLOAT128 FltS8;
79 SETJMP_FLOAT128 FltS9;
80 SETJMP_FLOAT128 FltS10;
81 SETJMP_FLOAT128 FltS11;
82 SETJMP_FLOAT128 FltS12;
83 SETJMP_FLOAT128 FltS13;
84 SETJMP_FLOAT128 FltS14;
85 SETJMP_FLOAT128 FltS15;
86 SETJMP_FLOAT128 FltS16;
87 SETJMP_FLOAT128 FltS17;
88 SETJMP_FLOAT128 FltS18;
89 SETJMP_FLOAT128 FltS19;
90 __MINGW_EXTENSION __int64 FPSR;
91 __MINGW_EXTENSION __int64 StIIP;
92 __MINGW_EXTENSION __int64 BrS0;
93 __MINGW_EXTENSION __int64 BrS1;
94 __MINGW_EXTENSION __int64 BrS2;
95 __MINGW_EXTENSION __int64 BrS3;
96 __MINGW_EXTENSION __int64 BrS4;
97 __MINGW_EXTENSION __int64 IntS0;
98 __MINGW_EXTENSION __int64 IntS1;
99 __MINGW_EXTENSION __int64 IntS2;
100 __MINGW_EXTENSION __int64 IntS3;
101 __MINGW_EXTENSION __int64 RsBSP;
102 __MINGW_EXTENSION __int64 RsPFS;
103 __MINGW_EXTENSION __int64 ApUNAT;
104 __MINGW_EXTENSION __int64 ApLC;
105 __MINGW_EXTENSION __int64 IntSp;
106 __MINGW_EXTENSION __int64 IntNats;
107 __MINGW_EXTENSION __int64 Preds;
108
109 } _JUMP_BUFFER;
110
111#elif defined(__x86_64__)
112
113 typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
114 __MINGW_EXTENSION unsigned __int64 Part[2];
115 } SETJMP_FLOAT128;
116
117#define _JBLEN 16
118 typedef SETJMP_FLOAT128 _JBTYPE;
119
120 typedef struct _JUMP_BUFFER {
121 __MINGW_EXTENSION unsigned __int64 Frame;
122 __MINGW_EXTENSION unsigned __int64 Rbx;
123 __MINGW_EXTENSION unsigned __int64 Rsp;
124 __MINGW_EXTENSION unsigned __int64 Rbp;
125 __MINGW_EXTENSION unsigned __int64 Rsi;
126 __MINGW_EXTENSION unsigned __int64 Rdi;
127 __MINGW_EXTENSION unsigned __int64 R12;
128 __MINGW_EXTENSION unsigned __int64 R13;
129 __MINGW_EXTENSION unsigned __int64 R14;
130 __MINGW_EXTENSION unsigned __int64 R15;
131 __MINGW_EXTENSION unsigned __int64 Rip;
132 unsigned long MxCsr;
133 unsigned short FpCsr;
134 unsigned short Spare;
135 SETJMP_FLOAT128 Xmm6;
136 SETJMP_FLOAT128 Xmm7;
137 SETJMP_FLOAT128 Xmm8;
138 SETJMP_FLOAT128 Xmm9;
139 SETJMP_FLOAT128 Xmm10;
140 SETJMP_FLOAT128 Xmm11;
141 SETJMP_FLOAT128 Xmm12;
142 SETJMP_FLOAT128 Xmm13;
143 SETJMP_FLOAT128 Xmm14;
144 SETJMP_FLOAT128 Xmm15;
145 } _JUMP_BUFFER;
146
147#elif defined(_ARM_)
148
149#define _JBLEN 28
150#define _JBTYPE int
151
152 typedef struct __JUMP_BUFFER {
153 unsigned long Frame;
154 unsigned long R4;
155 unsigned long R5;
156 unsigned long R6;
157 unsigned long R7;
158 unsigned long R8;
159 unsigned long R9;
160 unsigned long R10;
161 unsigned long R11;
162 unsigned long Sp;
163 unsigned long Pc;
164 unsigned long Fpscr;
165 unsigned long long D[8];
166 } _JUMP_BUFFER;
167
168#elif defined(_ARM64_)
169
170#define _JBLEN 24
171#define _JBTYPE unsigned __int64
172
173 typedef struct __JUMP_BUFFER {
174 unsigned __int64 Frame;
175 unsigned __int64 Reserved;
176 unsigned __int64 X19;
177 unsigned __int64 X20;
178 unsigned __int64 X21;
179 unsigned __int64 X22;
180 unsigned __int64 X23;
181 unsigned __int64 X24;
182 unsigned __int64 X25;
183 unsigned __int64 X26;
184 unsigned __int64 X27;
185 unsigned __int64 X28;
186 unsigned __int64 Fp;
187 unsigned __int64 Lr;
188 unsigned __int64 Sp;
189 unsigned long Fpcr;
190 unsigned long Fpsr;
191 double D[8];
192 } _JUMP_BUFFER;
193
194#else
195
196#define _JBLEN 1
197#define _JBTYPE int
198
199#endif
200
201#ifndef _JMP_BUF_DEFINED
202 typedef _JBTYPE jmp_buf[_JBLEN];
203#define _JMP_BUF_DEFINED
204#endif
205
206_CRTIMP __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf, int _Value); /* for setjmp.h and non-i386 setjmpex.h */
207#ifdef __i386__
208_CRTIMP __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl _longjmpex(jmp_buf _Buf, int _Value); /* for i386 setjmpex.h */
209#endif
210
211#ifdef __i386__
212_CRTIMP int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf); /* old i386 crtdll setjmp.h */
213_CRTIMP int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, int _Count, ...); /* new i386 msvcrt20+ setjmp.h and setjmpex.h */
214#else
215#ifndef __aarch64__
216_CRTIMP int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Frame); /* for non-i386 and non-aarch64 setjmp.h */
217#endif
218_CRTIMP int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf, void *_Frame); /* for non-i386 setjmpex.h and aarch64 setjmp.h */
219#endif
220
221#if defined(__arm__) || defined(__aarch64__)
222int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __mingw_setjmp(jmp_buf _Buf);
223__MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __mingw_longjmp(jmp_buf _Buf, int _Value);
224#endif
225
226void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void);
227
228#ifdef __cplusplus
229}
230#endif
231
232#pragma pack(pop)
233#endif /* _INC_SETJMP */
234
235/*
236 * Now outside of the _INC_SETJMP block, defines setjmp() and longjmp().
237 * It allows '#include <setjmpex.h>' to override the existing setjmp() and longjmp() definitions.
238 */
239
240#pragma push_macro("__has_builtin")
241#ifndef __has_builtin
242 #define __has_builtin(x) 0
243#endif
244
245#ifdef setjmp
246# undef setjmp
247#endif
248#if defined(__i386__)
249# define setjmp(BUF) _setjmp3((BUF), 0)
250#elif !defined(_INC_SETJMPEX) && (!defined(__SEH__) || defined(__USE_MINGW_SETJMP_NON_SEH))
251# if defined(__arm__) || defined(__aarch64__)
252# define setjmp(BUF) __mingw_setjmp((BUF))
253# else
254# define setjmp(BUF) _setjmp((BUF), NULL)
255# endif
256#elif !defined(_INC_SETJMPEX) && !defined(__aarch64__)
257# if __has_builtin(__builtin_sponentry)
258# define setjmp(BUF) _setjmp((BUF), __builtin_sponentry())
259# elif (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
260# define setjmp(BUF) _setjmp((BUF), mingw_getsp())
261# else
262# define setjmp(BUF) _setjmp((BUF), __builtin_frame_address(0))
263# endif
264#else
265# if __has_builtin(__builtin_sponentry)
266# define setjmp(BUF) _setjmpex((BUF), __builtin_sponentry())
267# elif (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
268# define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
269# else
270# define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address(0))
271# endif
272#endif
273
274#ifdef longjmp
275# undef longjmp
276#endif
277#if defined(_INC_SETJMPEX) && defined(__i386__)
278# define longjmp _longjmpex
279#elif !defined(_INC_SETJMPEX) && (!defined(__SEH__) || defined(__USE_MINGW_SETJMP_NON_SEH)) && (defined(__arm__) || defined(__aarch64__))
280# define longjmp __mingw_longjmp
281#else
282# define longjmp longjmp
283#endif
284
285#pragma pop_macro("__has_builtin")