├── .gitignore ├── Makefile ├── README.md ├── docker ├── manual-gc │ ├── Dockerfile │ └── wasmfile.patch ├── spidermonkey │ └── Dockerfile └── wasm-gc │ └── Dockerfile └── sm-wabt-wrapper └── sm.ml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | workspace* 3 | .vscode -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | clean: 2 | rm -rf workspace 3 | 4 | clone: 5 | mkdir workspace 6 | mkdir workspace/llvmwasm 7 | mkdir workspace/llvmwasm/llvm-build 8 | git clone --recursive https://github.com/sanderspies/wabt workspace/wabt 9 | git clone https://github.com/SanderSpies/ocaml workspace/ocaml 10 | 11 | build-image-manual-gc: 12 | cd docker/manual-gc && docker build --no-cache . -t ocaml-wasm-manual-gc 13 | 14 | build-image-fast-manual-gc: 15 | cd docker/manual-gc && docker build . -t ocaml-wasm-manual-gc 16 | 17 | build-image-wasm-gc: 18 | cd docker/wasm-gc && docker build --no-cache . -t ocaml-wasm-base-gc 19 | 20 | build-image-fast-wasm-gc: 21 | cd docker/wasm-gc && docker build . -t ocaml-wasm-base-gc 22 | 23 | build-sm: 24 | docker build . -f docker/spidermonkey/Dockerfile -t ocaml-wasm-spidermonkey 25 | 26 | run-sm: 27 | docker run --name ocaml-wasm-spidermonkey --rm -it ocaml-wasm-spidermonkey /sm-root/sm/js/src/build_OPT.OBJ/js/src/js 28 | 29 | run-container-dev-wasm-gc: 30 | docker run --name ocaml-wasm-bash-gc --rm -dit -v `pwd`/workspace-wasmgc:/workspace:z ocaml-wasm-base-gc bash 31 | 32 | run-container-dev-manual-gc: 33 | docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined --name ocaml-wasm-manual-gc --rm -dit -v `pwd`/workspace-manualgc:/workspace:z ocaml-wasm-manual-gc bash 34 | 35 | run-sm-wabt: 36 | docker run --name ocaml-wasm-spidermonkey-container --rm -it -v `pwd`/workspace:/sm-root/workspace:z ocaml-wasm-spidermonkey bash 37 | 38 | run-container-wasm-gc: 39 | docker run --name ocaml-wasm-bash-gc --rm -dit -v `pwd`/workspace-wasmgc:/workspace:z sanderspies/ocaml-wasm-test:0.12 bash 40 | 41 | run-container-manual-gc: 42 | docker run --name ocaml-wasm-manual-gc --rm -dit -v `pwd`/workspace-manualgc:/workspace:z sanderspies/ocaml-wasm-test:0.12 bash 43 | 44 | get-image: 45 | docker pull sanderspies/ocaml-wasm-test:0.12 46 | 47 | copy-sources-manual-gc: 48 | mkdir -p workspace-manualgc 49 | docker exec ocaml-wasm-manual-gc mv /wabt /workspace 50 | docker exec ocaml-wasm-manual-gc mv /ocaml /workspace 51 | 52 | copy-sources-wasm-gc: 53 | mkdir -p workspace-wasmgc 54 | docker exec ocaml-wasm-bash-gc mv /llvmwasm/llvm/tools/lld /workspace 55 | docker exec ocaml-wasm-bash-gc mv /llvmwasm/llvm/lib/Object /workspace 56 | docker exec ocaml-wasm-bash-gc mv /llvmwasm/llvm/include /workspace 57 | docker exec ocaml-wasm-bash-gc ln -sf /workspace/lld /llvmwasm/llvm/tools/lld 58 | docker exec ocaml-wasm-bash-gc ln -sf /workspace/Object /llvmwasm/llvm/lib/Object 59 | docker exec ocaml-wasm-bash-gc ln -sf /workspace/include /llvmwasm/llvm/lib/include 60 | docker exec ocaml-wasm-bash-gc mv /wabt /workspace 61 | docker exec ocaml-wasm-bash-gc mv /ocaml /workspace 62 | 63 | build-ocaml: 64 | docker exec -w /workspace/ocaml ocaml-wasm-bash git checkout before_gc 65 | docker exec -w /workspace/ocaml ocaml-wasm-bash ./configure -no-pthread -no-debugger -no-curses -no-ocamldoc -no-graph -target-wasm32 -cc clang 66 | docker exec -w /workspace/ocaml ocaml-wasm-bash make coldstart 67 | docker exec -w /workspace/ocaml ocaml-wasm-bash make wasm32 68 | 69 | build-wabt: 70 | docker exec -e LLVM_HOME=/llvmwasm/llvm-build -w /workspace/wabt ocaml-wasm-bash make 71 | 72 | build-lld: 73 | docker exec -w /llvmwasm/llvm-build ocaml-wasm-bash make -j4 74 | 75 | wasm32: 76 | docker exec -w /workspace/ocaml ocaml-wasm-bash make wasm32 77 | 78 | install: 79 | make get-image 80 | make run-container 81 | make copy-sources 82 | make build-ocaml 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Current steps to get a working manual gc environment: 2 | - make build-image-fast-manual-gc 3 | - make run-container-dev-manual-gc 4 | - make copy-sources-manual-gc 5 | - docker attach 6 | - make wasi 7 | 8 | TODO: change the text below: 9 | 10 | OCaml wasm in a separate docker container 11 | === 12 | Intended for development on OCaml wasm. 13 | 14 | To be able to edit the projects locally, a volume is used which maps 15 | to `workspace`. 16 | 17 | First time: 18 | - `make install` 19 | 20 | Does the following: 21 | - pulls a docker image from dockerhub 22 | - copy the sources from the image to the workspace volume via rsync (will most likely take a while) 23 | 24 | Editing: 25 | - open the correct folder inside `workspace` in your editor, once done choose one of the following build commands 26 | 27 | Build OCaml: 28 | - `make build-ocaml` 29 | 30 | Build OCaml for incremental development: 31 | - `make ocaml` 32 | 33 | Build LLD: 34 | - `make build-lld` 35 | 36 | Build WABT: 37 | - `make build-wabt` 38 | 39 | Build instructions for docker image: 40 | - `make build-image` 41 | - tag the image 42 | - push to dockerhub 43 | - update the tag in the make file 44 | - push changes to github 45 | 46 | ## Using spidermonkey to try out experimental wasm 47 | 48 | - `make build-sm` to build spidermonkey 49 | - `make run-sm-wabt` to run and connect to the container interactively. This will load the bash shell. To log into the spidermonkey shell directly, use `make run-sm` 50 | - Once attached to the container (ocaml-wasm-spidermonkey-container) `sm-wabt-wrapper` is available to you in the path. Use `sm-wabt-wrapper output.wasm input.wat` to create .wasm files from .wat inside the `workspace` directory 51 | 52 | Note: On Linux 4.19, due to a [bug in METACOPY](https://www.spinics.net/lists/linux-unionfs/msg06109.html), docker [has issues building images](https://github.com/docker/for-linux/issues/480), because of which you may encounter `Invalid cross-device link` or `dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link`. Run the following before building the sm image in case you do. 53 | 54 | echo N | sudo tee /sys/module/overlay/parameters/metacopy 55 | 56 | 57 | 58 | ## Issues 59 | 60 | If you are using docker-for-mac or docker-for-windows, you'll probably need to increase limit resources available to Docker. 61 | You can find these settings at Docker > Preferences > Advanced. 62 | 63 | Following setup is working fine. If you need less resources, a quick binary search would help. 64 | 65 | - CPUs: 3 66 | - Memory: 4.0 GiB 67 | - Swap: 3.5 giB 68 | 69 | -------------------------------------------------------------------------------- /docker/manual-gc/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:19.04 2 | 3 | RUN apt-get update 4 | RUN apt-get install -y curl gnupg2 5 | RUN apt-get install -y git 6 | RUN apt-get install -y make 7 | RUN apt-get install -y cmake 8 | RUN apt-get install -y clang 9 | RUN apt-get install -y llvm 10 | RUN apt-get install -y lld 11 | RUN apt-get install -y lldb 12 | RUN apt-get install -y rsync 13 | # RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - 14 | # RUN apt-get update 15 | RUN apt-get install -y nodejs 16 | 17 | WORKDIR / 18 | RUN git clone --recursive https://github.com/webassembly/wabt 19 | RUN git clone https://github.com/SanderSpies/ocaml 20 | RUN git clone https://github.com/CraneStation/wasi-sysroot 21 | RUN git clone --recurse-submodules https://github.com/CraneStation/wasmtime.git 22 | RUN curl -L https://github.com/CraneStation/wasi-sdk/releases/download/wasi-sdk-5/libclang_rt.builtins-wasm32-wasi-5.0.tar.gz > libclang_rt.builtins-wasm32-wasi-5.0.tar.gz 23 | RUN tar -xvzf libclang_rt.builtins-wasm32-wasi-5.0.tar.gz 24 | RUN mkdir /usr/lib/llvm-8/lib/clang/8.0.0/lib/wasi 25 | RUN cp ./lib/wasi/libclang_rt.builtins-wasm32.a /usr/lib/llvm-8/lib/clang/8.0.0/lib/wasi/ 26 | RUN curl https://sh.rustup.rs -sSf > rustup 27 | RUN sh rustup -y 28 | 29 | ENV PATH="/usr/lib/llvm-8/bin/:${PATH}" 30 | 31 | WORKDIR /wasmtime 32 | COPY ./wasmfile.patch /wasmtime 33 | RUN patch wasmtime-debug/src/transform.rs -i wasmfile.patch 34 | RUN $HOME/.cargo/bin/cargo build --release 35 | 36 | WORKDIR /wabt 37 | RUN make 38 | 39 | WORKDIR /wasi-sysroot 40 | RUN make install INSTALL_DIR=/workspace/wasi 41 | 42 | WORKDIR /ocaml 43 | RUN git checkout manual_gc 44 | 45 | ENV LLVM_HOME /usr/lib/llvm-8 46 | 47 | WORKDIR /workspace/ocaml 48 | 49 | # RUN clang --target=wasm32-unknown-wasi --sysroot /wasi-sysroot/sysroot -Os -s -o example.wasm test.c -------------------------------------------------------------------------------- /docker/manual-gc/wasmfile.patch: -------------------------------------------------------------------------------- 1 | diff --git wasmtime-debug/src/transform.rs wasmtime-debug/src/transform.rs 2 | index 114dac3..a527217 100644 3 | --- wasmtime-debug/src/transform.rs 4 | +++ wasmtime-debug/src/transform.rs 5 | @@ -568,8 +568,9 @@ where 6 | } 7 | for (die_id, attr_name, offset) in pending_die_refs { 8 | let die = comp_unit.get_mut(die_id); 9 | - let unit_id = die_ref_map[&offset]; 10 | - die.set(attr_name, write::AttributeValue::ThisUnitEntryRef(unit_id)); 11 | + if let Some(unit_id) = die_ref_map.get(&offset) { 12 | + die.set(attr_name, write::AttributeValue::ThisUnitEntryRef(*unit_id)); 13 | + } 14 | } 15 | Ok(()) 16 | } 17 | -------------------------------------------------------------------------------- /docker/spidermonkey/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | RUN apt-get update 4 | RUN apt-get install -y wget 5 | RUN apt-get install -y python 6 | RUN apt-get install -y python3.6 7 | RUN apt-get install -y make 8 | RUN apt-get install -y autoconf2.13 9 | RUN apt-get install -y gcc 10 | RUN apt-get install -y g++ 11 | RUN apt-get install -y clang 12 | RUN apt-get install -y ocaml 13 | 14 | WORKDIR /sm-root 15 | RUN wget https://hg.mozilla.org/mozilla-central/archive/tip.tar.gz 16 | RUN mkdir sm 17 | RUN tar -xf tip.tar.gz --strip-components=1 -C sm 18 | 19 | WORKDIR /sm-root/sm 20 | RUN SHELL=$SHELL ./mach bootstrap --application-choice browser_artifact_mode --no-interactive || exit 0 21 | # exit 0 because Installing Stylo and NodeJS packages requires a checkout of mozilla-central. 22 | # Once you have such a checkout, please re-run `./mach bootstrap` from the 23 | # checkout directory. and we dont need them 24 | 25 | WORKDIR /sm-root/sm/js/src 26 | RUN autoconf2.13 27 | RUN mkdir build_OPT.OBJ 28 | 29 | WORKDIR /sm-root/sm/js/src/build_OPT.OBJ 30 | RUN SHELL=$SHELL ../configure 31 | RUN SHELL=$SHELL make 32 | RUN make install 33 | 34 | WORKDIR /sm-root 35 | RUN mkdir sm-wabt-wrapper 36 | WORKDIR /sm-root/sm-wabt-wrapper 37 | COPY ${PWD}/sm-wabt-wrapper/sm.ml /sm-root/sm-wabt-wrapper/sm.ml 38 | RUN ocamlopt -o /sm-root/sm-wabt-wrapper/sm-wabt-wrapper unix.cmxa sm.ml 39 | ENV PATH /sm-root/sm-wabt-wrapper:$PATH 40 | ENV SM_PATH /sm-root/sm/js/src/build_OPT.OBJ/js/src/js 41 | 42 | WORKDIR /sm-root 43 | -------------------------------------------------------------------------------- /docker/wasm-gc/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | RUN apt-get update 4 | RUN apt-get install -y curl gnupg2 5 | RUN apt-get install -y git 6 | RUN apt-get install -y make 7 | RUN apt-get install -y cmake 8 | RUN apt-get install -y clang 9 | RUN apt-get install -y rsync 10 | RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - 11 | RUN apt-get update 12 | RUN apt-get install -y nodejs 13 | 14 | WORKDIR /llvmwasm 15 | RUN git clone https://github.com/sanderspies/llvm 16 | 17 | WORKDIR /llvmwasm/llvm 18 | RUN git checkout reference-types 19 | 20 | WORKDIR /llvmwasm/llvm/tools 21 | RUN git clone https://github.com/sanderspies/lld 22 | 23 | WORKDIR /llvmwasm/llvm/tools/lld 24 | RUN git checkout reference-types 25 | 26 | WORKDIR /llvmwasm/llvm-build 27 | 28 | RUN cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALLDIR -DLLVM_TARGETS_TO_BUILD=WebAssembly -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_PIC=OFF -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly /llvmwasm/llvm 29 | RUN make lld 30 | RUN make llc 31 | RUN make -j 4 32 | 33 | WORKDIR / 34 | RUN git clone --recursive https://github.com/sanderspies/wabt 35 | RUN ls -l 36 | RUN git clone https://github.com/SanderSpies/ocaml 37 | 38 | WORKDIR /wabt 39 | RUN make 40 | 41 | WORKDIR /ocaml 42 | ENV LLVM_HOME /llvmwasm/llvm-build 43 | 44 | WORKDIR /workspace/ocaml -------------------------------------------------------------------------------- /sm-wabt-wrapper/sm.ml: -------------------------------------------------------------------------------- 1 | exception Program_exit of string 2 | 3 | module Path = struct let (/) = Filename.concat end 4 | 5 | let main output_file input_file = 6 | let js = Printf.sprintf {js|os.file.writeTypedArrayToFile("%s",new Uint8Array(wasmTextToBinary(os.file.readFile("%s"))));|js} output_file input_file in 7 | let sm_path = match(Sys.getenv_opt "SM_PATH") with 8 | | Some p -> p 9 | | None -> Path.(".." / "spidermonkey" / "js" / "src" / "build_OPT.OBJ" / "js" / "src" / "js") in 10 | let _ = Unix.execv sm_path [| sm_path; "-e"; js |] in 11 | () 12 | 13 | let () = 14 | if (Array.length Sys.argv) < 3 then 15 | raise (Program_exit "In sufficient args\n") 16 | else 17 | main Sys.argv.(1) Sys.argv.(2) 18 | --------------------------------------------------------------------------------