Translates WebAssembly modules to C. Inspired by wabt's wasm2c.
- Implements the WebAssembly Core Specification 1.0
- Passes 99.9% of the WebAssembly core semantics test suite
- Written in C89 and generates C89
- Support for older operating systems and architectures
- Support for big-endian systems
- Streaming compilation, low memory usage
- Parallel compilation into multiple files
- WASI implementation which is able to run
clang.wasm
- Coremark 1.0: ~7% slower than native
make
To enables certain features, list them in the FEATURES
variable passed to make
, e.g. make FEATURES="threads"
:
- Parallel compilation requires pthreads on the host system. Add
threads
toFEATURES
. - If the host system has support for getopt, add
getopt
toFEATURES
. - Generating debug information requires
libdwarf
on the host system. Adddebugging
toFEATURES
.
Compile module.wasm
to module.c
:
./w2c2 -o module.c module.wasm
Compile module.wasm
using 12 concurrent jobs into multiple files with 100 functions each:
./w2c2 -o module_directory -j 12 -f 100 module.wasm
Coremark:
cd examples/coremark
./coremark
Requires Python 3 and wabt (for wast2json).
cd tests
make gen
make run-tests
- args_get
- args_sizes_get
- clock_res_get
- clock_time_get
- environ_get
- environ_sizes_get
- fd_advise
- fd_allocate
- fd_close
- fd_datasync
- fd_fdstat_get
- fd_fdstat_set_flags
- fd_fdstat_set_rights
- fd_filestat_get
- fd_filestat_set_size
- fd_filestat_set_times
- fd_pread
- fd_prestat_get
- fd_prestat_dir_name
- fd_pwrite
- fd_read
- fd_readdir
- fd_renumber
- fd_seek
- fd_sync
- fd_tell
- fd_write
- path_create_directory
- path_filestat_get
- path_filestat_set_times
- path_link
- path_open
- path_readlink
- path_remove_directory
- path_rename
- path_symlink
- path_unlink_file
- poll_oneoff
- proc_exit
- random_get
- sched_yield
- sock_recv
- sock_send
- sock_shutdown
To build a debug release, pass BUILD=debug
to make
.
To enable sanitizers, list them in the SANITIZERS
variable passed to make
, e.g. make BUILD=debug SANITIZERS="base clang address thread"
.
base
enables the Undefined Behavior Sanitizerclang
enables Clang-specific sanitizersthread
enables the Thread Sanitizeraddress
enables the Address Sanitizer