Connect helper C symbols to their static library

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
This commit is contained in:
Alex Crichton
2021-06-21 07:25:58 -07:00
parent 7ce46043dc
commit 724beaf0f3
6 changed files with 15 additions and 14 deletions

View File

@@ -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,
@@ -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);
}

View File

@@ -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! {
@@ -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,
@@ -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());
}
}
@@ -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()
}

View File

@@ -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::*;
@@ -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! {

View File

@@ -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;
@@ -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 {

View File

@@ -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::*;
@@ -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)
}
})
}