d: Merge upstream dmd, druntime 4c18eed967, phobos d945686a4.
[official-gcc.git] / libphobos / libdruntime / core / sys / posix / setjmp.d
blobcd378ce03a74bbb16bbb53189749eaf528d54dec
1 /**
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).
6 * Authors: Sean Kelly
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
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
20 version (Posix):
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;
29 // Required
32 jmp_buf
34 int setjmp(ref jmp_buf);
35 void longjmp(ref jmp_buf, int);
38 version (CRuntime_Glibc)
40 version (X86_64)
42 //enum JB_BX = 0;
43 //enum JB_BP = 1;
44 //enum JB_12 = 2;
45 //enum JB_13 = 3;
46 //enum JB_14 = 4;
47 //enum JB_15 = 5;
48 //enum JB_SP = 6;
49 //enum JB_PC = 7;
50 //enum JB_SIZE = 64;
52 alias long[8] __jmp_buf;
54 else version (X86)
56 //enum JB_BX = 0;
57 //enum JB_SI = 1;
58 //enum JB_DI = 2;
59 //enum JB_BP = 3;
60 //enum JB_SP = 4;
61 //enum JB_PC = 5;
62 //enum JB_SIZE = 24;
64 alias int[6] __jmp_buf;
66 else version (SPARC)
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;
78 else version (ARM)
80 alias int[64] __jmp_buf;
82 else version (HPPA)
84 struct __jmp_buf
86 int __r3;
87 int[15] __r4_r18;
88 int __r19;
89 int __r27;
90 int __sp;
91 int __rp;
92 int __pad1;
93 double[10] __fr12_fr21;
96 else version (PPC)
98 alias int[64 + (12*4)] __jmp_buf;
100 else version (PPC64)
102 alias long[64] __jmp_buf;
104 else version (MIPS32)
106 struct __jmp_buf
108 version (MIPS_O32)
110 void * __pc;
111 void * __sp;
112 int[8] __regs;
113 void * __fp;
114 void * __gp;
116 else
118 long __pc;
119 long __sp;
120 long[8] __regs;
121 long __fp;
122 long __gp;
124 int __fpc_csr;
125 version (MIPS_N64)
126 double[8] __fpregs;
127 else
128 double[6] __fpregs;
131 else version (MIPS64)
133 struct __jmp_buf
135 long __pc;
136 long __sp;
137 long[8] __regs;
138 long __fp;
139 long __gp;
140 int __fpc_csr;
141 version (MIPS_N64)
142 double[8] __fpregs;
143 else
144 double[6] __fpregs;
147 else version (RISCV_Any)
149 struct __riscv_jmp_buf
151 c_long __pc;
152 c_long[12] __regs;
153 c_long __sp;
154 static if (__traits(getTargetInfo, "floatAbi") == "double")
155 double[12] __fpregs;
157 alias __jmp_buf = __riscv_jmp_buf[1];
159 else version (S390)
161 struct __s390_jmp_buf
163 c_long[10] __gregs;
164 c_long[4] __fpregs;
166 alias __jmp_buf = __s390_jmp_buf[1];
168 else version (SystemZ)
170 struct __s390_jmp_buf
172 c_long[10] __gregs;
173 c_long[8] __fpregs;
175 alias __jmp_buf = __s390_jmp_buf[1];
177 else version (LoongArch64)
179 struct __loongarch_jmp_buf
181 long __pc;
182 long __sp;
183 // reserved
184 long __r21;
185 long __fp;
186 long[9] __regs;
187 static if (__traits(getTargetInfo, "floatAbi") != "soft_float")
188 double[8] __fpregs;
190 alias __jmp_buf = __loongarch_jmp_buf[1];
192 else
193 static assert(0, "unimplemented");
195 struct __jmp_buf_tag
197 __jmp_buf __jmpbuf;
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>
210 version (X86)
212 enum _JBLEN = 11;
213 struct _jmp_buf { int[_JBLEN + 1] _jb; }
215 else version (X86_64)
217 enum _JBLEN = 12;
218 struct _jmp_buf { c_long[_JBLEN] _jb; }
220 else version (SPARC)
222 enum _JBLEN = 5;
223 struct _jmp_buf { c_long[_JBLEN + 1] _jb; }
225 else version (AArch64)
227 enum _JBLEN = 31;
228 // __int128_t
229 struct _jmp_buf { long[2][_JBLEN + 1] _jb; }
231 else version (PPC_Any)
233 enum _JBLEN = 100;
234 struct _jmp_buf { long[_JBLEN + 1] _jb; }
236 else
237 static assert(0);
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>
246 version (X86)
248 enum _JBLEN = 13;
249 struct _jmp_buf { int[_JBLEN + 1] _jb; }
251 else version (X86_64)
253 enum _JBLEN = 11;
254 struct _jmp_buf { c_long[_JBLEN] _jb; }
256 else
257 static assert(0);
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>
266 version (X86)
268 enum _JBLEN = 10;
270 else version (X86_64)
272 enum _JBLEN = 11;
274 else version (ARM)
276 enum _JBLEN = 64;
278 else version (AArch64)
280 enum _JBLEN = 64;
282 else version (PPC)
284 enum _JBLEN = 100;
286 else version (MIPS64)
288 enum _JBLEN = 83;
290 else version (SPARC)
292 enum _JBLEN = 10;
294 else version (SPARC64)
296 enum _JBLEN = 14;
298 else
299 static assert(0);
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>
309 version (X86_64)
311 enum _JBLEN = 12;
312 struct _jmp_buf { c_long[_JBLEN] _jb; }
314 else
315 static assert(0);
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>
324 version (X86)
326 enum _JBLEN = 10;
328 else version (ARM)
330 enum _JBLEN = 64;
332 else version (AArch64)
334 enum _JBLEN = 32;
336 else version (X86_64)
338 enum _JBLEN = 11;
340 else
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)
352 version (X86_64)
354 alias long[8] __jmp_buf;
356 else version (ARM)
358 align(8) alias int[64] __jmp_buf;
360 else version (MIPS32)
362 struct __jmp_buf
364 version (MIPS_O32)
366 void * __pc;
367 void * __sp;
368 int[8] __regs;
369 void * __fp;
370 void * __gp;
372 else
374 long __pc;
375 long __sp;
376 long[8] __regs;
377 long __fp;
378 long __gp;
380 int __fpc_csr;
381 version (MIPS_N64)
382 double[8] __fpregs;
383 else
384 double[6] __fpregs;
387 else version (MIPS64)
389 struct __jmp_buf
391 long __pc;
392 long __sp;
393 long[8] __regs;
394 long __fp;
395 long __gp;
396 int __fpc_csr;
397 version (MIPS_N64)
398 double[8] __fpregs;
399 else
400 double[6] __fpregs;
403 else
404 static assert(0, "unimplemented");
406 struct __jmp_buf_tag
408 __jmp_buf __jmpbuf;
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);
420 // C Extension (CX)
423 sigjmp_buf
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>
440 version (X86)
442 struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; }
444 else version (X86_64)
446 struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
448 else version (SPARC)
450 enum _JBLEN = 5;
451 enum _JB_FP = 0;
452 enum _JB_PC = 1;
453 enum _JB_SP = 2;
454 enum _JB_SIGMASK = 3;
455 enum _JB_SIGFLAG = 5;
456 struct _sigjmp_buf { c_long[_JBLEN + 1] _sjb; }
458 else version (AArch64)
460 // __int128_t
461 struct _sigjmp_buf { long[2][_JBLEN + 1] _jb; }
463 else version (PPC_Any)
465 struct _sigjmp_buf { long[_JBLEN + 1] _sjb; }
467 else
468 static assert(0);
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>
477 version (X86)
479 struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; }
481 else version (X86_64)
483 struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
485 else
486 static assert(0);
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>
502 version (X86_64)
504 struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
506 else
507 static assert(0);
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);
530 // XOpen (XSI)
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);