Skip to content

Commit

Permalink
Connect helper C symbols to their static library
Browse files Browse the repository at this point in the history
This commit adds a `#[link]` annotation to the block defining symbols
coming from a native static library that we build and link. This is
required by rustc to get symbols to get exported correctly when linking
wasmtime into a Rust dynamic library instead of always as an rlib.

While I was at it I went ahead and renamed the symbols now that they're
no longer in C++ and they're doing setjmp/longjmp and not much else.

Closes #3006
  • Loading branch information
alexcrichton committed Jun 21, 2021
1 parent 7ce4604 commit 724beaf
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 14 deletions.
2 changes: 1 addition & 1 deletion crates/runtime/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ fn main() {
None,
)
.file("src/helpers.c")
.compile("helpers");
.compile("wasmtime-helpers");
}
4 changes: 2 additions & 2 deletions crates/runtime/src/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define platform_jmp_buf sigjmp_buf
#endif

int RegisterSetjmp(
int wasmtime_setjmp(
void **buf_storage,
void (*body)(void*, void*),
void *payload,
Expand All @@ -28,7 +28,7 @@ int RegisterSetjmp(
return 1;
}

void Unwind(void *JmpBuf) {
void wasmtime_longjmp(void *JmpBuf) {
platform_jmp_buf *buf = (platform_jmp_buf*) JmpBuf;
platform_longjmp(*buf, 1);
}
11 changes: 6 additions & 5 deletions crates/runtime/src/traphandlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@ use wasmtime_environ::ir;

pub use self::tls::{tls_eager_initialize, TlsRestore};

#[link(name = "wasmtime-helpers")]
extern "C" {
#[allow(improper_ctypes)]
fn RegisterSetjmp(
fn wasmtime_setjmp(
jmp_buf: *mut *const u8,
callback: extern "C" fn(*mut u8, *mut VMContext),
payload: *mut u8,
callee: *mut VMContext,
) -> i32;
fn Unwind(jmp_buf: *const u8) -> !;
fn wasmtime_longjmp(jmp_buf: *const u8) -> !;
}

cfg_if::cfg_if! {
Expand Down Expand Up @@ -177,7 +178,7 @@ where
F: FnMut(*mut VMContext),
{
return CallThreadState::new(signal_handler).with(vminterrupts, |cx| {
RegisterSetjmp(
wasmtime_setjmp(
cx.jmp_buf.as_ptr(),
call_closure::<F>,
&mut closure as *mut F as *mut u8,
Expand Down Expand Up @@ -251,7 +252,7 @@ impl CallThreadState {
fn unwind_with(&self, reason: UnwindReason) -> ! {
unsafe {
(*self.unwind.get()).as_mut_ptr().write(reason);
Unwind(self.jmp_buf.get());
wasmtime_longjmp(self.jmp_buf.get());
}
}

Expand Down Expand Up @@ -306,7 +307,7 @@ impl CallThreadState {
}

// If all that passed then this is indeed a wasm trap, so return the
// `jmp_buf` passed to `Unwind` to resume.
// `jmp_buf` passed to `wasmtime_longjmp` to resume.
self.jmp_buf.get()
}

Expand Down
4 changes: 2 additions & 2 deletions crates/runtime/src/traphandlers/macos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#![allow(non_snake_case)]

use crate::traphandlers::{tls, Trap, Unwind};
use crate::traphandlers::{tls, wasmtime_longjmp, Trap};
use mach::exception_types::*;
use mach::kern_return::*;
use mach::mach_init::*;
Expand Down Expand Up @@ -389,7 +389,7 @@ unsafe extern "C" fn unwind(wasm_pc: *const u8) -> ! {
state.jmp_buf.get()
});
debug_assert!(!jmp_buf.is_null());
Unwind(jmp_buf);
wasmtime_longjmp(jmp_buf);
}

thread_local! {
Expand Down
4 changes: 2 additions & 2 deletions crates/runtime/src/traphandlers/unix.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::traphandlers::{tls, Trap, Unwind};
use crate::traphandlers::{tls, wasmtime_longjmp, Trap};
use std::cell::RefCell;
use std::convert::TryInto;
use std::io;
Expand Down Expand Up @@ -99,7 +99,7 @@ unsafe extern "C" fn trap_handler(
return true;
}
info.capture_backtrace(pc);
Unwind(jmp_buf)
wasmtime_longjmp(jmp_buf)
});

if handled {
Expand Down
4 changes: 2 additions & 2 deletions crates/runtime/src/traphandlers/windows.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::traphandlers::{tls, Trap, Unwind};
use crate::traphandlers::{tls, wasmtime_longjmp, Trap};
use std::io;
use winapi::um::errhandlingapi::*;
use winapi::um::minwinbase::*;
Expand Down Expand Up @@ -69,7 +69,7 @@ unsafe extern "system" fn exception_handler(exception_info: PEXCEPTION_POINTERS)
EXCEPTION_CONTINUE_EXECUTION
} else {
info.capture_backtrace(ip);
Unwind(jmp_buf)
wasmtime_longjmp(jmp_buf)
}
})
}
Expand Down

0 comments on commit 724beaf

Please sign in to comment.