This repository provides the V8 binding for MMTk.
We maintain an up to date list of the prerequisite for building MMTk and its bindings in the mmtk-dev-env repository. Please make sure your dev machine satisfies those prerequisites.
MMTk/V8 currently only supports linux-x86_64
.
The minimal supported Rust version for MMTk-V8 binding is 1.57.0. Make sure your Rust version is higher than this. We test MMTk-V8
binding with Rust 1.59.0 (as specified in rust-toolchain
).
First, set environment variables to refer to the root directories for MMTk and V8 respectively (change these to match your preferred locations):
$ export MMTK_V8_ROOT=$HOME/mmtk_v8_root
$ cd $MMTK_V8_ROOT
$ git clone git@github.com:mmtk/mmtk-v8.git
The following is based on the V8 documentation. Please refer to the original documentation if you run into difficulties getting V8.
First, fetch and then update depot_tools, which contains the key build dependencies for V8.
$ cd $MMTK_V8_ROOT
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=`pwd`/depot_tools:$PATH
$ gclient
You will need depot_tools in your path when you build V8, so you may wish to update your shell profile (e.g. .bash_profile
) accordingly.
You should now be able to fetch the V8 sources:
$ fetch v8
The fetch command will get the V8 sources and create a build directory for you. It intentionally puts your V8 repo in a detached head state.
Tip: if you decide to maintain your own fork of V8, be mindful that the fetch command is a necessary step in setting up a new repo; it is not sufficient to simply clone the source.
To update your V8 sources, use:
$ fetch v8
Occasionally V8 won't build after a fetch because dependencies have changed. This is fixed by synching:
$ gclient sync
First build MMTk, then V8
$ cd $MMTK_V8_ROOT/mmtk-v8/mmtk
$ cargo build --features nogc
We provide instructions here for building V8 with its gm workflow.
First you may wish to create an alias to the gm script, which lives in the tools/dev
directory of the V8 source tree.
$ alias gm=$MMTK_V8_ROOT/v8/tools/dev/gm.py
You may wish to add the above alias to your shell profile.
Now you can build V8.
Before trying to build V8 with MMTk, ensure you can build V8 without MMTk:
$ cd $MMTK_V8_ROOT/v8
$ gm x64.release
The above builds a standard release build of v8.
You need to create a config file, which we'll call x64.debug
.
Use gn
, which will open an editor:
$ gn args out/x64.debug
Enter the following values:
is_component_build = true
is_debug = true
symbol_level = 2
target_cpu = "x64"
use_goma = false
v8_enable_backtrace = true
v8_enable_fast_mksnapshot = true
v8_enable_verify_csa = true
v8_enable_slow_dchecks = false
v8_optimized_debug = false
Create a gn config for building v8 with mmtk, which we'll call x64.debug-mmtk
.
Use gn
, which will open an editor:
$ cd $MMTK_V8_ROOT/v8
$ gn args out/x64.debug-mmtk
Enter the following values:
is_component_build = true
is_debug = true
symbol_level = 2
target_cpu = "x64"
use_goma = false
v8_enable_backtrace = true
v8_enable_fast_mksnapshot = true
v8_enable_verify_csa = true
v8_enable_slow_dchecks = false
v8_optimized_debug = false
v8_disable_write_barriers = true
v8_enable_single_generation = true
v8_enable_shared_ro_heap = false
v8_enable_pointer_compression = false
v8_enable_third_party_heap = true
v8_third_party_heap_files = [ "../mmtk-v8/v8/third_party/heap/mmtk/mmtk.cc",
"../mmtk-v8/v8/third_party/heap/mmtk/mmtk.h",
"../mmtk-v8/v8/third_party/heap/mmtk/mmtkUpcalls.h",
"../mmtk-v8/v8/third_party/heap/mmtk/mmtkUpcalls.cc"]
v8_third_party_heap_libs = [ "../mmtk-v8/mmtk/target/debug/libmmtk_v8.so" ]
Then build:
$ gm x64.debug-mmtk
The V8 document on testing discusses various options for running V8 tests.
For instance, benchmarks
tests can be run on "V8 with MMTk" as:
$ gm x64.debug-mmtk benchmarks/*
# autoninja -C out/x64.debug-mmtk d8
ninja: Entering directory `out/x64.debug-mmtk'
ninja: no work to do.
# "/usr/bin/python2" tools/run-tests.py --outdir=out/x64.debug-mmtk benchmarks/*
Build found: /home/javad/sources/v8/v8/v8/out/x64.debug-mmtk
>>> Autodetected:
verify_csa
>>> Running tests for x64.debug
>>> Running with test processors
[02:20|% 96|+ 53|- 0]: Done
>>> 55 base tests produced 53 (96%) non-filtered tests
>>> 53 tests ran
Done! - V8 compilation finished successfully.
There are a few reasons why MMTk-V8 can not pass all V8 tests, including regression and unit tests:
- MMTk-V8 does not support garbage collection yet.
- MMTk does not support multiple heap instances yet.
- Many of the V8 tests are unit tests targeting specific V8 features, and are not applicable to MMTk.