/** * D header file for POSIX. * * Copyright: Copyright Sean Kelly 2005 - 2009. * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). * Authors: Sean Kelly * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition */ /* Copyright Sean Kelly 2005 - 2009. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE or copy at * http://www.boost.org/LICENSE_1_0.txt) */ module core.sys.posix.setjmp; import core.sys.posix.config; import core.sys.posix.signal; // for sigset_t version (Posix): extern (C) nothrow @nogc: @system: version (RISCV32) version = RISCV_Any; version (RISCV64) version = RISCV_Any; version (PPC) version = PPC_Any; version (PPC64) version = PPC_Any; // // Required // /* jmp_buf int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); */ version (CRuntime_Glibc) { version (X86_64) { //enum JB_BX = 0; //enum JB_BP = 1; //enum JB_12 = 2; //enum JB_13 = 3; //enum JB_14 = 4; //enum JB_15 = 5; //enum JB_SP = 6; //enum JB_PC = 7; //enum JB_SIZE = 64; alias long[8] __jmp_buf; } else version (X86) { //enum JB_BX = 0; //enum JB_SI = 1; //enum JB_DI = 2; //enum JB_BP = 3; //enum JB_SP = 4; //enum JB_PC = 5; //enum JB_SIZE = 24; alias int[6] __jmp_buf; } else version (SPARC) { alias int[3] __jmp_buf; } else version (SPARC64) { alias __jmp_buf = ulong[22]; } else version (AArch64) { alias long[22] __jmp_buf; } else version (ARM) { alias int[64] __jmp_buf; } else version (HPPA) { struct __jmp_buf { int __r3; int[15] __r4_r18; int __r19; int __r27; int __sp; int __rp; int __pad1; double[10] __fr12_fr21; } } else version (PPC) { alias int[64 + (12*4)] __jmp_buf; } else version (PPC64) { alias long[64] __jmp_buf; } else version (MIPS32) { struct __jmp_buf { version (MIPS_O32) { void * __pc; void * __sp; int[8] __regs; void * __fp; void * __gp; } else { long __pc; long __sp; long[8] __regs; long __fp; long __gp; } int __fpc_csr; version (MIPS_N64) double[8] __fpregs; else double[6] __fpregs; } } else version (MIPS64) { struct __jmp_buf { long __pc; long __sp; long[8] __regs; long __fp; long __gp; int __fpc_csr; version (MIPS_N64) double[8] __fpregs; else double[6] __fpregs; } } else version (RISCV_Any) { struct __riscv_jmp_buf { c_long __pc; c_long[12] __regs; c_long __sp; static if (__traits(getTargetInfo, "floatAbi") == "double") double[12] __fpregs; } alias __jmp_buf = __riscv_jmp_buf[1]; } else version (S390) { struct __s390_jmp_buf { c_long[10] __gregs; c_long[4] __fpregs; } alias __jmp_buf = __s390_jmp_buf[1]; } else version (SystemZ) { struct __s390_jmp_buf { c_long[10] __gregs; c_long[8] __fpregs; } alias __jmp_buf = __s390_jmp_buf[1]; } else static assert(0, "unimplemented"); struct __jmp_buf_tag { __jmp_buf __jmpbuf; int __mask_was_saved; sigset_t __saved_mask; } alias __jmp_buf_tag[1] jmp_buf; alias _setjmp setjmp; // see XOpen block void longjmp(ref jmp_buf, int); } else version (FreeBSD) { // version (X86) { enum _JBLEN = 11; struct _jmp_buf { int[_JBLEN + 1] _jb; } } else version (X86_64) { enum _JBLEN = 12; struct _jmp_buf { c_long[_JBLEN] _jb; } } else version (SPARC) { enum _JBLEN = 5; struct _jmp_buf { c_long[_JBLEN + 1] _jb; } } else version (AArch64) { enum _JBLEN = 31; // __int128_t struct _jmp_buf { long[2][_JBLEN + 1] _jb; } } else version (PPC_Any) { enum _JBLEN = 100; struct _jmp_buf { long[_JBLEN + 1] _jb; } } else static assert(0); alias _jmp_buf[1] jmp_buf; int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); } else version (NetBSD) { // version (X86) { enum _JBLEN = 13; struct _jmp_buf { int[_JBLEN + 1] _jb; } } else version (X86_64) { enum _JBLEN = 11; struct _jmp_buf { c_long[_JBLEN] _jb; } } else static assert(0); alias _jmp_buf[_JBLEN] jmp_buf; int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); } else version (OpenBSD) { // version (X86) { enum _JBLEN = 10; } else version (X86_64) { enum _JBLEN = 11; } else version (ARM) { enum _JBLEN = 64; } else version (AArch64) { enum _JBLEN = 64; } else version (PPC) { enum _JBLEN = 100; } else version (MIPS64) { enum _JBLEN = 83; } else version (SPARC) { enum _JBLEN = 10; } else version (SPARC64) { enum _JBLEN = 14; } else static assert(0); alias jmp_buf = c_long[_JBLEN]; int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); } else version (DragonFlyBSD) { // version (X86_64) { enum _JBLEN = 12; struct _jmp_buf { c_long[_JBLEN] _jb; } } else static assert(0); alias _jmp_buf[1] jmp_buf; int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); } else version (CRuntime_Bionic) { // version (X86) { enum _JBLEN = 10; } else version (ARM) { enum _JBLEN = 64; } else version (AArch64) { enum _JBLEN = 32; } else version (X86_64) { enum _JBLEN = 11; } else { static assert(false, "Architecture not supported."); } alias c_long[_JBLEN] jmp_buf; int setjmp(ref jmp_buf); void longjmp(ref jmp_buf, int); } else version (CRuntime_UClibc) { version (X86_64) { alias long[8] __jmp_buf; } else version (ARM) { align(8) alias int[64] __jmp_buf; } else version (MIPS32) { struct __jmp_buf { version (MIPS_O32) { void * __pc; void * __sp; int[8] __regs; void * __fp; void * __gp; } else { long __pc; long __sp; long[8] __regs; long __fp; long __gp; } int __fpc_csr; version (MIPS_N64) double[8] __fpregs; else double[6] __fpregs; } } else version (MIPS64) { struct __jmp_buf { long __pc; long __sp; long[8] __regs; long __fp; long __gp; int __fpc_csr; version (MIPS_N64) double[8] __fpregs; else double[6] __fpregs; } } else static assert(0, "unimplemented"); struct __jmp_buf_tag { __jmp_buf __jmpbuf; int __mask_was_saved; sigset_t __saved_mask; } alias __jmp_buf_tag[1] jmp_buf; alias _setjmp setjmp; void longjmp(ref jmp_buf, int); } // // C Extension (CX) // /* sigjmp_buf int sigsetjmp(sigjmp_buf, int); void siglongjmp(sigjmp_buf, int); */ version (CRuntime_Glibc) { alias jmp_buf sigjmp_buf; int __sigsetjmp(sigjmp_buf, int); alias __sigsetjmp sigsetjmp; void siglongjmp(sigjmp_buf, int); } else version (FreeBSD) { // version (X86) { struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; } } else version (X86_64) { struct _sigjmp_buf { c_long[_JBLEN] _sjb; } } else version (SPARC) { enum _JBLEN = 5; enum _JB_FP = 0; enum _JB_PC = 1; enum _JB_SP = 2; enum _JB_SIGMASK = 3; enum _JB_SIGFLAG = 5; struct _sigjmp_buf { c_long[_JBLEN + 1] _sjb; } } else version (AArch64) { // __int128_t struct _sigjmp_buf { long[2][_JBLEN + 1] _jb; } } else version (PPC_Any) { struct _sigjmp_buf { long[_JBLEN + 1] _sjb; } } else static assert(0); alias _sigjmp_buf[1] sigjmp_buf; int sigsetjmp(ref sigjmp_buf); void siglongjmp(ref sigjmp_buf, int); } else version (NetBSD) { // version (X86) { struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; } } else version (X86_64) { struct _sigjmp_buf { c_long[_JBLEN] _sjb; } } else static assert(0); alias _sigjmp_buf[_JBLEN + 1] sigjmp_buf; int sigsetjmp(ref sigjmp_buf); void siglongjmp(ref sigjmp_buf, int); } else version (OpenBSD) { alias sigjmp_buf = c_long[_JBLEN + 1]; int sigsetjmp(ref sigjmp_buf); void siglongjmp(ref sigjmp_buf, int); } else version (DragonFlyBSD) { // version (X86_64) { struct _sigjmp_buf { c_long[_JBLEN] _sjb; } } else static assert(0); alias _sigjmp_buf[1] sigjmp_buf; int sigsetjmp(ref sigjmp_buf); void siglongjmp(ref sigjmp_buf, int); } else version (CRuntime_Bionic) { alias c_long[_JBLEN + 1] sigjmp_buf; int sigsetjmp(ref sigjmp_buf, int); void siglongjmp(ref sigjmp_buf, int); } else version (CRuntime_UClibc) { alias jmp_buf sigjmp_buf; int __sigsetjmp(ref sigjmp_buf, int); alias __sigsetjmp sigsetjmp; void siglongjmp(ref sigjmp_buf, int); } // // XOpen (XSI) // /* int _setjmp(jmp_buf); void _longjmp(jmp_buf, int); */ version (CRuntime_Glibc) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (FreeBSD) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (NetBSD) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (OpenBSD) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (DragonFlyBSD) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (CRuntime_Bionic) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); } else version (CRuntime_UClibc) { int _setjmp(ref jmp_buf); void _longjmp(ref jmp_buf, int); }