Fix new RuntimeError integration with the LLVM-backend

This commit is contained in:
Mark McCaskey 2020-04-27 12:55:58 -07:00
parent 2bbe3406cf
commit cffdb387f7
10 changed files with 20 additions and 20 deletions

View File

@ -4,7 +4,6 @@ extern "C" {
fn host_callback() -> u32; fn host_callback() -> u32;
} }
#[no_mangle]
fn test_callback() -> u32 { fn test_callback() -> u32 {
42 42
} }

View File

@ -13,7 +13,7 @@ MemoryManager::~MemoryManager() {
callbacks.dealloc_memory(read_section.base, read_section.size); callbacks.dealloc_memory(read_section.base, read_section.size);
callbacks.dealloc_memory(readwrite_section.base, readwrite_section.size); callbacks.dealloc_memory(readwrite_section.base, readwrite_section.size);
} }
void unwinding_setjmp(jmp_buf stack_out, void (*func)(void *), void *userdata) { void unwinding_setjmp(jmp_buf &stack_out, void (*func)(void *), void *userdata) {
if (setjmp(stack_out)) { if (setjmp(stack_out)) {
} else { } else {

View File

@ -63,6 +63,8 @@ enum WasmTrapType {
extern "C" void callback_trampoline(void *, void *); extern "C" void callback_trampoline(void *, void *);
extern "C" void copy_runtime_error(runtime_error_t src, runtime_error_t dst);
struct MemoryManager : llvm::RuntimeDyld::MemoryManager { struct MemoryManager : llvm::RuntimeDyld::MemoryManager {
public: public:
MemoryManager(callbacks_t callbacks) : callbacks(callbacks) {} MemoryManager(callbacks_t callbacks) : callbacks(callbacks) {}
@ -159,7 +161,7 @@ public:
runtime_error_t error_data; runtime_error_t error_data;
virtual void write_error(WasmErrorSink &out) const noexcept override { virtual void write_error(WasmErrorSink &out) const noexcept override {
out.user_error = error_data; copy_runtime_error(error_data, out.user_error);
} }
}; };

View File

@ -69,6 +69,16 @@ extern "C" {
) -> bool; ) -> bool;
} }
#[no_mangle]
pub unsafe extern "C" fn copy_runtime_error(
src: *mut Option<RuntimeError>,
dst: *mut Option<RuntimeError>,
) {
assert_eq!(src as usize % mem::align_of::<Option<RuntimeError>>(), 0);
assert_eq!(dst as usize % mem::align_of::<Option<RuntimeError>>(), 0);
ptr::copy::<Option<RuntimeError>>(src, dst, 1);
}
/// `invoke_trampoline` is a wrapper around `cxx_invoke_trampoline`, for fixing up the obsoleted /// `invoke_trampoline` is a wrapper around `cxx_invoke_trampoline`, for fixing up the obsoleted
/// `trap_out` in the C++ part. /// `trap_out` in the C++ part.
unsafe extern "C" fn invoke_trampoline( unsafe extern "C" fn invoke_trampoline(

View File

@ -944,10 +944,8 @@ pub unsafe extern "C" fn callback_trampoline(
b: *mut Option<RuntimeError>, b: *mut Option<RuntimeError>,
callback: *mut BreakpointHandler, callback: *mut BreakpointHandler,
) { ) {
dbg!("In llvm's callback_trampoline");
let callback = Box::from_raw(callback); let callback = Box::from_raw(callback);
let result: Result<(), RuntimeError> = callback(BreakpointInfo { fault: None }); let result: Result<(), RuntimeError> = callback(BreakpointInfo { fault: None });
dbg!(&*b);
match result { match result {
Ok(()) => *b = None, Ok(()) => *b = None,
Err(e) => *b = Some(e), Err(e) => *b = Some(e),

View File

@ -281,7 +281,7 @@ extern "C" fn signal_trap_handler(
let mut should_unwind = false; let mut should_unwind = false;
let mut unwind_result: Option<Box<RuntimeError>> = None; let mut unwind_result: Option<Box<RuntimeError>> = None;
let get_unwind_result = |uw_result: Option<Box<RuntimeError>>| -> Box<RuntimeError> { let get_unwind_result = |uw_result: Option<Box<RuntimeError>>| -> Box<RuntimeError> {
dbg!(uw_result) uw_result
.unwrap_or_else(|| Box::new(RuntimeError::InvokeError(InvokeError::FailedWithNoError))) .unwrap_or_else(|| Box::new(RuntimeError::InvokeError(InvokeError::FailedWithNoError)))
}; };

View File

@ -602,8 +602,10 @@ pub(crate) fn call_func_with_index_inner(
if success { if success {
Ok(()) Ok(())
} else { } else {
let error: RuntimeError = dbg!(error_out) let error: RuntimeError = error_out.map_or_else(
.map_or_else(|| RuntimeError::InvokeError(InvokeError::FailedWithNoError), Into::into); || RuntimeError::InvokeError(InvokeError::FailedWithNoError),
Into::into,
);
dbg!(&error); dbg!(&error);
Err(error.into()) Err(error.into())
} }

View File

@ -590,7 +590,7 @@ macro_rules! impl_traits {
) { ) {
Ok(Rets::from_ret_array(rets)) Ok(Rets::from_ret_array(rets))
} else { } else {
Err(dbg!(error_out).map_or_else(|| RuntimeError::InvokeError(InvokeError::FailedWithNoError), Into::into)) Err(error_out.map_or_else(|| RuntimeError::InvokeError(InvokeError::FailedWithNoError), Into::into))
} }
} }
} }

View File

@ -268,18 +268,7 @@ wasmer_backends! {
let result = foo.call(); let result = foo.call();
dbg!(&result);
if let Err(e) = &result {
dbg!(&e);
eprintln!("{}", &e);
}
match &result {
Err(RuntimeError::User(e)) => { dbg!("USER", &e); } ,
Err(e) => {dbg!("GENERIC",&e); } ,
_ => { dbg!("OKaY!"); },
}
if let Err(RuntimeError::User(e)) = result { if let Err(RuntimeError::User(e)) = result {
dbg!("WAT");
let exit_code = e.downcast::<ExitCode>().unwrap(); let exit_code = e.downcast::<ExitCode>().unwrap();
assert_eq!(exit_code.code, 42); assert_eq!(exit_code.code, 42);
} else { } else {