]> gcc.gnu.org Git - gcc.git/blob - libphobos/libdruntime/core/sys/posix/setjmp.d
d: Merge upstream dmd d579c467c1, phobos 88aa69b14.
[gcc.git] / libphobos / libdruntime / core / sys / posix / setjmp.d
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
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 }
This page took 0.060747 seconds and 5 git commands to generate.