Blob


1 /*
2 * setjmp and longjmp, but our own because some (stupid) c libraries
3 * assume longjmp is only used to move up the stack, and error out
4 * if you do otherwise.
5 */
7 typedef struct Label Label;
8 #define LABELDPC 0
10 #if defined(__linux__)
11 #include <ucontext.h>
12 struct Label
13 {
14 ucontext_t uc;
15 };
16 #elif defined (__i386__) && (defined(__FreeBSD__) || defined(__linux__) || defined(__OpenBSD__))
17 struct Label
18 {
19 ulong pc;
20 ulong bx;
21 ulong sp;
22 ulong bp;
23 ulong si;
24 ulong di;
25 };
26 #elif defined(__APPLE__)
27 struct Label
28 {
29 ulong pc; /* lr */
30 ulong cr; /* mfcr */
31 ulong ctr; /* mfcr */
32 ulong xer; /* mfcr */
33 ulong sp; /* callee saved: r1 */
34 ulong toc; /* callee saved: r2 */
35 ulong gpr[19]; /* callee saved: r13-r31 */
36 // XXX: currently do not save vector registers or floating-point state
37 // ulong pad;
38 // uvlong fpr[18]; /* callee saved: f14-f31 */
39 // ulong vr[4*12]; /* callee saved: v20-v31, 256-bits each */
40 };
41 #elif defined(__sun__)
42 struct Label
43 {
44 ulong input[8]; /* %i registers */
45 ulong local[8]; /* %l registers */
46 ulong sp; /* %o6 */
47 ulong link; /* %o7 */
48 };
49 #elif defined(__powerpc__)
50 struct Label
51 {
52 ulong pc; /* lr */
53 ulong cr; /* mfcr */
54 ulong ctr; /* mfcr */
55 ulong xer; /* mfcr */
56 ulong sp; /* callee saved: r1 */
57 ulong toc; /* callee saved: r2 */
58 ulong gpr[19]; /* callee saved: r13-r31 */
59 // XXX: currently do not save vector registers or floating-point state
60 // ulong pad;
61 // uvlong fpr[18]; /* callee saved: f14-f31 */
62 // ulong vr[4*12]; /* callee saved: v20-v31, 256-bits each */
63 };
64 #else
65 #error "Unknown or unsupported architecture"
66 #endif