2 * D header file for POSIX.
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
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)
15 module core
.sys
.posix
.setjmp
;
17 import core
.sys
.posix
.config
;
18 import core
.sys
.posix
.signal
; // for sigset_t
21 extern (C
) nothrow @nogc:
23 version (RISCV32
) version = RISCV_Any
;
24 version (RISCV64
) version = RISCV_Any
;
25 version (PPC
) version = PPC_Any
;
26 version (PPC64
) version = PPC_Any
;
34 int setjmp(ref jmp_buf);
35 void longjmp(ref jmp_buf, int);
38 version (CRuntime_Glibc
)
52 alias long[8] __jmp_buf
;
64 alias int[6] __jmp_buf
;
68 alias int[3] __jmp_buf
;
70 else version (SPARC64
)
72 alias __jmp_buf
= ulong[22];
74 else version (AArch64
)
76 alias long[22] __jmp_buf
;
80 alias int[64] __jmp_buf
;
93 double[10] __fr12_fr21
;
98 alias int[64 + (12*4)] __jmp_buf
;
102 alias long[64] __jmp_buf
;
104 else version (MIPS32
)
131 else version (MIPS64
)
147 else version (RISCV_Any
)
149 struct __riscv_jmp_buf
154 static if (__traits(getTargetInfo
, "floatAbi") == "double")
157 alias __jmp_buf
= __riscv_jmp_buf
[1];
161 struct __s390_jmp_buf
166 alias __jmp_buf
= __s390_jmp_buf
[1];
168 else version (SystemZ
)
170 struct __s390_jmp_buf
175 alias __jmp_buf
= __s390_jmp_buf
[1];
177 else version (LoongArch64
)
179 struct __loongarch_jmp_buf
187 static if (__traits(getTargetInfo
, "floatAbi") != "soft_float")
190 alias __jmp_buf
= __loongarch_jmp_buf
[1];
193 static assert(0, "unimplemented");
198 int __mask_was_saved
;
199 sigset_t __saved_mask
;
202 alias __jmp_buf_tag
[1] jmp_buf
;
204 alias _setjmp setjmp
; // see XOpen block
205 void longjmp(ref jmp_buf
, int);
207 else version (FreeBSD
)
209 // <machine/setjmp.h>
213 struct _jmp_buf
{ int[_JBLEN
+ 1] _jb
; }
215 else version (X86_64
)
218 struct _jmp_buf
{ c_long
[_JBLEN
] _jb
; }
223 struct _jmp_buf
{ c_long
[_JBLEN
+ 1] _jb
; }
225 else version (AArch64
)
229 struct _jmp_buf
{ long[2][_JBLEN
+ 1] _jb
; }
231 else version (PPC_Any
)
234 struct _jmp_buf
{ long[_JBLEN
+ 1] _jb
; }
238 alias _jmp_buf
[1] jmp_buf
;
240 int setjmp(ref jmp_buf
);
241 void longjmp(ref jmp_buf
, int);
243 else version (NetBSD
)
245 // <machine/setjmp.h>
249 struct _jmp_buf
{ int[_JBLEN
+ 1] _jb
; }
251 else version (X86_64
)
254 struct _jmp_buf
{ c_long
[_JBLEN
] _jb
; }
258 alias _jmp_buf
[_JBLEN
] jmp_buf
;
260 int setjmp(ref jmp_buf
);
261 void longjmp(ref jmp_buf
, int);
263 else version (OpenBSD
)
265 // <machine/setjmp.h>
270 else version (X86_64
)
278 else version (AArch64
)
286 else version (MIPS64
)
294 else version (SPARC64
)
301 alias jmp_buf
= c_long
[_JBLEN
];
303 int setjmp(ref jmp_buf
);
304 void longjmp(ref jmp_buf
, int);
306 else version (DragonFlyBSD
)
308 // <machine/setjmp.h>
312 struct _jmp_buf
{ c_long
[_JBLEN
] _jb
; }
316 alias _jmp_buf
[1] jmp_buf
;
318 int setjmp(ref jmp_buf
);
319 void longjmp(ref jmp_buf
, int);
321 else version (CRuntime_Bionic
)
323 // <machine/setjmp.h>
332 else version (AArch64
)
336 else version (X86_64
)
342 static assert(false, "Architecture not supported.");
345 alias c_long
[_JBLEN
] jmp_buf
;
347 int setjmp(ref jmp_buf
);
348 void longjmp(ref jmp_buf
, int);
350 else version (CRuntime_UClibc
)
354 alias long[8] __jmp_buf
;
358 align(8) alias int[64] __jmp_buf
;
360 else version (MIPS32
)
387 else version (MIPS64
)
404 static assert(0, "unimplemented");
409 int __mask_was_saved
;
410 sigset_t __saved_mask
;
413 alias __jmp_buf_tag
[1] jmp_buf
;
415 alias _setjmp setjmp
;
416 void longjmp(ref jmp_buf
, int);
425 int sigsetjmp(sigjmp_buf, int);
426 void siglongjmp(sigjmp_buf, int);
429 version (CRuntime_Glibc
)
431 alias jmp_buf sigjmp_buf
;
433 int __sigsetjmp(sigjmp_buf
, int);
434 alias __sigsetjmp sigsetjmp
;
435 void siglongjmp(sigjmp_buf
, int);
437 else version (FreeBSD
)
439 // <machine/setjmp.h>
442 struct _sigjmp_buf
{ int[_JBLEN
+ 1] _ssjb
; }
444 else version (X86_64
)
446 struct _sigjmp_buf
{ c_long
[_JBLEN
] _sjb
; }
454 enum _JB_SIGMASK
= 3;
455 enum _JB_SIGFLAG
= 5;
456 struct _sigjmp_buf
{ c_long
[_JBLEN
+ 1] _sjb
; }
458 else version (AArch64
)
461 struct _sigjmp_buf
{ long[2][_JBLEN
+ 1] _jb
; }
463 else version (PPC_Any
)
465 struct _sigjmp_buf
{ long[_JBLEN
+ 1] _sjb
; }
469 alias _sigjmp_buf
[1] sigjmp_buf
;
471 int sigsetjmp(ref sigjmp_buf
);
472 void siglongjmp(ref sigjmp_buf
, int);
474 else version (NetBSD
)
476 // <machine/setjmp.h>
479 struct _sigjmp_buf
{ int[_JBLEN
+ 1] _ssjb
; }
481 else version (X86_64
)
483 struct _sigjmp_buf
{ c_long
[_JBLEN
] _sjb
; }
487 alias _sigjmp_buf
[_JBLEN
+ 1] sigjmp_buf
;
489 int sigsetjmp(ref sigjmp_buf
);
490 void siglongjmp(ref sigjmp_buf
, int);
492 else version (OpenBSD
)
494 alias sigjmp_buf
= c_long
[_JBLEN
+ 1];
496 int sigsetjmp(ref sigjmp_buf
);
497 void siglongjmp(ref sigjmp_buf
, int);
499 else version (DragonFlyBSD
)
501 // <machine/setjmp.h>
504 struct _sigjmp_buf
{ c_long
[_JBLEN
] _sjb
; }
508 alias _sigjmp_buf
[1] sigjmp_buf
;
510 int sigsetjmp(ref sigjmp_buf
);
511 void siglongjmp(ref sigjmp_buf
, int);
513 else version (CRuntime_Bionic
)
515 alias c_long
[_JBLEN
+ 1] sigjmp_buf
;
517 int sigsetjmp(ref sigjmp_buf
, int);
518 void siglongjmp(ref sigjmp_buf
, int);
520 else version (CRuntime_UClibc
)
522 alias jmp_buf sigjmp_buf
;
524 int __sigsetjmp(ref sigjmp_buf
, int);
525 alias __sigsetjmp sigsetjmp
;
526 void siglongjmp(ref sigjmp_buf
, int);
533 int _setjmp(jmp_buf);
534 void _longjmp(jmp_buf, int);
537 version (CRuntime_Glibc
)
539 int _setjmp(ref jmp_buf
);
540 void _longjmp(ref jmp_buf
, int);
542 else version (FreeBSD
)
544 int _setjmp(ref jmp_buf
);
545 void _longjmp(ref jmp_buf
, int);
547 else version (NetBSD
)
549 int _setjmp(ref jmp_buf
);
550 void _longjmp(ref jmp_buf
, int);
552 else version (OpenBSD
)
554 int _setjmp(ref jmp_buf
);
555 void _longjmp(ref jmp_buf
, int);
557 else version (DragonFlyBSD
)
559 int _setjmp(ref jmp_buf
);
560 void _longjmp(ref jmp_buf
, int);
562 else version (CRuntime_Bionic
)
564 int _setjmp(ref jmp_buf
);
565 void _longjmp(ref jmp_buf
, int);
567 else version (CRuntime_UClibc
)
569 int _setjmp(ref jmp_buf
);
570 void _longjmp(ref jmp_buf
, int);