1*53ee8cc1Swenshuai.xi 2*53ee8cc1Swenshuai.xi _BEGIN_STD_C 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi #if defined(__arm__) || defined(__thumb__) 5*53ee8cc1Swenshuai.xi /* 6*53ee8cc1Swenshuai.xi * All callee preserved registers: 7*53ee8cc1Swenshuai.xi * v1 - v7, fp, ip, sp, lr, f4, f5, f6, f7 8*53ee8cc1Swenshuai.xi */ 9*53ee8cc1Swenshuai.xi #define _JBLEN 23 10*53ee8cc1Swenshuai.xi #endif 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi #if defined(__AVR__) 13*53ee8cc1Swenshuai.xi #define _JBLEN 24 14*53ee8cc1Swenshuai.xi #endif 15*53ee8cc1Swenshuai.xi 16*53ee8cc1Swenshuai.xi #ifdef __sparc__ 17*53ee8cc1Swenshuai.xi /* 18*53ee8cc1Swenshuai.xi * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 19*53ee8cc1Swenshuai.xi * All else recovered by under/over(flow) handling. 20*53ee8cc1Swenshuai.xi */ 21*53ee8cc1Swenshuai.xi #define _JBLEN 13 22*53ee8cc1Swenshuai.xi #endif 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi /* necv70 was 9 as well. */ 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi #ifdef __mc68000__ 27*53ee8cc1Swenshuai.xi /* 28*53ee8cc1Swenshuai.xi * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6, 29*53ee8cc1Swenshuai.xi * fp2-fp7 for 68881. 30*53ee8cc1Swenshuai.xi * All else recovered by under/over(flow) handling. 31*53ee8cc1Swenshuai.xi */ 32*53ee8cc1Swenshuai.xi #define _JBLEN 34 33*53ee8cc1Swenshuai.xi #endif 34*53ee8cc1Swenshuai.xi 35*53ee8cc1Swenshuai.xi #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) 36*53ee8cc1Swenshuai.xi /* 37*53ee8cc1Swenshuai.xi * D, X, Y are not saved. 38*53ee8cc1Swenshuai.xi * Only take into account the pseudo soft registers (max 32). 39*53ee8cc1Swenshuai.xi */ 40*53ee8cc1Swenshuai.xi #define _JBLEN 32 41*53ee8cc1Swenshuai.xi #endif 42*53ee8cc1Swenshuai.xi 43*53ee8cc1Swenshuai.xi #if defined(__Z8001__) || defined(__Z8002__) 44*53ee8cc1Swenshuai.xi /* 16 regs + pc */ 45*53ee8cc1Swenshuai.xi #define _JBLEN 20 46*53ee8cc1Swenshuai.xi #endif 47*53ee8cc1Swenshuai.xi 48*53ee8cc1Swenshuai.xi #ifdef _AM29K 49*53ee8cc1Swenshuai.xi /* 50*53ee8cc1Swenshuai.xi * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 51*53ee8cc1Swenshuai.xi * All else recovered by under/over(flow) handling. 52*53ee8cc1Swenshuai.xi */ 53*53ee8cc1Swenshuai.xi #define _JBLEN 9 54*53ee8cc1Swenshuai.xi #endif 55*53ee8cc1Swenshuai.xi 56*53ee8cc1Swenshuai.xi #if defined(__CYGWIN__) && !defined (_JBLEN) 57*53ee8cc1Swenshuai.xi #define _JBLEN (13 * 4) 58*53ee8cc1Swenshuai.xi #elif defined (__i386__) 59*53ee8cc1Swenshuai.xi #if defined(__unix__) || defined(__rtems__) 60*53ee8cc1Swenshuai.xi # define _JBLEN 9 61*53ee8cc1Swenshuai.xi #else 62*53ee8cc1Swenshuai.xi #include "setjmp-dj.h" 63*53ee8cc1Swenshuai.xi #endif 64*53ee8cc1Swenshuai.xi #endif 65*53ee8cc1Swenshuai.xi 66*53ee8cc1Swenshuai.xi #ifdef __i960__ 67*53ee8cc1Swenshuai.xi #define _JBLEN 35 68*53ee8cc1Swenshuai.xi #endif 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi #ifdef __M32R__ 71*53ee8cc1Swenshuai.xi /* Only 8 words are currently needed. 10 gives us some slop if we need 72*53ee8cc1Swenshuai.xi to expand. */ 73*53ee8cc1Swenshuai.xi #define _JBLEN 10 74*53ee8cc1Swenshuai.xi #endif 75*53ee8cc1Swenshuai.xi 76*53ee8cc1Swenshuai.xi #ifdef __mips__ 77*53ee8cc1Swenshuai.xi #ifdef __mips64 78*53ee8cc1Swenshuai.xi #define _JBTYPE long long 79*53ee8cc1Swenshuai.xi #endif 80*53ee8cc1Swenshuai.xi #ifdef __mips_soft_float 81*53ee8cc1Swenshuai.xi #define _JBLEN 11 82*53ee8cc1Swenshuai.xi #else 83*53ee8cc1Swenshuai.xi #define _JBLEN 23 84*53ee8cc1Swenshuai.xi #endif 85*53ee8cc1Swenshuai.xi #endif 86*53ee8cc1Swenshuai.xi 87*53ee8cc1Swenshuai.xi #ifdef __m88000__ 88*53ee8cc1Swenshuai.xi #define _JBLEN 21 89*53ee8cc1Swenshuai.xi #endif 90*53ee8cc1Swenshuai.xi 91*53ee8cc1Swenshuai.xi #ifdef __H8300__ 92*53ee8cc1Swenshuai.xi #define _JBLEN 5 93*53ee8cc1Swenshuai.xi #define _JBTYPE int 94*53ee8cc1Swenshuai.xi #endif 95*53ee8cc1Swenshuai.xi 96*53ee8cc1Swenshuai.xi #ifdef __H8300H__ 97*53ee8cc1Swenshuai.xi /* same as H8/300 but registers are twice as big */ 98*53ee8cc1Swenshuai.xi #define _JBLEN 5 99*53ee8cc1Swenshuai.xi #define _JBTYPE long 100*53ee8cc1Swenshuai.xi #endif 101*53ee8cc1Swenshuai.xi 102*53ee8cc1Swenshuai.xi #if defined (__H8300S__) || defined (__H8300SX__) 103*53ee8cc1Swenshuai.xi /* same as H8/300 but registers are twice as big */ 104*53ee8cc1Swenshuai.xi #define _JBLEN 5 105*53ee8cc1Swenshuai.xi #define _JBTYPE long 106*53ee8cc1Swenshuai.xi #endif 107*53ee8cc1Swenshuai.xi 108*53ee8cc1Swenshuai.xi #ifdef __H8500__ 109*53ee8cc1Swenshuai.xi #define _JBLEN 4 110*53ee8cc1Swenshuai.xi #endif 111*53ee8cc1Swenshuai.xi 112*53ee8cc1Swenshuai.xi #ifdef __sh__ 113*53ee8cc1Swenshuai.xi #if __SH5__ 114*53ee8cc1Swenshuai.xi #define _JBLEN 50 115*53ee8cc1Swenshuai.xi #define _JBTYPE long long 116*53ee8cc1Swenshuai.xi #else 117*53ee8cc1Swenshuai.xi #define _JBLEN 20 118*53ee8cc1Swenshuai.xi #endif /* __SH5__ */ 119*53ee8cc1Swenshuai.xi #endif 120*53ee8cc1Swenshuai.xi 121*53ee8cc1Swenshuai.xi #ifdef __v800 122*53ee8cc1Swenshuai.xi #define _JBLEN 28 123*53ee8cc1Swenshuai.xi #endif 124*53ee8cc1Swenshuai.xi 125*53ee8cc1Swenshuai.xi #ifdef __PPC__ 126*53ee8cc1Swenshuai.xi #ifdef __ALTIVEC__ 127*53ee8cc1Swenshuai.xi #define _JBLEN 64 128*53ee8cc1Swenshuai.xi #else 129*53ee8cc1Swenshuai.xi #define _JBLEN 32 130*53ee8cc1Swenshuai.xi #endif 131*53ee8cc1Swenshuai.xi #define _JBTYPE double 132*53ee8cc1Swenshuai.xi #endif 133*53ee8cc1Swenshuai.xi 134*53ee8cc1Swenshuai.xi #ifdef __hppa__ 135*53ee8cc1Swenshuai.xi /* %r30, %r2-%r18, %r27, pad, %fr12-%fr15. 136*53ee8cc1Swenshuai.xi Note space exists for the FP registers, but they are not 137*53ee8cc1Swenshuai.xi saved. */ 138*53ee8cc1Swenshuai.xi #define _JBLEN 28 139*53ee8cc1Swenshuai.xi #endif 140*53ee8cc1Swenshuai.xi 141*53ee8cc1Swenshuai.xi #if defined(__mn10300__) || defined(__mn10200__) 142*53ee8cc1Swenshuai.xi #ifdef __AM33_2__ 143*53ee8cc1Swenshuai.xi #define _JBLEN 26 144*53ee8cc1Swenshuai.xi #else 145*53ee8cc1Swenshuai.xi /* A guess */ 146*53ee8cc1Swenshuai.xi #define _JBLEN 10 147*53ee8cc1Swenshuai.xi #endif 148*53ee8cc1Swenshuai.xi #endif 149*53ee8cc1Swenshuai.xi 150*53ee8cc1Swenshuai.xi #ifdef __v850 151*53ee8cc1Swenshuai.xi /* I think our setjmp is saving 15 regs at the moment. Gives us one word 152*53ee8cc1Swenshuai.xi slop if we need to expand. */ 153*53ee8cc1Swenshuai.xi #define _JBLEN 16 154*53ee8cc1Swenshuai.xi #endif 155*53ee8cc1Swenshuai.xi 156*53ee8cc1Swenshuai.xi #if defined(_C4x) 157*53ee8cc1Swenshuai.xi #define _JBLEN 10 158*53ee8cc1Swenshuai.xi #endif 159*53ee8cc1Swenshuai.xi #if defined(_C3x) 160*53ee8cc1Swenshuai.xi #define _JBLEN 9 161*53ee8cc1Swenshuai.xi #endif 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi #ifdef __TIC80__ 164*53ee8cc1Swenshuai.xi #define _JBLEN 13 165*53ee8cc1Swenshuai.xi #endif 166*53ee8cc1Swenshuai.xi 167*53ee8cc1Swenshuai.xi #ifdef __D10V__ 168*53ee8cc1Swenshuai.xi #define _JBLEN 8 169*53ee8cc1Swenshuai.xi #endif 170*53ee8cc1Swenshuai.xi 171*53ee8cc1Swenshuai.xi #ifdef __D30V__ 172*53ee8cc1Swenshuai.xi #define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2) 173*53ee8cc1Swenshuai.xi #define _JBTYPE double 174*53ee8cc1Swenshuai.xi #endif 175*53ee8cc1Swenshuai.xi 176*53ee8cc1Swenshuai.xi #ifdef __frv__ 177*53ee8cc1Swenshuai.xi #define _JBLEN (68/2) /* room for 68 32-bit regs */ 178*53ee8cc1Swenshuai.xi #define _JBTYPE double 179*53ee8cc1Swenshuai.xi #endif 180*53ee8cc1Swenshuai.xi 181*53ee8cc1Swenshuai.xi #ifdef __CRX__ 182*53ee8cc1Swenshuai.xi #define _JBLEN 9 183*53ee8cc1Swenshuai.xi #endif 184*53ee8cc1Swenshuai.xi 185*53ee8cc1Swenshuai.xi #ifdef __fr30__ 186*53ee8cc1Swenshuai.xi #define _JBLEN 10 187*53ee8cc1Swenshuai.xi #endif 188*53ee8cc1Swenshuai.xi 189*53ee8cc1Swenshuai.xi #ifdef __iq2000__ 190*53ee8cc1Swenshuai.xi #define _JBLEN 32 191*53ee8cc1Swenshuai.xi #endif 192*53ee8cc1Swenshuai.xi 193*53ee8cc1Swenshuai.xi #ifdef __mcore__ 194*53ee8cc1Swenshuai.xi #define _JBLEN 16 195*53ee8cc1Swenshuai.xi #endif 196*53ee8cc1Swenshuai.xi 197*53ee8cc1Swenshuai.xi #ifdef __MMIX__ 198*53ee8cc1Swenshuai.xi /* Using a layout compatible with GCC's built-in. */ 199*53ee8cc1Swenshuai.xi #define _JBLEN 5 200*53ee8cc1Swenshuai.xi #define _JBTYPE unsigned long 201*53ee8cc1Swenshuai.xi #endif 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi #ifdef __mt__ 204*53ee8cc1Swenshuai.xi #define _JBLEN 16 205*53ee8cc1Swenshuai.xi #endif 206*53ee8cc1Swenshuai.xi 207*53ee8cc1Swenshuai.xi #ifdef __xstormy16__ 208*53ee8cc1Swenshuai.xi /* 4 GPRs plus SP plus PC. */ 209*53ee8cc1Swenshuai.xi #define _JBLEN 8 210*53ee8cc1Swenshuai.xi #endif 211*53ee8cc1Swenshuai.xi 212*53ee8cc1Swenshuai.xi #ifdef __CRIS__ 213*53ee8cc1Swenshuai.xi #define _JBLEN 18 214*53ee8cc1Swenshuai.xi #endif 215*53ee8cc1Swenshuai.xi 216*53ee8cc1Swenshuai.xi #ifdef __m32c__ 217*53ee8cc1Swenshuai.xi #if defined(__r8c_cpu__) || defined(__m16c_cpu__) 218*53ee8cc1Swenshuai.xi #define _JBLEN (22/2) 219*53ee8cc1Swenshuai.xi #else 220*53ee8cc1Swenshuai.xi #define _JBLEN (34/2) 221*53ee8cc1Swenshuai.xi #endif 222*53ee8cc1Swenshuai.xi #define _JBTYPE unsigned short 223*53ee8cc1Swenshuai.xi #endif /* __m32c__ */ 224*53ee8cc1Swenshuai.xi 225*53ee8cc1Swenshuai.xi #if defined (__aeon__) || defined (__AEON__) || defined (__ba__) || defined (__BA__) 226*53ee8cc1Swenshuai.xi /* For now, save the whole register file. */ 227*53ee8cc1Swenshuai.xi #define _JBLEN 31 228*53ee8cc1Swenshuai.xi #define _JBTYPE unsigned long 229*53ee8cc1Swenshuai.xi #endif 230*53ee8cc1Swenshuai.xi 231*53ee8cc1Swenshuai.xi #ifdef _JBLEN 232*53ee8cc1Swenshuai.xi #ifdef _JBTYPE 233*53ee8cc1Swenshuai.xi typedef _JBTYPE jmp_buf[_JBLEN]; 234*53ee8cc1Swenshuai.xi #else 235*53ee8cc1Swenshuai.xi typedef int jmp_buf[_JBLEN]; 236*53ee8cc1Swenshuai.xi #endif 237*53ee8cc1Swenshuai.xi #endif 238*53ee8cc1Swenshuai.xi 239*53ee8cc1Swenshuai.xi _END_STD_C 240*53ee8cc1Swenshuai.xi 241*53ee8cc1Swenshuai.xi #if defined(__CYGWIN__) || defined(__rtems__) 242*53ee8cc1Swenshuai.xi #include <signal.h> 243*53ee8cc1Swenshuai.xi 244*53ee8cc1Swenshuai.xi #ifdef __cplusplus 245*53ee8cc1Swenshuai.xi extern "C" { 246*53ee8cc1Swenshuai.xi #endif 247*53ee8cc1Swenshuai.xi 248*53ee8cc1Swenshuai.xi /* POSIX sigsetjmp/siglongjmp macros */ 249*53ee8cc1Swenshuai.xi typedef int sigjmp_buf[_JBLEN+2]; 250*53ee8cc1Swenshuai.xi 251*53ee8cc1Swenshuai.xi #define _SAVEMASK _JBLEN 252*53ee8cc1Swenshuai.xi #define _SIGMASK (_JBLEN+1) 253*53ee8cc1Swenshuai.xi 254*53ee8cc1Swenshuai.xi #ifdef __CYGWIN__ 255*53ee8cc1Swenshuai.xi # define _CYGWIN_WORKING_SIGSETJMP 256*53ee8cc1Swenshuai.xi #endif 257*53ee8cc1Swenshuai.xi 258*53ee8cc1Swenshuai.xi #if defined(__GNUC__) 259*53ee8cc1Swenshuai.xi 260*53ee8cc1Swenshuai.xi #define sigsetjmp(env, savemask) \ 261*53ee8cc1Swenshuai.xi ({ \ 262*53ee8cc1Swenshuai.xi sigjmp_buf *_sjbuf = &(env); \ 263*53ee8cc1Swenshuai.xi ((*_sjbuf)[_SAVEMASK] = savemask,\ 264*53ee8cc1Swenshuai.xi sigprocmask (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\ 265*53ee8cc1Swenshuai.xi setjmp (*_sjbuf)); \ 266*53ee8cc1Swenshuai.xi }) 267*53ee8cc1Swenshuai.xi 268*53ee8cc1Swenshuai.xi #define siglongjmp(env, val) \ 269*53ee8cc1Swenshuai.xi ({ \ 270*53ee8cc1Swenshuai.xi sigjmp_buf *_sjbuf = &(env); \ 271*53ee8cc1Swenshuai.xi ((((*_sjbuf)[_SAVEMASK]) ? \ 272*53ee8cc1Swenshuai.xi sigprocmask (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\ 273*53ee8cc1Swenshuai.xi : 0), \ 274*53ee8cc1Swenshuai.xi longjmp (*_sjbuf, val)); \ 275*53ee8cc1Swenshuai.xi }) 276*53ee8cc1Swenshuai.xi 277*53ee8cc1Swenshuai.xi #else /* !__GNUC__ */ 278*53ee8cc1Swenshuai.xi 279*53ee8cc1Swenshuai.xi #define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\ 280*53ee8cc1Swenshuai.xi sigprocmask (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\ 281*53ee8cc1Swenshuai.xi setjmp (env)) 282*53ee8cc1Swenshuai.xi 283*53ee8cc1Swenshuai.xi #define siglongjmp(env, val) ((((env)[_SAVEMASK])?\ 284*53ee8cc1Swenshuai.xi sigprocmask (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\ 285*53ee8cc1Swenshuai.xi longjmp (env, val)) 286*53ee8cc1Swenshuai.xi 287*53ee8cc1Swenshuai.xi #endif 288*53ee8cc1Swenshuai.xi 289*53ee8cc1Swenshuai.xi #ifdef __cplusplus 290*53ee8cc1Swenshuai.xi } 291*53ee8cc1Swenshuai.xi #endif 292*53ee8cc1Swenshuai.xi #endif /* __CYGWIN__ or __rtems__ */ 293