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 #endif 145 146 #ifndef _JMP_BUF_DEFINED 147 typedef _JBTYPE jmp_buf[_JBLEN]; 148 #define _JMP_BUF_DEFINED 149 #endif 150 151 void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 152 153 #ifndef USE_NO_MINGW_SETJMP_TWO_ARGS 154 # ifndef _INC_SETJMPEX 155 # ifdef _WIN64 156 # if (__MINGW_GCC_VERSION < 40702) 157 # define setjmp(BUF) _setjmp((BUF), mingw_getsp()) 158 # else 159 # define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0)) 160 # endif 161 # else 162 # define setjmp(BUF) _setjmp3((BUF), NULL) 163 # endif 164 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx); 165 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx); 166 # else 167 # undef setjmp 168 # ifdef _WIN64 169 # if (__MINGW_GCC_VERSION < 40702) 170 # define setjmp(BUF) _setjmpex((BUF), mingw_getsp()) 171 # define setjmpex(BUF) _setjmpex((BUF), mingw_getsp()) 172 # else 173 # define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0)) 174 # define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0)) 175 # endif 176 # else 177 # define setjmp(BUF) _setjmpex((BUF), NULL) 178 # define setjmpex(BUF) _setjmpex((BUF), NULL) 179 # endif 180 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx); 181 # endif 182 183 #else 184 185 # ifndef _INC_SETJMPEX 186 # define setjmp _setjmp 187 # endif 188 189 int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf); 190 #endif 191 192 __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/; 193 __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value); 194 195 #ifdef __cplusplus 196 } 197 #endif 198 199 #pragma pack(pop) 200 #endif 201