zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

setjmp.h (7129B) - Raw


      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     unsigned long MxCsr;
    132     unsigned short FpCsr;
    133     unsigned short Spare;
    134     SETJMP_FLOAT128 Xmm6;
    135     SETJMP_FLOAT128 Xmm7;
    136     SETJMP_FLOAT128 Xmm8;
    137     SETJMP_FLOAT128 Xmm9;
    138     SETJMP_FLOAT128 Xmm10;
    139     SETJMP_FLOAT128 Xmm11;
    140     SETJMP_FLOAT128 Xmm12;
    141     SETJMP_FLOAT128 Xmm13;
    142     SETJMP_FLOAT128 Xmm14;
    143     SETJMP_FLOAT128 Xmm15;
    144   } _JUMP_BUFFER;
    145 
    146 #elif defined(_ARM_)
    147 
    148 #define _JBLEN 28
    149 #define _JBTYPE int
    150 
    151   typedef struct __JUMP_BUFFER {
    152     unsigned long Frame;
    153     unsigned long R4;
    154     unsigned long R5;
    155     unsigned long R6;
    156     unsigned long R7;
    157     unsigned long R8;
    158     unsigned long R9;
    159     unsigned long R10;
    160     unsigned long R11;
    161     unsigned long Sp;
    162     unsigned long Pc;
    163     unsigned long Fpscr;
    164     unsigned long long D[8];
    165   } _JUMP_BUFFER;
    166 
    167 #elif defined(_ARM64_)
    168 
    169 #define _JBLEN 24
    170 #define _JBTYPE unsigned __int64
    171 
    172   typedef struct __JUMP_BUFFER {
    173     unsigned __int64 Frame;
    174     unsigned __int64 Reserved;
    175     unsigned __int64 X19;
    176     unsigned __int64 X20;
    177     unsigned __int64 X21;
    178     unsigned __int64 X22;
    179     unsigned __int64 X23;
    180     unsigned __int64 X24;
    181     unsigned __int64 X25;
    182     unsigned __int64 X26;
    183     unsigned __int64 X27;
    184     unsigned __int64 X28;
    185     unsigned __int64 Fp;
    186     unsigned __int64 Lr;
    187     unsigned __int64 Sp;
    188     unsigned long Fpcr;
    189     unsigned long Fpsr;
    190     double D[8];
    191   } _JUMP_BUFFER;
    192 
    193 #else
    194 
    195 #define _JBLEN 1
    196 #define _JBTYPE int
    197 
    198 #endif
    199 
    200 #ifndef _JMP_BUF_DEFINED
    201   typedef _JBTYPE jmp_buf[_JBLEN];
    202 #define _JMP_BUF_DEFINED
    203 #endif
    204 
    205 _CRTIMP __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value);
    206 
    207 void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void);
    208 
    209 #pragma push_macro("__has_builtin")
    210 #ifndef __has_builtin
    211   #define __has_builtin(x) 0
    212 #endif
    213 
    214 #ifdef _UCRT
    215 #  ifdef _WIN64
    216 #    define _setjmp __intrinsic_setjmpex
    217 #  else
    218 #    define _setjmp __intrinsic_setjmp
    219 #  endif
    220 #elif defined(__aarch64__)
    221      /* ARM64 msvcrt.dll lacks _setjmp, only has _setjmpex. */
    222 #  define _setjmp _setjmpex
    223 #endif
    224 #ifndef _INC_SETJMPEX
    225 #  if defined(_X86_) || defined(__i386__)
    226 #    define setjmp(BUF) _setjmp3((BUF), NULL)
    227 #  elif !defined(__SEH__) || defined(__USE_MINGW_SETJMP_NON_SEH)
    228 #    if defined(__arm__) || defined(__aarch64__)
    229 #      define setjmp(BUF) __mingw_setjmp((BUF))
    230 #      define longjmp __mingw_longjmp
    231       int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __mingw_setjmp(jmp_buf _Buf);
    232       __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __mingw_longjmp(jmp_buf _Buf,int _Value);
    233 #    else
    234 #      define setjmp(BUF) _setjmp((BUF), NULL)
    235 #    endif
    236 #  elif __has_builtin(__builtin_sponentry)
    237 #    define setjmp(BUF) _setjmp((BUF), __builtin_sponentry())
    238 #  elif (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
    239 #    define setjmp(BUF) _setjmp((BUF), mingw_getsp())
    240 #  else
    241 #    define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0))
    242 #  endif
    243   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx);
    244   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx);
    245 #else
    246 #  undef setjmp
    247 #  ifdef __SEH__
    248 #    if (__MINGW_GCC_VERSION < 40702) && !defined(__clang__)
    249 #      define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
    250 #      define setjmpex(BUF) _setjmpex((BUF), mingw_getsp())
    251 #    else
    252 #      define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0))
    253 #      define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0))
    254 #    endif
    255 #  else
    256 #    define setjmp(BUF) _setjmpex((BUF), NULL)
    257 #    define setjmpex(BUF) _setjmpex((BUF), NULL)
    258 #  endif
    259   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx);
    260 #endif
    261 
    262 #pragma pop_macro("__has_builtin")
    263 
    264 #ifdef __cplusplus
    265 }
    266 #endif
    267 
    268 #pragma pack(pop)
    269 #endif