From 6fc756c4f1a5b7c0209c5dad0c0ec51b3b504df7 Mon Sep 17 00:00:00 2001 From: Ben Smith Date: Mon, 8 Jan 2018 17:35:01 -0800 Subject: Add wasm2c tool (#710) Add `wasm2c`, a new tool that reads a `.wasm` file and generates a C source file and its accompanying header file. The C output currently only supports gcc/clang compilers, since it uses builtins for some functionality. The resulting C code is not standalone; there are runtime functions that must be provided, as well as pointers to all imports. The C runtime symbols that must be provided are as follows: * `void wasm_rt_trap(wasm_rt_trap_t code)`: Called when the WebAssembly code traps. This function must not return. * `u32 wasm_rt_register_func_type(u32 param_count, u32 result_count, ...)`: Register a function type with the given signature. This function must check whether this signature has already been registered and return the original index. * `void wasm_rt_allocate_memory(wasm_rt_memory_t*, u32 initial, u32 max)`: Allocate the memory buffer for the given memory object, given the number of pages. The memory must be zeroed before returning. * `u32 wasm_rt_grow_memory(wasm_rt_memory_t*, u32 delta)`: Grow memory by the given number of pages. If allocation fails, or the new pages size is larger than the maximum, return -1. Otherwise return the previous number of pages. The newly allocated memory must be zeroed. * `void wasm_rt_allocate_table(wasm_rt_table_t*, u32 initial, u32 max)`: Allocate the buffer for the given table object. The buffer must be zeroed before returning. * `u32 wasm_rt_call_stack_depth`: A symbol that tracks the current call stack depth. If this value exceeds `WASM_RT_MAX_CALL_STACK_DEPTH` then a trap occurs. This value defaults to 500, but can redefined. An example implementation can be found in `spec-wasm2c-prefix.c`. All functionality from the WebAssembly MVP is supported, and the generated code passes all of the core spec tests. There is a new test tool called `run-spec-wasm2c.py` which runs the following: * `wast2json` to convert the spec test to json and wasm files * `wasm2c` to convert the wasm to C source and headers * a C compiler (default `cc`) to compile and link all C source files, including a C test runner (`spec-wasm2c-prefix.c`) * Finally, the resulting executable to produce output --- test/find_exe.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'test/find_exe.py') diff --git a/test/find_exe.py b/test/find_exe.py index 5bc919a6..8bc19d41 100644 --- a/test/find_exe.py +++ b/test/find_exe.py @@ -26,7 +26,7 @@ REPO_ROOT_DIR = os.path.dirname(SCRIPT_DIR) EXECUTABLES = [ 'wat2wasm', 'wast2json', 'wasm2wat', 'wasm-objdump', 'wasm-interp', 'wasm-opcodecnt', 'wat-desugar', 'wasm-link', 'spectest-interp', - 'wasm-validate', + 'wasm-validate', 'wasm2c', ] @@ -103,3 +103,7 @@ def GetWatDesugarExecutable(override=None): def GetWasmValidateExecutable(override=None): return FindExecutable('wasm-validate', override) + + +def GetWasm2CExecutable(override=None): + return FindExecutable('wasm2c', override) -- cgit v1.2.3