Skip to content
forked from turbolent/w2c2

Translates WebAssembly modules to C

License

Notifications You must be signed in to change notification settings

asiekierka/w2c2

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

w2c2

Translates WebAssembly modules to C. Inspired by wabt's wasm2c.

Features

  • 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

Performance

  • Coremark 1.0: ~7% slower than native

Compilation

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 to FEATURES.
  • If the host system has support for getopt, add getopt to FEATURES.
  • Generating debug information requires libdwarf on the host system. Add debugging to FEATURES.

Usage

Compile module.wasm to module.c:

./w2c2 -o module.c module.wasm

Parallel Compilation

Compile module.wasm using 12 concurrent jobs into multiple files with 100 functions each:

./w2c2 -o module_directory -j 12 -f 100 module.wasm

Examples

Coremark:

cd examples/coremark
./coremark

Testing

Requires Python 3 and wabt (for wast2json).

cd tests
make gen
make run-tests

WASI Status

  • 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

Development

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".

About

Translates WebAssembly modules to C

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • WebAssembly 84.5%
  • C 15.2%
  • Other 0.3%