--- /dev/null
+toolchain/build
+sysroot
+*.swp
+.DS_Store
+test.wasm
--- /dev/null
+[submodule "toolchain/src/llvm"]
+ path = toolchain/src/llvm
+ url = https://git.llvm.org/git/llvm
+[submodule "toolchain/src/musl"]
+ path = toolchain/src/musl
+ url = https://github.com/jfbastien/musl.git
+[submodule "toolchain/src/libcxxabi"]
+ path = toolchain/src/libcxxabi
+ url = http://llvm.org/git/libcxxabi
+[submodule "toolchain/src/compiler-rt"]
+ path = toolchain/src/compiler-rt
+ url = http://llvm.org/git/compiler-rt
+[submodule "toolchain/src/libcxx"]
+ path = toolchain/src/libcxx
+ url = http://llvm.org/git/libcxx
--- /dev/null
+# build llvm and clang (for wasm only)
+toolchain/build/llvm/bin/clang:
+ mkdir -p toolchain/build/llvm
+ cmake -G "Unix Makefiles" \
+ -DLLVM_TARGETS_TO_BUILD= \
+ -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly \
+ -S toolchain/src/llvm -B toolchain/build/llvm
+ # install the tools we need
+ $(MAKE) -C toolchain/build/llvm clang lld llvm-ar llvm-config llvm-ranlib
+
+ROOT_DIR=${CURDIR}
+# now build libc
+sysroot/lib/libc.a: toolchain/build/llvm/bin/clang
+ mkdir -p toolchain/build/musl
+ cd toolchain/build/musl; $(ROOT_DIR)/toolchain/src/musl/configure \
+ CC=$(ROOT_DIR)/toolchain/build/llvm/bin/clang \
+ CFLAGS="--target=wasm32-unknown-unknown-wasm -O3" \
+ --prefix=$(ROOT_DIR)/sysroot \
+ wasm32
+ $(MAKE) -C toolchain/build/musl install \
+ CROSS_COMPILE=$(ROOT_DIR)/toolchain/build/llvm/bin/llvm-
+ # need to copy over musl's list of javascript function imports
+ cp toolchain/src/musl/arch/wasm32/libc.imports sysroot/lib
+
+# build the wasm32 builtins
+toolchain/build/llvm/lib/clang/8.0.0/lib/libclang_rt.builtins-wasm32.a: toolchain/build/llvm/bin/clang
+ mkdir -p toolchain/build/compiler-rt
+ cmake -G "Unix Makefiles" \
+ -DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/toolchain/compiler-rt.cmake \
+ -S toolchain/src/compiler-rt/lib/builtins -B toolchain/build/compiler-rt
+ $(MAKE) -C toolchain/build/compiler-rt/ install
+
+sysroot/lib/libc++.a: toolchain/build/llvm/bin/clang toolchain/build/llvm/lib/clang/8.0.0/lib/libclang_rt.builtins-wasm32.a sysroot/lib/libc.a
+ mkdir -p toolchain/build/libcxx
+ cmake -G "Unix Makefiles" \
+ -DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/toolchain/libcxx.cmake \
+ -S toolchain/src/libcxx/ -B toolchain/build/libcxx
+ $(MAKE) -C toolchain/build/libcxx install
+
+sysroot/lib/libc++abi.a: toolchain/build/llvm/bin/clang sysroot/lib/libc++.a
+ mkdir -p toolchain/build/libcxxabi
+ cmake -G "Unix Makefiles" \
+ -DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/toolchain/libcxxabi.cmake \
+ -S toolchain/src/libcxxabi -B toolchain/build/libcxxabi
+ $(MAKE) -C toolchain/build/libcxxabi install
+
+
+sysroot: sysroot/lib/libc.a sysroot/lib/libc++.a sysroot/lib/libc++abi.a
+
+test.wasm: test.cpp sysroot
+ clang++ --target=wasm32-unknown-unknown-wasm -g \
+ -fno-exceptions --sysroot=sysroot -nostartfiles \
+ -Wl,--export=foo,--demangle,--no-entry \
+ test.cpp -o test.wasm
--- /dev/null
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+import Data.Text (Text)
+
+import qualified Network.WebSockets as WS
+
+main :: IO ()
+main = do
+ WS.runServer "127.0.0.1" 8889 $ \pending -> do
+ conn <- WS.acceptRequest pending
+ WS.sendTextData conn ("Hello there" :: Text)
--- /dev/null
+<script type="text/javascript" src="main.js"></script>
--- /dev/null
+const memory = new WebAssembly.Memory( { initial: 2, maximum: 8 })
+const imports = {
+ env: {
+ __syscall1: (n, a) => console.log(n),
+ __syscall3: (n, a, b, c) => console.log(n),
+ __syscall5: (n, a, b, c, d, e) => console.log(n)
+ }
+}
+
+const sock = new WebSocket('ws://localhost:8889')
+sock.onmessage = function (e) {
+ console.log(e.data)
+}
+
+function instantiate(bytes) {
+ return WebAssembly.compile(bytes).
+ then(m => new WebAssembly.Instance(m, imports));
+}
+
+fetch('test.wasm')
+ .then(response => response.arrayBuffer())
+ .then(bytes => instantiate(bytes))
+ .then(instance => console.log(instance.exports.foo()));
--- /dev/null
+#include <vector>
+extern "C" int foo() {
+ std::vector<int> *xs = new std::vector<int>();
+ xs->push_back(42);
+ return (*xs)[0];
+}
--- /dev/null
+include(${CMAKE_CURRENT_LIST_DIR}/settings.cmake)
+
+# compiler-rt options
+set(COMPILER_RT_DEFAULT_TARGET_ONLY ON CACHE STRING "wasm")
+set(COMPILER_RT_INCLUDE_TESTS OFF CACHE STRING "wasm")
+set(COMPILER_RT_BAREMETAL_BUILD ON CACHE STRING "wasm")
+set(COMPILER_RT_ENABLE_IOS OFF CACHE STRING "wasm")
+set(COMPILER_RT_BUILD_XRAY OFF CACHE STRING "wasm")
+
+# install into the clang lib folder
+set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/build/llvm/lib/clang/8.0.0 CACHE STRING "wasm")
+set(COMPILER_RT_OS_DIR . CACHE STRING "wasm")
+
--- /dev/null
+include(${CMAKE_CURRENT_LIST_DIR}/settings.cmake)
+
+set(CMAKE_CXX_FLAGS "--target=wasm32-unknown-unknown-wasm -D_LIBCPP_HAS_MUSL_LIBC" CACHE STRING "wasm")
+
+# no fancy stuff por favor
+set(LIBCXX_ENABLE_THREADS OFF CACHE STRING "wasm")
+set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE STRING "wasm")
+
+# no libc++.dylib, all static linking
+set(LIBCXX_ENABLE_SHARED OFF CACHE STRING "wasm")
+
+# don't bother building libc++experimental.a
+set(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY OFF CACHE STRING "wasm")
+# same for libc++fs.a
+set(LIBCXX_ENABLE_FILESYSTEM OFF CACHE STRING "wasm")
+
+# set(LIBCXX_ENABLE_STDIN OFF)
+# set(LIBCXX_ENABLE_STDOUT OFF CACHE STRING "wasm")
+
+# set(CMAKE_EXE_LINKER_FLAGS "-Wl,--allow-undefined-file=${CMAKE_CURRENT_LIST_DIR}/../sysroot/lib/libc.imports,--no-threads" CACHE STRING "wasm")
+
+set(LIBCXX_CXX_ABI libcxxabi CACHE STRING "wasm")
+set(LIBCXX_CXX_ABI_INCLUDE_PATHS ${CMAKE_CURRENT_LIST_DIR}/src/libcxxabi/include CACHE STRING "wasm")
+
--- /dev/null
+include(${CMAKE_CURRENT_LIST_DIR}/settings.cmake)
+
+set(CMAKE_CXX_FLAGS "--target=wasm32-unknown-unknown-wasm -D_LIBCPP_HAS_MUSL_LIBC" CACHE STRING "wasm")
+
+# no fancy stuff
+set(LIBCXXABI_ENABLE_THREADS OFF CACHE STRING "wasm")
+set(LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE STRING "wasm")
+
+# no libc++abi.dylib
+set(LIBCXXABI_ENABLE_SHARED OFF CACHE STRING "wasm")
+
+set(CXX_SUPPORTS_CXX11 ON CACHE STRING "wasm")
+set(LLVM_COMPILER_CHECKED ON CACHE STRING "wasm")
+set(UNIX ON CACHE STRING "wasm")
+
+set(LIBCXXABI_LIBCXX_PATH ${CMAKE_CURRENT_LIST_DIR}/src/libcxx CACHE STRING "wasm")
+set(LIBCXXABI_LIBCXX_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/../sysroot/include/c++/v1 CACHE STRING "wasm")
+
+
--- /dev/null
+set(CMAKE_SYSTEM_NAME Wasm)
+set(CMAKE_SYSTEM_PROCESSOR wasm32)
+
+set(CMAKE_BUILD_TYPE RelWithDebInfo)
+
+set(LLVM_CONFIG_PATH ${CMAKE_CURRENT_LIST_DIR}/build/llvm/bin/llvm-config)
+
+set(CMAKE_C_COMPILER ${CMAKE_CURRENT_LIST_DIR}/build/llvm/bin/clang)
+set(CMAKE_C_COMPILER_TARGET wasm32-unknown-unknown-wasm)
+set(CMAKE_C_FLAGS "--target=wasm32-unknown-unknown-wasm -O3")
+
+set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_LIST_DIR}/build/llvm/bin/clang++)
+set(CMAKE_CXX_COMPILER_TARGET wasm32-unknown-unknown-wasm)
+
+set(CMAKE_SYSROOT ${CMAKE_CURRENT_LIST_DIR}/../sysroot CACHE STRING "wasm")
+# install all the libs and includes into the sysroot folder, not /usr/local
+set(CMAKE_STAGING_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../sysroot CACHE STRING "wasm")
+
+set(CMAKE_AR ${CMAKE_CURRENT_LIST_DIR}/build/llvm/bin/llvm-ar)
+
+set(CMAKE_C_COMPILER_WORKS ON)
+set(CMAKE_CXX_COMPILER_WORKS ON)
+
--- /dev/null
+Subproject commit 84a39fa8a9e89e1bd7d5c241863bc6042deeaa41
--- /dev/null
+Subproject commit a815a3f8ccb1c9346dab7b8a55c6e96073200a63
--- /dev/null
+Subproject commit 307bb62985575b2e3216a8cfd7e122e0574f33a9
--- /dev/null
+Subproject commit 8a38ce8063b0e96461f7abbf450d4111f6886247
--- /dev/null
+Subproject commit 65f7253c1e16fe6b274bf6c24c2c0c33800d00d6