diff --git a/lib/llvm-backend/build.rs b/lib/llvm-backend/build.rs index 904a83fb1..6c8117dd9 100644 --- a/lib/llvm-backend/build.rs +++ b/lib/llvm-backend/build.rs @@ -209,14 +209,12 @@ fn main() { cc::Build::new() .cpp(true) .file("cpp/object_loader.cpp") - .file("cpp/unwinding.s") .compile("llvm-backend"); println!("cargo:rustc-link-lib=static=llvm-backend"); println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=cpp/object_loader.cpp"); println!("cargo:rerun-if-changed=cpp/object_loader.hh"); - println!("cargo:rerun-if-changed=cpp/unwinding.s"); // Enable "nightly" cfg if the current compiler is nightly. if rustc_version::version_meta().unwrap().channel == rustc_version::Channel::Nightly { diff --git a/lib/llvm-backend/cpp/object_loader.cpp b/lib/llvm-backend/cpp/object_loader.cpp index ff2c4132b..224b498b7 100644 --- a/lib/llvm-backend/cpp/object_loader.cpp +++ b/lib/llvm-backend/cpp/object_loader.cpp @@ -1,15 +1,27 @@ #include "object_loader.hh" #include #include +#include extern "C" void __register_frame(uint8_t *); extern "C" void __deregister_frame(uint8_t *); -extern "C" void unwinding_setjmp(uint8_t **stack_out, void (*func)(void *), void *userdata); -[[noreturn]] extern "C" void unwinding_longjmp(uint8_t *stack_in); + +void unwinding_setjmp(jmp_buf stack_out, void (*func)(void *), void *userdata) { + if(setjmp(stack_out)) { + + } else { + func(userdata); + } +} + +[[noreturn]] +void unwinding_longjmp(jmp_buf stack_in) { + longjmp(stack_in, 42); +} struct UnwindPoint { UnwindPoint *prev; - uint8_t *stack; + jmp_buf stack; std::function *f; std::unique_ptr exception; }; @@ -27,7 +39,7 @@ void catch_unwind(std::function&& f) { current.f = &f; unwind_state = ¤t; - unwinding_setjmp(¤t.stack, unwind_payload, (void *) ¤t); + unwinding_setjmp(current.stack, unwind_payload, (void *) ¤t); if(current.exception) { throw *current.exception; } diff --git a/lib/llvm-backend/cpp/unwinding.s b/lib/llvm-backend/cpp/unwinding.s deleted file mode 100644 index dfe91234e..000000000 --- a/lib/llvm-backend/cpp/unwinding.s +++ /dev/null @@ -1,27 +0,0 @@ -# (save_place, func(userdata), userdata) -.globl _unwinding_setjmp -_unwinding_setjmp: -push %r15 -push %r14 -push %r13 -push %r12 -push %rbx -push %rbp -sub $8, %rsp # 16-byte alignment -mov %rsp, (%rdi) -mov %rdx, %rdi -callq *%rsi -setjmp_ret: -add $8, %rsp -pop %rbp -pop %rbx -pop %r12 -pop %r13 -pop %r14 -pop %r15 -ret - -.globl _unwinding_longjmp -_unwinding_longjmp: -mov %rdi, %rsp -jmp setjmp_ret