Files
wasmtime/crates/runtime/signalhandlers/Trampolines.cpp
Dan Gohman 9a88d3d894 Replace the global-exports mechanism with a caller-vmctx mechanism. (#789)
* Replace the global-exports mechanism with a caller-vmctx mechanism.

This eliminates the global exports mechanism, and instead adds a
caller-vmctx argument to wasm functions so that WASI can obtain the
memory and other things from the caller rather than looking them up in a
global registry.

This replaces #390.

* Fixup some merge conflicts

* Rustfmt

* Ensure VMContext is aligned to 16 bytes

With the removal of `global_exports` it "just so happens" that this
isn't happening naturally any more.

* Fixup some bugs with double vmctx in wasmtime crate

* Trampoline stub needed adjusting
* Use pointer type instead of always using I64 for caller vmctx
* Don't store `ir::Signature` in `Func` since we don't know the pointer
  size at creation time.
* Skip the first 2 arguments in IR signatures since that's the two vmctx
  parameters.

* Update cranelift to 0.56.0

* Handle more merge conflicts

* Rustfmt

Co-authored-by: Alex Crichton <alex@alexcrichton.com>
2020-01-21 14:50:59 -08:00

43 lines
765 B
C++

#include <setjmp.h>
#include "SignalHandlers.hpp"
extern "C"
int WasmtimeCallTrampoline(
void *vmctx,
void *caller_vmctx,
void (*body)(void*, void*, void*),
void *args)
{
jmp_buf buf;
void *volatile prev;
if (setjmp(buf) != 0) {
LeaveScope(prev);
return 0;
}
prev = EnterScope(&buf);
body(vmctx, caller_vmctx, args);
LeaveScope(prev);
return 1;
}
extern "C"
int WasmtimeCall(void *vmctx, void *caller_vmctx, void (*body)(void*, void*)) {
jmp_buf buf;
void *volatile prev;
if (setjmp(buf) != 0) {
LeaveScope(prev);
return 0;
}
prev = EnterScope(&buf);
body(vmctx, caller_vmctx);
LeaveScope(prev);
return 1;
}
extern "C"
void Unwind() {
jmp_buf *buf = (jmp_buf*) GetScope();
longjmp(*buf, 1);
}