wasm-aot-prototype icon indicating copy to clipboard operation
wasm-aot-prototype copied to clipboard

AOT compiler and static runtime for WebAssembly

WebAssembly AOT Prototype (aka WAOT)

Ahead-of-time compiler and runtime for WebAssembly

Overview

WAOT compiles WebAssembly s-expression files of the style used by the WebAssembly spec <https://github.com/WebAssembly/spec>_ into native executables.

It uses sexpr-wasm-prototype <https://github.com/WebAssembly/sexpr-wasm-prototype>_ to parse s-expressions to an AST IR, and generates LLVM IR from that. It then translates the LLVM to a native object file and links it with a provided runtime library and the platform's standard C library. It is developed on Linux but should (most likely?) work on Mac OS as well.

WAOT is intended to be an experimental platform for non-browser, non-Javascript uses of WebAssembly and inform its design. It's still in an early stage. I have thus far avoided the temptation to run the LLVM optimizers or look at the generated code.

Components

sexpr_dump S-expression dumper: parses an s-expression file into WAOT's AST and dumps it out again. Currently no desugaring is done, so files should round-trip.

wat WebAssembly Translator: reads an s-expression file and outputs an LLVM assembly file.

libwart WebAssembly runtime library: a target library against which compiled WebAssembly modules are linked. Includes definitions of functions defined in the spec interpreter's 'host' section (e.g. stdio.print) and libgcc-style runtime support functions called by generated code (e.g. __assert_fail)

wac.py WebAssembly Compiler: an end-to-end compiler which runs wat and LLVM's llc tool to create an object file, and links it against libwart.a

Building and Running

Clone as normal, but don't forget to update/init submodules as well::

$ git clone https://github.com/WebAssembly/wasm-aot-prototype $ git submodule update --init

Build or download LLVM. I use a locally-built copy of LLVM 3.7, configured using CMake's BUILD_SHARED_LIBS option because it makes for fast link times. The Makefile's default linker flags are set up for that use case. Set LLVM_PATH in your environment to a directory containing the llvm-config program. If you want to run the tests, it must also contain llvm-lit and FileCheck (which means it probably needs to be a build directory rather than an install directory).

Run make. By default output goes into the out/ directory, and current options for build targets include the above-mentioned components, plus the sexpr-wasm tool from sexpr-wasm-prototype <https://github.com/WebAssembly/sexpr-wasm-prototype>_, (which is used for testing) and a test target.

To run tests, run make test. This will run the tests from the test/ directory using llvm-lit and FileCheck, which are described in the LLVM command guide <http://llvm.org/docs/CommandGuide/index.html>_

License and Contributing

Contributions are welcome, and should follow the same guidelines as the WebAssembly design <https://github.com/WebAssembly/design/blob/master/Contributing.md>. The license can be found in the <LICENSE> file. This repository also includes tests derived from the sexpr-wasm-prototype <https://github.com/WebAssembly/sexpr-wasm-prototype>_ and spec <https://github.com/WebAssembly/spec>_ repositories, which would covered by those licenses (spoiler alert: they are the same license).