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 (__i386__) && (defined(__FreeBSD__) || defined(__linux__))
11 struct Label
12 {
13 ulong pc;
14 ulong bx;
15 ulong sp;
16 ulong bp;
17 ulong si;
18 ulong di;
19 };
20 #elif defined(__APPLE__)
21 struct Label
22 {
23 ulong pc; /* lr */
24 ulong cr; /* mfcr */
25 ulong ctr; /* mfcr */
26 ulong xer; /* mfcr */
27 ulong sp; /* callee saved: r1 */
28 ulong toc; /* callee saved: r2 */
29 ulong gpr[19]; /* callee saved: r13-r31 */
30 // XXX: currently do not save vector registers or floating-point state
31 // ulong pad;
32 // uvlong fpr[18]; /* callee saved: f14-f31 */
33 // ulong vr[4*12]; /* callee saved: v20-v31, 256-bits each */
34 };
35 #elif defined(__sun__)
36 struct Label
37 {
38 ulong input[8]; /* %i registers */
39 ulong local[8]; /* %l registers */
40 ulong sp; /* %o6 */
41 ulong link; /* %o7 */
42 };
43 #else
44 #error "Unknown or unsupported architecture"
45 #endif