Dealing with webassembly

In this tutorial we will see the possible ways to use web assembly.

Compiling wasm to native code

The first possible usage is to take a wasm module and compile it to native code. The idea is to take wasm code and compile it to native code.

First lets create some wasm code by using wasmfiddle:

https://wasdk.github.io/WasmFiddle/

int main() {
  return 42;
}

The wasm output of this is:

(module
  (table 0 funcref)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "main" (func $main))
  (func $main (result i32)
    (i32.const 42)
  )
)

Download this wasm file from wasm fiddle to your local drive. Now you can compile it to for example native riscv code:

$ python -m ppci.cli.wasmcompile -v program.wasm -m riscv -O 2 -S
$ cat f.out
    .section data
    .section code
main:
    sw x1, -8(x2)
    sw x8, -12(x2)
    mv x8, x2
    addi x2, x2, -12
    addi x2, x2, 0
block1:
    addi x10, x0, 42
    j main_epilog
main_epilog:
    addi x2, x2, 0
    addi x2, x2, 12
    lw x8, -12(x2)
    lw x1, -8(x2)
    jalr x0,x1, 0
    .align 4

In this example we compiled C code with one compiler to wasm and took this wasm and compiled it to riscv code using ppci.

Please see WebAssembly for the python api for using webassembly.