Home | History | Annotate | Download | only in include
      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