/* * setjmp and longjmp, but our own because some (stupid) c libraries * assume longjmp is only used to move up the stack, and error out * if you do otherwise. */ typedef struct Label Label; #define LABELDPC 0 #if defined (__i386__) && (defined(__FreeBSD__) || defined(__linux__) || defined(__OpenBSD__)) struct Label { ulong pc; ulong bx; ulong sp; ulong bp; ulong si; ulong di; }; #elif defined(__APPLE__) struct Label { ulong pc; /* lr */ ulong cr; /* mfcr */ ulong ctr; /* mfcr */ ulong xer; /* mfcr */ ulong sp; /* callee saved: r1 */ ulong toc; /* callee saved: r2 */ ulong gpr[19]; /* callee saved: r13-r31 */ // XXX: currently do not save vector registers or floating-point state // ulong pad; // uvlong fpr[18]; /* callee saved: f14-f31 */ // ulong vr[4*12]; /* callee saved: v20-v31, 256-bits each */ }; #elif defined(__sun__) struct Label { ulong input[8]; /* %i registers */ ulong local[8]; /* %l registers */ ulong sp; /* %o6 */ ulong link; /* %o7 */ }; #else #error "Unknown or unsupported architecture" #endif