• Stars
    star
    106
  • Rank 325,871 (Top 7 %)
  • Language
    C++
  • License
    Apache License 2.0
  • Created about 6 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

WebAssembly module decoder in C++

Github CI Status

wasp

Wasp is a C++ library designed to make it easy to work with WebAssembly modules. Unlike tools like wabt, it is designed to be used as a library.

It also includes the wasp tool, which has the following commands:

  • wasp dump: Dump the contents of a WebAssembly module
  • wasp callgraph: Generate a dot graph of the module's callgraph
  • wasp cfg: Generate a dot graph of a function's control-flow graph
  • wasp dfg: Generate a dot graph of a function's data-flow graph
  • wasp validate: Validate a WebAssembly module
  • wasp pattern: Find instruction sequence patterns
  • wasp wat2wasm: Convert a Wasm text file to a Wasm binary file

Building using CMake (Linux and macOS)

You'll need CMake. You can then run CMake, the normal way:

$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .

Building (Windows)

You'll need CMake. You'll also need Visual Studio (2019 or newer).

Note: Visual Studio 2017 and later come with CMake (and the Ninja build system) out of the box, and should be on your PATH if you open a Developer Command prompt. See https://aka.ms/cmake for more details.

You can run CMake from the command prompt, or use the CMake GUI tool. See Running CMake for more information.

When running from the commandline, create a new directory for the build artifacts, then run cmake from this directory:

> cd [build dir]
> cmake [wasp project root] -DCMAKE_BUILD_TYPE=[config] -DCMAKE_INSTALL_PREFIX=[install directory] -G [generator]

The [config] parameter should be a CMake build type, typically DEBUG or RELEASE.

The [generator] parameter should be the type of project you want to generate, for example "Visual Studio 16 2019". You can see the list of available generators by running cmake --help.

To build the project, you can use Visual Studio, or you can tell CMake to do it:

> cmake --build [wasp project root] --config [config] --target install

This will build and install to the installation directory you provided above.

So, for example, if you want to build the debug configuration on Visual Studio 2019:

> mkdir build
> cd build
> cmake .. -DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_INSTALL_PREFIX=..\ -G "Visual Studio 16 2019"
> cmake --build . --config DEBUG --target install

wasp dump examples

Disassemble all functions in a module:

$ wasp dump -d mod.wasm

Display all sections in a module:

$ wasp dump -h mod.wasm

Display the contents of the "import" section:

$ wasp dump -j import -x mod.wasm

wasp callgraph examples

Write the callgraph as a DOT file to stdout.

$ wasp callgraph mod.wasm

Write the callgraph as a DOT file to file.dot.

$ wasp callgraph mod.wasm -o file.dot

You can use graphviz to convert the DOT file to an SVG:

$ dot -Tsvg file.dot -O

For example, the following wasm file:

(func $a call $b)
(func $b call $c call $d)
(func $c)
(func $d call $a call $b call $d)

Becomes this SVG:

callgraph

wasp cfg examples

Write the CFG of function 0 as a DOT file to stdout.

$ wasp cfg -f 0 mod.wasm

Write the CFG of function foo as a DOT file to file.dot.

$ wasp cfg -f foo mod.wasm -o file.dot

For example, the following wasm file:

(func $fac (param i64) (result i64)
  (if (result i64) (i64.eq (local.get 0) (i64.const 0))
    (then (i64.const 1))
    (else
      (i64.mul (local.get 0) (call 0 (i64.sub (local.get 0) (i64.const 1)))))))

Becomes this SVG:

cfg

wasp dfg examples

Write the DFG of function 0 as a DOT file to stdout.

$ wasp dfg -f 0 mod.wasm

Write the DFG of function foo as a DOT file to file.dot.

$ wasp dfg -f foo mod.wasm -o file.dot

For example, the following wasm file:

(func $fac (param i64) (result i64)
  (if (result i64) (i64.eq (local.get 0) (i64.const 0))
    (then (i64.const 1))
    (else
      (i64.mul (local.get 0) (call 0 (i64.sub (local.get 0) (i64.const 1)))))))

Becomes this SVG:

dfg

wasp validate examples

Validate a module.

$ wasp validate mod.wasm

Validate multiple modules.

$ wasp validate mod1.wasm mod2.wasm mod3.wasm

wasp pattern examples

Print the 10 most common instruction sequences.

$ wasp pattern mod.wasm -d 10

This produces results similar to those shown below. The columns are as follows:

  1. How often the instruction sequence occurred
  2. The instruction sequence length
  3. The instruction sequence
  4. A percentage, calculated as 100 * count * sequence length / total instructions.
71333: [2] [i32.const 0 global.set 10] 4.17%
37382: [2] [end end] 2.19%
34937: [2] [i32.const 1 i32.and] 2.04%
25099: [2] [block [] block []] 1.47%
21440: [2] [i32.and if []] 1.25%
20154: [2] [i32.eqz if []] 1.18%
19883: [3] [i32.const 1 i32.and if []] 1.75%
18643: [2] [return end] 1.09%
15857: [3] [block [] block [] block []] 1.39%
15314: [2] [end local.get 0] 0.90%
total instructions: 3417737

wasp wat2wasm examples

Convert test.wat to test.wasm.

$ wasp wat2wasm test.wat

Convert test.wat to something.wasm.

$ wasp wat2wasm test.wat -o something.wasm

Convert test.wat to test.wasm, but skip validation.

$ wasp wat2wasm test.wat --no-validate

Convert test.wat to test.wasm, and enable the SIMD feature.

$ wasp wat2wasm test.wat --enable-simd

More Repositories

1

design

WebAssembly Design Documents
11,261
star
2

binaryen

Optimizer and compiler/toolchain library for WebAssembly
WebAssembly
7,376
star
3

wabt

The WebAssembly Binary Toolkit
C++
6,778
star
4

WASI

WebAssembly System Interface
Rust
4,810
star
5

spec

WebAssembly specification, reference interpreter, and test suite.
WebAssembly
3,148
star
6

wasi-sdk

WASI-enabled WebAssembly C/C++ toolchain
CMake
1,224
star
7

gc

Branch of the spec repo scoped to discussion of GC integration in WebAssembly
WebAssembly
982
star
8

component-model

Repository for design and specification of the Component Model
Python
945
star
9

proposals

Tracking WebAssembly proposals
849
star
10

wasi-libc

WASI libc implementation for WebAssembly
C
836
star
11

interface-types

WebAssembly
641
star
12

threads

Threads and Atomics in WebAssembly
WebAssembly
577
star
13

wasm-c-api

Wasm C API prototype
C++
539
star
14

simd

Branch of the spec repo scoped to discussion of SIMD in WebAssembly
WebAssembly
531
star
15

meetings

WebAssembly meetings (VC or in-person), agendas, and notes
HTML
468
star
16

wasi-nn

Neural Network proposal for WASI
449
star
17

esm-integration

ECMAScript module integration
WebAssembly
370
star
18

wasm-jit-prototype

Standalone VM using LLVM JIT
C++
309
star
19

tool-conventions

Conventions supporting interoperatibility between tools working with WebAssembly.
297
star
20

website

WebAssembly website
CSS
270
star
21

memory64

Memory with 64-bit indexes
WebAssembly
210
star
22

testsuite

Mirror of the spec testsuite
WebAssembly
191
star
23

wasi-filesystem

Filesystem API for WASI
167
star
24

reference-types

Proposal for adding basic reference types (anyref)
WebAssembly
163
star
25

wasi-crypto

WASI Cryptography API Proposal
Makefile
162
star
26

exception-handling

Proposal to add exception handling to WebAssembly
WebAssembly
156
star
27

wasi-sockets

WASI API proposal for managing sockets
Rust
155
star
28

wasi-http

142
star
29

wasi-threads

WebAssembly
136
star
30

wasi-io

I/O Types proposal for WASI
132
star
31

multi-memory

Multiple per-module memories for Wasm
WebAssembly
127
star
32

stack-switching

A repository for the stack switching proposal.
WebAssembly
124
star
33

module-linking

Proposal for allowing modules to define, import and export modules and instances
WebAssembly
120
star
34

tail-call

Proposal to add tail calls to WebAssembly
WebAssembly
110
star
35

function-references

Proposal for Typed Function References
WebAssembly
99
star
36

debugging

Design documents and discussions about debug support in WebAssembly
98
star
37

wasmint

Library for interpreting / debugging wasm code
C++
94
star
38

bulk-memory-operations

Bulk memory operations
WebAssembly
74
star
39

wasi-webgpu

72
star
40

js-promise-integration

JavaScript Promise Integration
WebAssembly
69
star
41

multi-value

Proposal to add multi-values to WebAssembly
WebAssembly
66
star
42

wasi-testsuite

WASI Testsuite
Rust
51
star
43

wasi-cloud-core

Rust
50
star
44

flexible-vectors

Vector operations for WebAssembly
WebAssembly
48
star
45

waterfall

Build and test bots
45
star
46

js-types

Proposal for adding type reflection to the JS API
WebAssembly
44
star
47

relaxed-simd

Relax the strict determinism requirements of SIMD operations.
WebAssembly
43
star
48

content-security-policy

WebAssembly
38
star
49

shared-everything-threads

A draft proposal for spawning threads in WebAssembly
WebAssembly
38
star
50

stringref

WebAssembly
37
star
51

JS-BigInt-integration

JavaScript BigInt to WebAssembly i64 integration
WebAssembly
36
star
52

wasi-keyvalue

35
star
53

wasi-libc-old

Precursor to WASI libc.
C
35
star
54

wasi-clocks

Clocks API for WASI
35
star
55

wasi-random

Entropy source API for WASI
29
star
56

benchmarks

Resources for collaborative benchmarking
JavaScript
27
star
57

wasi-sql

25
star
58

wasi-sql-embed

23
star
59

memory-control

A proposal to introduce finer grained control of WebAssembly memory.
WebAssembly
21
star
60

annotations

Proposal for Custom Annotation Syntax in the Text Format
WebAssembly
20
star
61

proposal-type-imports

Proposal for Type Imports & Exports
WebAssembly
20
star
62

constant-time

Constant-time WebAssembly
WebAssembly
20
star
63

wasi-proposal-template

Starter template for proposing a new WASI API
19
star
64

wasi-messaging

Messaging proposal for WASI
18
star
65

wasi-tools

WASI tools
Rust
17
star
66

funclets

Proposal for adding funclets - flexible intraprocedural control flow
WebAssembly
17
star
67

wasi-parallel

wasi-parallel is a proposal to add a parallel for construct to WASI.
Shell
17
star
68

sign-extension-ops

Sign-extension opcodes
WebAssembly
17
star
69

mutable-global

Import & export of mutable globals
WebAssembly
16
star
70

wasi-poll

16
star
71

wasi-cli

Command-Line Interface (CLI) World for WASI
15
star
72

extended-const

Proposal for extended constant expressions
WebAssembly
15
star
73

wasi-observe

Observability World for WASI
Just
15
star
74

instrument-tracing

Proposal to add instrumentation and tracing instructions to WebAssembly
WebAssembly
14
star
75

nontrapping-float-to-int-conversions

Proposal to add non-trapping float-to-int conversions to WebAssembly
WebAssembly
14
star
76

wasi-blobstore

14
star
77

conditional-sections

WebAssembly
13
star
78

wasi-grpc

13
star
79

profiles

Profiles proposal
WebAssembly
12
star
80

wasi-logging

WASI logging API
11
star
81

wasi-i2c

I2C API for WASI
Rust
11
star
82

extended-name-section

WebAssembly
11
star
83

feature-detection

WebAssembly
10
star
84

wasi-config

10
star
85

webassembly.github.io

Redirect to webassembly.org
HTML
10
star
86

testsuite-js

WebAssembly testsuite tests converted to single-file JavaScript tests
JavaScript
9
star
87

lld

Staging repository for upstreaming WebAssembly support into lld
C++
9
star
88

branch-hinting

Proposal to add branch hinting functionality to WebAssembly
WebAssembly
9
star
89

decompressor-prototype

C++
8
star
90

wat-numeric-values

Proposal to add numeric values to data segment definitions in the text format
WebAssembly
7
star
91

gc-js-customization

WebAssembly
7
star
92

js-string-builtins

JS String Builtins
WebAssembly
6
star
93

wasi-classic-command

6
star
94

wasi-url

6
star
95

half-precision

Proposal to introduce half precision operations
WebAssembly
6
star
96

wit-abi-up-to-date

5
star
97

wasi-spi

Rust
5
star
98

wg-charter

Proposed WebAssembly Working Group charter
HTML
5
star
99

call-tags

WebAssembly
4
star
100

cg-charter

Proposed WebAssembly Community Group charter
HTML
4
star