1 2_BEGIN_STD_C 3 4#if defined(__arm__) || defined(__thumb__) 5/* 6 * All callee preserved registers: 7 * v1 - v7, fp, ip, sp, lr, f4, f5, f6, f7 8 */ 9#define _JBLEN 23 10#endif 11 12#if defined(__aarch64__) 13#define _JBLEN 22 14#define _JBTYPE long long 15#endif 16 17#if defined(__AVR__) 18#define _JBLEN 24 19#endif 20 21#ifdef __sparc__ 22/* 23 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 24 * All else recovered by under/over(flow) handling. 25 */ 26#define _JBLEN 13 27#endif 28 29#ifdef __BFIN__ 30#define _JBLEN 40 31#endif 32 33#ifdef __epiphany__ 34/* All callee preserved registers: r4-r10,fp, sp, lr,r15, r32-r39 */ 35#define _JBTYPE long long 36#define _JBLEN 10 37#endif 38 39/* necv70 was 9 as well. */ 40 41#if defined(__m68k__) || defined(__mc68000__) 42/* 43 * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6, 44 * fp2-fp7 for 68881. 45 * All else recovered by under/over(flow) handling. 46 */ 47#define _JBLEN 34 48#endif 49 50#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) 51/* 52 * D, X, Y are not saved. 53 * Only take into account the pseudo soft registers (max 32). 54 */ 55#define _JBLEN 32 56#endif 57 58#if defined(__Z8001__) || defined(__Z8002__) 59/* 16 regs + pc */ 60#define _JBLEN 20 61#endif 62 63#ifdef _AM29K 64/* 65 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 66 * All else recovered by under/over(flow) handling. 67 */ 68#define _JBLEN 9 69#endif 70 71#ifdef __i386__ 72# if defined(__CYGWIN__) && !defined (_JBLEN) 73# define _JBLEN (13 * 4) 74# elif defined(__unix__) || defined(__rtems__) 75# define _JBLEN 9 76# else 77# include "setjmp-dj.h" 78# endif 79#endif 80 81#ifdef __x86_64__ 82# ifdef __CYGWIN__ 83# define _JBTYPE long 84# define _JBLEN 32 85# else 86# define _JBTYPE long long 87# define _JBLEN 8 88# endif 89#endif 90 91#ifdef __i960__ 92#define _JBLEN 35 93#endif 94 95#ifdef __M32R__ 96/* Only 8 words are currently needed. 10 gives us some slop if we need 97 to expand. */ 98#define _JBLEN 10 99#endif 100 101#ifdef __mips__ 102#ifdef __mips64 103#define _JBTYPE long long 104#endif 105#ifdef __mips_soft_float 106#define _JBLEN 11 107#else 108#define _JBLEN 23 109#endif 110#endif 111 112#ifdef __m88000__ 113#define _JBLEN 21 114#endif 115 116#ifdef __H8300__ 117#define _JBLEN 5 118#define _JBTYPE int 119#endif 120 121#ifdef __H8300H__ 122/* same as H8/300 but registers are twice as big */ 123#define _JBLEN 5 124#define _JBTYPE long 125#endif 126 127#if defined (__H8300S__) || defined (__H8300SX__) 128/* same as H8/300 but registers are twice as big */ 129#define _JBLEN 5 130#define _JBTYPE long 131#endif 132 133#ifdef __H8500__ 134#define _JBLEN 4 135#endif 136 137#ifdef __sh__ 138#if __SH5__ 139#define _JBLEN 50 140#define _JBTYPE long long 141#else 142#define _JBLEN 20 143#endif /* __SH5__ */ 144#endif 145 146#ifdef __v800 147#define _JBLEN 28 148#endif 149 150#ifdef __PPC__ 151#ifdef __ALTIVEC__ 152#define _JBLEN 64 153#else 154#define _JBLEN 32 155#endif 156#define _JBTYPE double 157#endif 158 159#ifdef __MICROBLAZE__ 160#define _JBLEN 20 161#define _JBTYPE unsigned int 162#endif 163 164#ifdef __hppa__ 165/* %r30, %r2-%r18, %r27, pad, %fr12-%fr15. 166 Note space exists for the FP registers, but they are not 167 saved. */ 168#define _JBLEN 28 169#endif 170 171#if defined(__mn10300__) || defined(__mn10200__) 172#ifdef __AM33_2__ 173#define _JBLEN 26 174#else 175/* A guess */ 176#define _JBLEN 10 177#endif 178#endif 179 180#ifdef __v850 181/* I think our setjmp is saving 15 regs at the moment. Gives us one word 182 slop if we need to expand. */ 183#define _JBLEN 16 184#endif 185 186#if defined(_C4x) 187#define _JBLEN 10 188#endif 189#if defined(_C3x) 190#define _JBLEN 9 191#endif 192 193#ifdef __TMS320C6X__ 194#define _JBLEN 13 195#endif 196 197#ifdef __TIC80__ 198#define _JBLEN 13 199#endif 200 201#ifdef __D10V__ 202#define _JBLEN 8 203#endif 204 205#ifdef __D30V__ 206#define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2) 207#define _JBTYPE double 208#endif 209 210#ifdef __frv__ 211#define _JBLEN (68/2) /* room for 68 32-bit regs */ 212#define _JBTYPE double 213#endif 214 215#ifdef __moxie__ 216#define _JBLEN 16 217#endif 218 219#ifdef __CRX__ 220#define _JBLEN 9 221#endif 222 223#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) 224/* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H), 225 * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */ 226#define _JBLEN 14 227#define _JBTYPE unsigned short 228#endif 229 230#ifdef __fr30__ 231#define _JBLEN 10 232#endif 233 234#ifdef __iq2000__ 235#define _JBLEN 32 236#endif 237 238#ifdef __mcore__ 239#define _JBLEN 16 240#endif 241 242#ifdef __MMIX__ 243/* Using a layout compatible with GCC's built-in. */ 244#define _JBLEN 5 245#define _JBTYPE unsigned long 246#endif 247 248#ifdef __mt__ 249#define _JBLEN 16 250#endif 251 252#ifdef __SPU__ 253#define _JBLEN 50 254#define _JBTYPE __vector signed int 255#endif 256 257#ifdef __xstormy16__ 258/* 4 GPRs plus SP plus PC. */ 259#define _JBLEN 8 260#endif 261 262#ifdef __mep__ 263/* 16 GPRs, pc, hi, lo */ 264#define _JBLEN 19 265#endif 266 267#ifdef __CRIS__ 268#define _JBLEN 18 269#endif 270 271#ifdef __lm32__ 272#define _JBLEN 19 273#endif 274 275#ifdef __m32c__ 276#if defined(__r8c_cpu__) || defined(__m16c_cpu__) 277#define _JBLEN (22/2) 278#else 279#define _JBLEN (34/2) 280#endif 281#define _JBTYPE unsigned short 282#endif /* __m32c__ */ 283 284#ifdef __MSP430__ 285#define _JBLEN 9 286 287#ifdef __MSP430X_LARGE__ 288#define _JBTYPE unsigned long 289#else 290#define _JBTYPE unsigned short 291#endif 292#endif 293 294#ifdef __RL78__ 295/* Three banks of registers, SP, CS, ES, PC */ 296#define _JBLEN (8*3+8) 297#define _JBTYPE unsigned char 298#endif 299 300/* 301 * There are two versions of setjmp()/longjmp(): 302 * 1) Compiler (gcc) built-in versions. 303 * 2) Function-call versions. 304 * 305 * The built-in versions are used most of the time. When used, gcc replaces 306 * calls to setjmp()/longjmp() with inline assembly code. The built-in 307 * versions save/restore a variable number of registers. 308 309 * _JBLEN is set to 40 to be ultra-safe with the built-in versions. 310 * It only needs to be 12 for the function-call versions 311 * but this data structure is used by both versions. 312 */ 313#ifdef __NIOS2__ 314#define _JBLEN 40 315#define _JBTYPE unsigned long 316#endif 317 318#ifdef __RX__ 319#define _JBLEN 0x44 320#endif 321 322#ifdef _AEABI_PORTABLE 323#include <sys/_types.h> 324extern _CONST int __aeabi_JMP_BUF_SIZE; 325typedef __int64_t jmp_buf[]; 326#else 327#ifdef _JBLEN 328#ifdef _JBTYPE 329typedef _JBTYPE jmp_buf[_JBLEN]; 330#else 331typedef int jmp_buf[_JBLEN]; 332#endif 333#endif 334#endif /* _AEABI_PORTABLE */ 335 336_END_STD_C 337 338#if defined(__CYGWIN__) || defined(__rtems__) 339#include <signal.h> 340 341#ifdef __cplusplus 342extern "C" { 343#endif 344 345/* POSIX sigsetjmp/siglongjmp macros */ 346#ifdef _JBTYPE 347typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1) 348 /sizeof (_JBTYPE))]; 349#else 350typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))]; 351#endif 352 353#define _SAVEMASK _JBLEN 354#define _SIGMASK (_JBLEN+1) 355 356#ifdef __CYGWIN__ 357# define _CYGWIN_WORKING_SIGSETJMP 358#endif 359 360#ifdef _POSIX_THREADS 361#define __SIGMASK_FUNC pthread_sigmask 362#else 363#define __SIGMASK_FUNC sigprocmask 364#endif 365 366#if defined(__GNUC__) 367 368#define sigsetjmp(env, savemask) \ 369 __extension__ \ 370 ({ \ 371 sigjmp_buf *_sjbuf = &(env); \ 372 ((*_sjbuf)[_SAVEMASK] = savemask,\ 373 __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\ 374 setjmp (*_sjbuf)); \ 375 }) 376 377#define siglongjmp(env, val) \ 378 __extension__ \ 379 ({ \ 380 sigjmp_buf *_sjbuf = &(env); \ 381 ((((*_sjbuf)[_SAVEMASK]) ? \ 382 __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\ 383 : 0), \ 384 longjmp (*_sjbuf, val)); \ 385 }) 386 387#else /* !__GNUC__ */ 388 389#define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\ 390 __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\ 391 setjmp (env)) 392 393#define siglongjmp(env, val) ((((env)[_SAVEMASK])?\ 394 __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\ 395 longjmp (env, val)) 396 397#endif 398 399/* POSIX _setjmp/_longjmp, maintained for XSI compatibility. These 400 are equivalent to sigsetjmp/siglongjmp when not saving the signal mask. 401 New applications should use sigsetjmp/siglongjmp instead. */ 402#ifdef __CYGWIN__ 403extern void _longjmp(jmp_buf, int); 404extern int _setjmp(jmp_buf); 405#else 406#define _setjmp(env) sigsetjmp ((env), 0) 407#define _longjmp(env, val) siglongjmp ((env), (val)) 408#endif 409 410#ifdef __cplusplus 411} 412#endif 413#endif /* __CYGWIN__ or __rtems__ */ 414