diff --git a/README.md b/README.md index 3c94098..97358aa 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,8 @@ One of the [design goals](https://github.com/ewasm/design/blob/master/rationale. At present, we've developed support for the following languages and toolchains: -- LLVM: C, C++, and Rust: documentation pending +- [C/C++ (LLVM) WebAssembly tutorial](./clang.md) +- Rust: documentation pending - [AssemblyScript](https://github.com/AssemblyScript/assemblyscript), a subset of TypeScript, which uses the JavaScript toolchain: see the [etherts org](https://github.com/etherts/docs) for more information on writing contracts in AssemblyScript. If you're interested in adding support for another language, framework, or toolset, see the Contributing section above and reach out. diff --git a/clang.md b/clang.md new file mode 100644 index 0000000..ded7333 --- /dev/null +++ b/clang.md @@ -0,0 +1,54 @@ +# Compiling C/C++ to WebAssembly + +## Rolling your own compiler + +Clang has a WebAssembly target, though it is not easy to use currently. First, a custom build must be made. + +To build `clang`: +```sh +git clone http://llvm.org/git/llvm.git +cd llvm/tools +git clone http://llvm.org/git/clang.git +cd ../projects +git clone http://llvm.org/git/compiler-rt.git +mkdir ../build +cd ../build +cmake -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DLLVM_TARGETS_TO_BUILD= .. +cmake --build . +cd ../.. +``` + +This will take anything from 1 to 5 hours. + +To build `binaryen`: +```sh +git clone https://github.com/WebAssembly/binaryen.git +cd binaryen +mkdir build +cd build +cmake .. +cmake --build . +cd ../.. +``` + +## Using this compiler + +Now everything is set to finally compile *Hello World*! + +The compilation process has four steps: +- compiling (`clang`) +- linking to LLVM IR (`llc`) +- compiling to WebAssembly S-expressions (`s2wasm`) +- compiling to WebAssembly binary (`wasm-as`) + +Note: the last step can also be accomplished with [wabt](https://github.com/webassembly/wabt) (previously called *sexpr-wasm-prototype*). + +Cheat sheet: +```sh +clang -emit-llvm --target=wasm32-unknown-unknown-elf -nostdlib -S hello.c +llc -o hello.s hello.ll +s2wasm -o hello.wast hello.s +wasm-as -o hello.wasm hello.wast +``` + +There you go, you have your very first WebAssembly binary.