bytecodealliance / bytecodealliance/wizer

Add support for snapshotting tables

Open
#29 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
1.1k
Forks
64
PR merge metrics
No merged PRs in 30d

Description

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
global.set $wizer_func_index
unreachable
end
```
* 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...

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.