1/** 2 * D header file for POSIX. 3 * 4 * Copyright: Copyright Sean Kelly 2005 - 2009. 5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). 6 * Authors: Sean Kelly 7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition 8 */ 9 10/* Copyright Sean Kelly 2005 - 2009. 11 * Distributed under the Boost Software License, Version 1.0. 12 * (See accompanying file LICENSE or copy at 13 * http://www.boost.org/LICENSE_1_0.txt) 14 */ 15module core.sys.posix.setjmp; 16 17import core.sys.posix.config; 18import core.sys.posix.signal; // for sigset_t 19 20version (Posix): 21extern (C) nothrow @nogc: 22@system: 23 24version (RISCV32) version = RISCV_Any; 25version (RISCV64) version = RISCV_Any; 26version (PPC) version = PPC_Any; 27version (PPC64) version = PPC_Any; 28 29// 30// Required 31// 32/* 33jmp_buf 34 35int setjmp(ref jmp_buf); 36void longjmp(ref jmp_buf, int); 37*/ 38 39version (CRuntime_Glibc) 40{ 41 version (X86_64) 42 { 43 //enum JB_BX = 0; 44 //enum JB_BP = 1; 45 //enum JB_12 = 2; 46 //enum JB_13 = 3; 47 //enum JB_14 = 4; 48 //enum JB_15 = 5; 49 //enum JB_SP = 6; 50 //enum JB_PC = 7; 51 //enum JB_SIZE = 64; 52 53 alias long[8] __jmp_buf; 54 } 55 else version (X86) 56 { 57 //enum JB_BX = 0; 58 //enum JB_SI = 1; 59 //enum JB_DI = 2; 60 //enum JB_BP = 3; 61 //enum JB_SP = 4; 62 //enum JB_PC = 5; 63 //enum JB_SIZE = 24; 64 65 alias int[6] __jmp_buf; 66 } 67 else version (SPARC) 68 { 69 alias int[3] __jmp_buf; 70 } 71 else version (SPARC64) 72 { 73 alias __jmp_buf = ulong[22]; 74 } 75 else version (AArch64) 76 { 77 alias long[22] __jmp_buf; 78 } 79 else version (ARM) 80 { 81 alias int[64] __jmp_buf; 82 } 83 else version (HPPA) 84 { 85 struct __jmp_buf 86 { 87 int __r3; 88 int[15] __r4_r18; 89 int __r19; 90 int __r27; 91 int __sp; 92 int __rp; 93 int __pad1; 94 double[10] __fr12_fr21; 95 } 96 } 97 else version (PPC) 98 { 99 alias int[64 + (12*4)] __jmp_buf; 100 } 101 else version (PPC64) 102 { 103 alias long[64] __jmp_buf; 104 } 105 else version (MIPS32) 106 { 107 struct __jmp_buf 108 { 109 version (MIPS_O32) 110 { 111 void * __pc; 112 void * __sp; 113 int[8] __regs; 114 void * __fp; 115 void * __gp; 116 } 117 else 118 { 119 long __pc; 120 long __sp; 121 long[8] __regs; 122 long __fp; 123 long __gp; 124 } 125 int __fpc_csr; 126 version (MIPS_N64) 127 double[8] __fpregs; 128 else 129 double[6] __fpregs; 130 } 131 } 132 else version (MIPS64) 133 { 134 struct __jmp_buf 135 { 136 long __pc; 137 long __sp; 138 long[8] __regs; 139 long __fp; 140 long __gp; 141 int __fpc_csr; 142 version (MIPS_N64) 143 double[8] __fpregs; 144 else 145 double[6] __fpregs; 146 } 147 } 148 else version (RISCV_Any) 149 { 150 struct __riscv_jmp_buf 151 { 152 c_long __pc; 153 c_long[12] __regs; 154 c_long __sp; 155 static if (__traits(getTargetInfo, "floatAbi") == "double") 156 double[12] __fpregs; 157 } 158 alias __jmp_buf = __riscv_jmp_buf[1]; 159 } 160 else version (S390) 161 { 162 struct __s390_jmp_buf 163 { 164 c_long[10] __gregs; 165 c_long[4] __fpregs; 166 } 167 alias __jmp_buf = __s390_jmp_buf[1]; 168 } 169 else version (SystemZ) 170 { 171 struct __s390_jmp_buf 172 { 173 c_long[10] __gregs; 174 c_long[8] __fpregs; 175 } 176 alias __jmp_buf = __s390_jmp_buf[1]; 177 } 178 else 179 static assert(0, "unimplemented"); 180 181 struct __jmp_buf_tag 182 { 183 __jmp_buf __jmpbuf; 184 int __mask_was_saved; 185 sigset_t __saved_mask; 186 } 187 188 alias __jmp_buf_tag[1] jmp_buf; 189 190 alias _setjmp setjmp; // see XOpen block 191 void longjmp(ref jmp_buf, int); 192} 193else version (FreeBSD) 194{ 195 // <machine/setjmp.h> 196 version (X86) 197 { 198 enum _JBLEN = 11; 199 struct _jmp_buf { int[_JBLEN + 1] _jb; } 200 } 201 else version (X86_64) 202 { 203 enum _JBLEN = 12; 204 struct _jmp_buf { c_long[_JBLEN] _jb; } 205 } 206 else version (SPARC) 207 { 208 enum _JBLEN = 5; 209 struct _jmp_buf { c_long[_JBLEN + 1] _jb; } 210 } 211 else version (AArch64) 212 { 213 enum _JBLEN = 31; 214 // __int128_t 215 struct _jmp_buf { long[2][_JBLEN + 1] _jb; } 216 } 217 else version (PPC_Any) 218 { 219 enum _JBLEN = 100; 220 struct _jmp_buf { long[_JBLEN + 1] _jb; } 221 } 222 else 223 static assert(0); 224 alias _jmp_buf[1] jmp_buf; 225 226 int setjmp(ref jmp_buf); 227 void longjmp(ref jmp_buf, int); 228} 229else version (NetBSD) 230{ 231 // <machine/setjmp.h> 232 version (X86) 233 { 234 enum _JBLEN = 13; 235 struct _jmp_buf { int[_JBLEN + 1] _jb; } 236 } 237 else version (X86_64) 238 { 239 enum _JBLEN = 11; 240 struct _jmp_buf { c_long[_JBLEN] _jb; } 241 } 242 else 243 static assert(0); 244 alias _jmp_buf[_JBLEN] jmp_buf; 245 246 int setjmp(ref jmp_buf); 247 void longjmp(ref jmp_buf, int); 248} 249else version (OpenBSD) 250{ 251 // <machine/setjmp.h> 252 version (X86) 253 { 254 enum _JBLEN = 10; 255 } 256 else version (X86_64) 257 { 258 enum _JBLEN = 11; 259 } 260 else version (ARM) 261 { 262 enum _JBLEN = 64; 263 } 264 else version (AArch64) 265 { 266 enum _JBLEN = 64; 267 } 268 else version (PPC) 269 { 270 enum _JBLEN = 100; 271 } 272 else version (MIPS64) 273 { 274 enum _JBLEN = 83; 275 } 276 else version (SPARC) 277 { 278 enum _JBLEN = 10; 279 } 280 else version (SPARC64) 281 { 282 enum _JBLEN = 14; 283 } 284 else 285 static assert(0); 286 287 alias jmp_buf = c_long[_JBLEN]; 288 289 int setjmp(ref jmp_buf); 290 void longjmp(ref jmp_buf, int); 291} 292else version (DragonFlyBSD) 293{ 294 // <machine/setjmp.h> 295 version (X86_64) 296 { 297 enum _JBLEN = 12; 298 struct _jmp_buf { c_long[_JBLEN] _jb; } 299 } 300 else 301 static assert(0); 302 alias _jmp_buf[1] jmp_buf; 303 304 int setjmp(ref jmp_buf); 305 void longjmp(ref jmp_buf, int); 306} 307else version (CRuntime_Bionic) 308{ 309 // <machine/setjmp.h> 310 version (X86) 311 { 312 enum _JBLEN = 10; 313 } 314 else version (ARM) 315 { 316 enum _JBLEN = 64; 317 } 318 else version (AArch64) 319 { 320 enum _JBLEN = 32; 321 } 322 else version (X86_64) 323 { 324 enum _JBLEN = 11; 325 } 326 else 327 { 328 static assert(false, "Architecture not supported."); 329 } 330 331 alias c_long[_JBLEN] jmp_buf; 332 333 int setjmp(ref jmp_buf); 334 void longjmp(ref jmp_buf, int); 335} 336else version (CRuntime_UClibc) 337{ 338 version (X86_64) 339 { 340 alias long[8] __jmp_buf; 341 } 342 else version (ARM) 343 { 344 align(8) alias int[64] __jmp_buf; 345 } 346 else version (MIPS32) 347 { 348 struct __jmp_buf 349 { 350 version (MIPS_O32) 351 { 352 void * __pc; 353 void * __sp; 354 int[8] __regs; 355 void * __fp; 356 void * __gp; 357 } 358 else 359 { 360 long __pc; 361 long __sp; 362 long[8] __regs; 363 long __fp; 364 long __gp; 365 } 366 int __fpc_csr; 367 version (MIPS_N64) 368 double[8] __fpregs; 369 else 370 double[6] __fpregs; 371 } 372 } 373 else version (MIPS64) 374 { 375 struct __jmp_buf 376 { 377 long __pc; 378 long __sp; 379 long[8] __regs; 380 long __fp; 381 long __gp; 382 int __fpc_csr; 383 version (MIPS_N64) 384 double[8] __fpregs; 385 else 386 double[6] __fpregs; 387 } 388 } 389 else 390 static assert(0, "unimplemented"); 391 392 struct __jmp_buf_tag 393 { 394 __jmp_buf __jmpbuf; 395 int __mask_was_saved; 396 sigset_t __saved_mask; 397 } 398 399 alias __jmp_buf_tag[1] jmp_buf; 400 401 alias _setjmp setjmp; 402 void longjmp(ref jmp_buf, int); 403} 404 405// 406// C Extension (CX) 407// 408/* 409sigjmp_buf 410 411int sigsetjmp(sigjmp_buf, int); 412void siglongjmp(sigjmp_buf, int); 413*/ 414 415version (CRuntime_Glibc) 416{ 417 alias jmp_buf sigjmp_buf; 418 419 int __sigsetjmp(sigjmp_buf, int); 420 alias __sigsetjmp sigsetjmp; 421 void siglongjmp(sigjmp_buf, int); 422} 423else version (FreeBSD) 424{ 425 // <machine/setjmp.h> 426 version (X86) 427 { 428 struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; } 429 } 430 else version (X86_64) 431 { 432 struct _sigjmp_buf { c_long[_JBLEN] _sjb; } 433 } 434 else version (SPARC) 435 { 436 enum _JBLEN = 5; 437 enum _JB_FP = 0; 438 enum _JB_PC = 1; 439 enum _JB_SP = 2; 440 enum _JB_SIGMASK = 3; 441 enum _JB_SIGFLAG = 5; 442 struct _sigjmp_buf { c_long[_JBLEN + 1] _sjb; } 443 } 444 else version (AArch64) 445 { 446 // __int128_t 447 struct _sigjmp_buf { long[2][_JBLEN + 1] _jb; } 448 } 449 else version (PPC_Any) 450 { 451 struct _sigjmp_buf { long[_JBLEN + 1] _sjb; } 452 } 453 else 454 static assert(0); 455 alias _sigjmp_buf[1] sigjmp_buf; 456 457 int sigsetjmp(ref sigjmp_buf); 458 void siglongjmp(ref sigjmp_buf, int); 459} 460else version (NetBSD) 461{ 462 // <machine/setjmp.h> 463 version (X86) 464 { 465 struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; } 466 } 467 else version (X86_64) 468 { 469 struct _sigjmp_buf { c_long[_JBLEN] _sjb; } 470 } 471 else 472 static assert(0); 473 alias _sigjmp_buf[_JBLEN + 1] sigjmp_buf; 474 475 int sigsetjmp(ref sigjmp_buf); 476 void siglongjmp(ref sigjmp_buf, int); 477} 478else version (OpenBSD) 479{ 480 alias sigjmp_buf = c_long[_JBLEN + 1]; 481 482 int sigsetjmp(ref sigjmp_buf); 483 void siglongjmp(ref sigjmp_buf, int); 484} 485else version (DragonFlyBSD) 486{ 487 // <machine/setjmp.h> 488 version (X86_64) 489 { 490 struct _sigjmp_buf { c_long[_JBLEN] _sjb; } 491 } 492 else 493 static assert(0); 494 alias _sigjmp_buf[1] sigjmp_buf; 495 496 int sigsetjmp(ref sigjmp_buf); 497 void siglongjmp(ref sigjmp_buf, int); 498} 499else version (CRuntime_Bionic) 500{ 501 alias c_long[_JBLEN + 1] sigjmp_buf; 502 503 int sigsetjmp(ref sigjmp_buf, int); 504 void siglongjmp(ref sigjmp_buf, int); 505} 506else version (CRuntime_UClibc) 507{ 508 alias jmp_buf sigjmp_buf; 509 510 int __sigsetjmp(ref sigjmp_buf, int); 511 alias __sigsetjmp sigsetjmp; 512 void siglongjmp(ref sigjmp_buf, int); 513} 514 515// 516// XOpen (XSI) 517// 518/* 519int _setjmp(jmp_buf); 520void _longjmp(jmp_buf, int); 521*/ 522 523version (CRuntime_Glibc) 524{ 525 int _setjmp(ref jmp_buf); 526 void _longjmp(ref jmp_buf, int); 527} 528else version (FreeBSD) 529{ 530 int _setjmp(ref jmp_buf); 531 void _longjmp(ref jmp_buf, int); 532} 533else version (NetBSD) 534{ 535 int _setjmp(ref jmp_buf); 536 void _longjmp(ref jmp_buf, int); 537} 538else version (OpenBSD) 539{ 540 int _setjmp(ref jmp_buf); 541 void _longjmp(ref jmp_buf, int); 542} 543else version (DragonFlyBSD) 544{ 545 int _setjmp(ref jmp_buf); 546 void _longjmp(ref jmp_buf, int); 547} 548else version (CRuntime_Bionic) 549{ 550 int _setjmp(ref jmp_buf); 551 void _longjmp(ref jmp_buf, int); 552} 553else version (CRuntime_UClibc) 554{ 555 int _setjmp(ref jmp_buf); 556 void _longjmp(ref jmp_buf, int); 557} 558