A compiler from WebAssembly to native code, via the OCaml backend. See this blog post for motivation and a technical explanation.
The compiler only supports the
amd64 backend of OCaml at the moment (integer size is assumed to be 64-bit).
The compiler currently uses some functionality not present in the main OCaml compiler. To get
cmm_of_wasm up and running, you'll need to install an opam switch running https://github.com/simonjf/ocaml/tree/patched-branch.
You will also need
libwasm on an
opam pin: https://github.com/SimonJF/libwasm.
I believe the only other dependencies are
After that, simply run
./cmm_of_wasm <.wat or .wasm file>
There are other options, too:
This will generate
.h files, which you should be able to link with a C project.
Running the test suite
Firstly, ensure you've cloned all submodules:
git submodule update --recursive --remote
After this, you should be able to
cd tests/wasm/ and run
src/lib/cmmcompile: Compiler from the Stackless IR to CMM code
src/lib/ir: Compilation from the WebAssembly AST to a stackless intermediate representation
src/bin: Entry point and build utilities (I will probably split off the build utilities into
libat some point)
src/rts: C runtime system, adapted from the
wasm2cRTS (see https://github.com/webassembly/wabt)
test/ounit: Small OUnit test suite for function type hashes
test/wasm: Scaffolding for running the WebAssembly test suite, adapted from
Thanks to Stephen Dolan, KC Sivaramakrishnan, and Mark Shinwell for useful discussions. Thanks also to Pierre Chambart for sharing an early prototype, and whose IR I used.
This work was funded by an internship at OCaml Labs, who also provided a truly wonderful working environment.