wizer
wizer copied to clipboard
Add support for snapshotting tables
Right now there are two potential kinds of tables:
-
funcref
tables -
externref
tables
The latter are easy to support, since Wasm can't construct an externref
, only receive it from the outside world. As long as we don't allow any externrefs into the Wasm during initialization, then all we have to do is record the initialized size of these tables.
funcref
tables are a little harder. Wasm can create funcref
s via the ref.func
instruction. So we need a way to figure out which function each wasmtime::FuncRef
in a table we are snapshotting is (i.e. what is the local function index of the i
th table element?). wasmtime
doesn't expose anything like that. I have an idea, however:
- during Wizer's instrumentation phase:
- add two new globals to the module:
$wizer_getting_func_index
and$wizer_func_index
- add the following snippet to the start of every function in the module:
block global.get $wizer_getting_func_index i32.eqz br_if 0 i32.const <this function's local index> global.set $wizer_func_index unreachable end
- add two new globals to the module:
- then, during snapshotting, to get a given
funcref
's local function index, we set the$wizer_getting_func_index
global non-zero, call the function, and then it will set its local function index to the$wizer_func_index
global and trap. - the dummy functions we create for imports will need a similar dance, but implemented in native code rather than Wasm. Something similar for wasi functions too.
The one problem is that local function index isn't quite enough in the face of module linking. Instead we will need both the instance "id" (whatever that this; DFS index?) as well as the local function index in that instance. More to think about w.r.t. module linking here...