xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/posix/setjmp.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
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  */
15 module core.sys.posix.setjmp;
16 
17 import core.sys.posix.config;
18 import core.sys.posix.signal; // for sigset_t
19 
20 version (Posix):
21 extern (C) nothrow @nogc:
22 @system:
23 
24 version (RISCV32) version = RISCV_Any;
25 version (RISCV64) version = RISCV_Any;
26 version (PPC) version = PPC_Any;
27 version (PPC64) version = PPC_Any;
28 
29 //
30 // Required
31 //
32 /*
33 jmp_buf
34 
35 int  setjmp(ref jmp_buf);
36 void longjmp(ref jmp_buf, int);
37 */
38 
version(CRuntime_Glibc)39 version (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 }
193 else 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 }
229 else 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 }
249 else 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 }
292 else 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 }
307 else 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 }
336 else 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 /*
409 sigjmp_buf
410 
411 int  sigsetjmp(sigjmp_buf, int);
412 void siglongjmp(sigjmp_buf, int);
413 */
414 
415 version (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 }
423 else 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 }
460 else 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 }
478 else 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 }
485 else 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 }
499 else 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 }
506 else 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 /*
519 int  _setjmp(jmp_buf);
520 void _longjmp(jmp_buf, int);
521 */
522 
523 version (CRuntime_Glibc)
524 {
525     int  _setjmp(ref jmp_buf);
526     void _longjmp(ref jmp_buf, int);
527 }
528 else version (FreeBSD)
529 {
530     int  _setjmp(ref jmp_buf);
531     void _longjmp(ref jmp_buf, int);
532 }
533 else version (NetBSD)
534 {
535     int  _setjmp(ref jmp_buf);
536     void _longjmp(ref jmp_buf, int);
537 }
538 else version (OpenBSD)
539 {
540     int  _setjmp(ref jmp_buf);
541     void _longjmp(ref jmp_buf, int);
542 }
543 else version (DragonFlyBSD)
544 {
545     int  _setjmp(ref jmp_buf);
546     void _longjmp(ref jmp_buf, int);
547 }
548 else version (CRuntime_Bionic)
549 {
550     int  _setjmp(ref jmp_buf);
551     void _longjmp(ref jmp_buf, int);
552 }
553 else version (CRuntime_UClibc)
554 {
555     int  _setjmp(ref jmp_buf);
556     void _longjmp(ref jmp_buf, int);
557 }
558