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 26 extern "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 #elif defined(_ARM64_) 166 167 #define _JBLEN 24 168 #define _JBTYPE unsigned __int64 169 170 typedef struct __JUMP_BUFFER { 171 unsigned __int64 Frame; 172 unsigned __int64 Reserved; 173 unsigned __int64 X19; 174 unsigned __int64 X20; 175 unsigned __int64 X21; 176 unsigned __int64 X22; 177 unsigned __int64 X23; 178 unsigned __int64 X24; 179 unsigned __int64 X25; 180 unsigned __int64 X26; 181 unsigned __int64 X27; 182 unsigned __int64 X28; 183 unsigned __int64 Fp; 184 unsigned __int64 Lr; 185 unsigned __int64 Sp; 186 unsigned long Fpcr; 187 unsigned long Fpsr; 188 double D[8]; 189 } _JUMP_BUFFER; 190 191 #else 192 193 #define _JBLEN 1 194 #define _JBTYPE int 195 196 #endif 197 198 #ifndef _JMP_BUF_DEFINED 199 typedef _JBTYPE jmp_buf[_JBLEN]; 200 #define _JMP_BUF_DEFINED 201 #endif 202 203 void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 204 205 #if !defined(USE_NO_MINGW_SETJMP_TWO_ARGS) 206 # if __MSVCRT_VERSION__ >= 0x1400 207 # ifdef _WIN64 208 # define _setjmp __intrinsic_setjmpex 209 # else 210 # define _setjmp __intrinsic_setjmp 211 # endif 212 # endif 213 # ifndef _INC_SETJMPEX 214 # if defined(_X86_) || defined(__i386__) 215 # define setjmp(BUF) _setjmp3((BUF), NULL) 216 # elif defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) 217 # define setjmp(BUF) __mingw_setjmp((BUF)) 218 # define longjmp __mingw_longjmp 219 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __mingw_setjmp(jmp_buf _Buf); 220 # else 221 # if (__MINGW_GCC_VERSION < 40702) 222 # define setjmp(BUF) _setjmp((BUF), mingw_getsp()) 223 # else 224 # define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0)) 225 # endif 226 # endif 227 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx); 228 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx); 229 # else 230 # undef setjmp 231 # ifdef _WIN64 232 # if (__MINGW_GCC_VERSION < 40702) 233 # define setjmp(BUF) _setjmpex((BUF), mingw_getsp()) 234 # define setjmpex(BUF) _setjmpex((BUF), mingw_getsp()) 235 # else 236 # define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0)) 237 # define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0)) 238 # endif 239 # else 240 # define setjmp(BUF) _setjmpex((BUF), NULL) 241 # define setjmpex(BUF) _setjmpex((BUF), NULL) 242 # endif 243 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx); 244 # endif 245 246 #else 247 248 # if !defined(_INC_SETJMPEX) 249 # define setjmp _setjmp 250 # endif 251 252 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf); 253 #endif 254 255 __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/; 256 __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value); 257 258 #ifdef __cplusplus 259 } 260 #endif 261 262 #pragma pack(pop) 263 #endif 264