Traduz módulos WebAssembly para C portátil. Inspirado no wasm2c do wabt.
Trabalhando para que o WebAssembly seja o Binário Universal Elusivo:
↗ different
source code → WebAssembly → C89 → OSes,
(C++, Rust, ...) ↘ CPUs
names
.debug_line
. Requer que o libdwarf esteja instalado. Veja as instruções abaixo.Se o seu sistema for compatível com pelo menos CMake 2.8.12, prefira usar o CMake para detectar recursos. Em sistemas sem CMake você também pode usar Make.
cd w2c2
cmake -B build
cmake --build build
cd wasi
cmake -B build
cmake --build build
Por exemplo, para compilar module.wasm
para module.c
(e module.h
):
./w2c2 module.wasm module.c
w2c2 é capaz de compilar um módulo em arquivos C separados. Isto é recomendado ao compilar módulos grandes e em hosts com recursos limitados.
Por exemplo, para compilar module.wasm
(e module.h
), em vários arquivos com 100 funções cada:
./w2c2 -f 100 module.wasm module.c
Quando o w2c2 foi construído com suporte a threading, ele é capaz de compilar um módulo em paralelo. Por padrão, w2c2 gera tantos threads de trabalho quantos núcleos de CPU estiverem disponíveis.
Para especificar manualmente o número de threads de trabalho, passe o número usando o sinalizador -t
.
Por exemplo, para compilar usando 2 threads:
./w2c2 -t 2 module.wasm module.c
Marca principal:
cd examples/coremark
make
./coremark
Requer Python 3 e wabt (para 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
thread-spawn
(da proposta de threads) Para construir uma versão de depuração, passe BUILD=debug
para make
.
Para habilitar sanitizadores, liste-os na variável SANITIZERS
passada para make
, por exemplo make BUILD=debug SANITIZERS="base clang address thread"
.
base
ativa o Desinfetante de Comportamento Indefinidoclang
permite desinfetantes específicos do Clangthread
ativa o Thread Sanitizeraddress
ativa o Address Sanitizer No Linux, tente instalar um pacote chamado libdwarf-dev
No macOS, você pode usar o Homebrew e instalar libdwarf
(não dwarf
!)
O w2c2 atualmente usa como padrão a API libdwarf de >=v0.4.2. v0.6.0 também foi testado para funcionar com sucesso.
Se estiver usando uma versão <0.4.2, tente passar -DDWARF_OLD=1
para CMake. Sabe-se que a versão 20200114 funciona.
Desde a versão 0.1.1, o libdwarf vem com um arquivo pkg-config, que o CMake deve ser capaz de detectar automaticamente.
Se o libdwarf não puder ser encontrado automaticamente pelo CMake, você receberá a seguinte mensagem:
-- Checking for module 'libdwarf'
-- No package 'libdwarf' found
Nesse caso você ainda pode fornecer as informações necessárias manualmente, passando uma variação das seguintes opções:
-DDWARF_FOUND=1 -DDWARF_LIBRARIES=-ldwarf -DDWARF_LIBRARY_DIRS=/usr/lib -DDWARF_INCLUDE_DIRS=/usr/include/libdwarf