summaryrefslogtreecommitdiff
path: root/bindings/linux/setjmp.h
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/linux/setjmp.h')
-rw-r--r--bindings/linux/setjmp.h37
1 files changed, 3 insertions, 34 deletions
diff --git a/bindings/linux/setjmp.h b/bindings/linux/setjmp.h
index 6da4313..c4716e6 100644
--- a/bindings/linux/setjmp.h
+++ b/bindings/linux/setjmp.h
@@ -7,38 +7,7 @@
// Linux doesn't provide setjmp/longjmp, boo.
-typedef void *jmp_buf[3]; // rsp, rbp, rip
+typedef void *jmp_buf[8];
-static inline int _setjmp(jmp_buf env) {
- register int ret asm ("%eax");
- __asm__ __volatile__ goto (
- " movq %%rsp, 0(%0)\n" // Save rsp
- " movq %%rbp, 8(%0)\n" // Save rbp
- " movq $1f, 16(%0)\n" // Save rip
- " jmp %l[setup]\n"
- "1:"
- : // No outputs allowed (GCC limitation).
- : "b" (env) // Input
- : // All registers clobbered except rsp, which save in env.
- "%rcx", "%rdx", "%rdi", "%rsi", "memory", "cc",
- "%r8" , "%r9" , "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
- : setup // Target labels.
- );
- return ret;
-
-setup:
- return 0;
-}
-
-__attribute__((__noreturn__))
-static inline void _longjmp(jmp_buf env, int val) {
- __asm__ __volatile__ (
- " movq 0(%0), %%rsp\n" // Restore rsp
- " movq 8(%0), %%rbp\n" // Restore rbp
- " movq %0, %%rbx\n" // Restore rbx
- " jmpq *16(%0)\n" // Jump to saved rip
- : // No output.
- : "r" (env), "a" (val) // Move val to %eax
- );
- __builtin_unreachable();
-}
+extern int _setjmp(jmp_buf env);
+__attribute__((__noreturn__)) extern void _longjmp(jmp_buf env, int val);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback