MMTk-V8
This repository provides the V8 binding for MMTk.
Contents
Requirements
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
.
Before you continue
If you use the set-up explained in mmtk-dev-env, make sure to set the default Rust toolchain to the one specified in mmtk-dev-env, e.g. by running:
$ # replace nightly-YYYY-MM-DD with the the toolchain specified in mmtk-dev-env
$ export RUSTUP_TOOLCHAIN=nightly-YYYY-MM-DD
Getting Sources (for MMTk and VM)
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
MMTk
$ cd $MMTK_V8_ROOT
$ git clone git@github.com:mmtk/mmtk-v8.git
V8
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
Build
First build MMTk, then V8
Building MMTk
$ cd $MMTK_V8_ROOT/mmtk-v8/mmtk
$ cargo build --features nogc
Building V8
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.
First Ensure you can Build Release 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.
Next Ensure you can Build a Debug 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
Then Build with MMTk
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
Test
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.
Limitations
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.