setjmp.h 7.3 KB

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