• Leszek Swirski's avatar
    [serializer] Allocate during deserialization · 5d7a29c9
    Leszek Swirski authored
    This patch removes the concept of reservations and a specialized
    deserializer allocator, and instead makes the deserializer allocate
    directly with the Heap's Allocate method.
    
    The major consequence of this is that the GC can now run during
    deserialization, which means that:
    
      a) Deserialized objects are visible to the GC, and
      b) Objects that the deserializer/deserialized objects point to can
         move.
    
    Point a) is mostly not a problem due to previous work in making
    deserialized objects "GC valid", i.e. making sure that they have a valid
    size before any subsequent allocation/safepoint. We now additionally
    have to initialize the allocated space with a valid tagged value -- this
    is a magic Smi value to keep "uninitialized" checks simple.
    
    Point b) is solved by Handlifying the deserializer. This involves
    changing any vectors of objects into vectors of Handles, and any object
    keyed map into an IdentityMap (we can't use Handles as keys because
    the object's address is no longer a stable hash).
    
    Back-references can no longer be direct chunk offsets, so instead the
    deserializer stores a Handle to each deserialized object, and the
    backreference is an index into this handle array. This encoding could
    be optimized in the future with e.g. a second pass over the serialized
    array which emits a different bytecode for objects that are and aren't
    back-referenced.
    
    Additionally, the slot-walk over objects to initialize them can no
    longer use absolute slot offsets, as again an object may move and its
    slot address would become invalid. Now, slots are walked as relative
    offsets to a Handle to the object, or as absolute slots for the case of
    root pointers. A concept of "slot accessor" is introduced to share the
    code between these two modes, and writing the slot (including write
    barriers) is abstracted into this accessor.
    
    Finally, the Code body walk is modified to deserialize all objects
    referred to by RelocInfos before doing the RelocInfo walk itself. This
    is because RelocInfoIterator uses raw pointers, so we cannot allocate
    during a RelocInfo walk.
    
    As a drive-by, the VariableRawData bytecode is tweaked to use tagged
    size rather than byte size -- the size is expected to be tagged-aligned
    anyway, so now we get an extra few bits in the size encoding.
    
    Bug: chromium:1075999
    Change-Id: I672c42f553f2669888cc5e35d692c1b8ece1845e
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2404451
    Commit-Queue: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#70229}
    5d7a29c9
Name
Last commit
Last update
..
blink_tests Loading commit data...
cfi Loading commit data...
clusterfuzz Loading commit data...
cppgc Loading commit data...
debug_helper Loading commit data...
dev Loading commit data...
gcmole Loading commit data...
generate_shim_headers Loading commit data...
heap-stats Loading commit data...
ignition Loading commit data...
jsfunfuzz Loading commit data...
link_clicker.extension Loading commit data...
mb Loading commit data...
memory Loading commit data...
msan Loading commit data...
ninja Loading commit data...
node Loading commit data...
perf Loading commit data...
profview Loading commit data...
release Loading commit data...
sanitizers Loading commit data...
snapshot Loading commit data...
system-analyzer Loading commit data...
testrunner Loading commit data...
toolchain Loading commit data...
torque Loading commit data...
tracing/proto-converter Loading commit data...
turbolizer Loading commit data...
ubsan Loading commit data...
unittests Loading commit data...
v8.xcodeproj Loading commit data...
v8windbg Loading commit data...
valgrind/asan Loading commit data...
vim Loading commit data...
visual_studio Loading commit data...
wasm Loading commit data...
wasm-compilation-hints Loading commit data...
zone-stats Loading commit data...
BUILD.gn Loading commit data...
DEPS Loading commit data...
Makefile.tags Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
SourceMap.js Loading commit data...
__init__.py Loading commit data...
adb-d8.py Loading commit data...
android-build.sh Loading commit data...
android-ll-prof.sh Loading commit data...
android-run.py Loading commit data...
android-sync.sh Loading commit data...
arguments.js Loading commit data...
arguments.mjs Loading commit data...
avg.py Loading commit data...
bash-completion.sh Loading commit data...
bigint-tester.py Loading commit data...
callstats-from-telemetry.sh Loading commit data...
callstats.html Loading commit data...
callstats.py Loading commit data...
callstats.py.vpython Loading commit data...
callstats_groups.py Loading commit data...
check-inline-includes.sh Loading commit data...
check-static-initializers.sh Loading commit data...
check-unused-bailouts.sh Loading commit data...
check-unused-symbols.sh Loading commit data...
codemap.js Loading commit data...
codemap.mjs Loading commit data...
collect_deprecation_stats.sh Loading commit data...
compare-table-gen.js Loading commit data...
compare_torque_output.py Loading commit data...
consarray.js Loading commit data...
consarray.mjs Loading commit data...
cpu.sh Loading commit data...
cross_build_gcc.sh Loading commit data...
csvparser.js Loading commit data...
csvparser.mjs Loading commit data...
deprecation_stats.py Loading commit data...
detect-builtins.js Loading commit data...
disasm.py Loading commit data...
draw_instruction_graph.sh Loading commit data...
dump-cpp.py Loading commit data...
dumpcpp-driver.mjs Loading commit data...
dumpcpp.mjs Loading commit data...
eval_gc_nvp.py Loading commit data...
eval_gc_time.sh Loading commit data...
find-commit-for-patch.py Loading commit data...
find_depot_tools.py Loading commit data...
freebsd-tick-processor Loading commit data...
fuzz-harness.sh Loading commit data...
gc-nvp-to-csv.py Loading commit data...
gc-nvp-trace-processor.py Loading commit data...
gc_nvp_common.py Loading commit data...
gdb-v8-support.py Loading commit data...
gdbinit Loading commit data...
gen-inlining-tests.py Loading commit data...
gen-keywords-gen-h.py Loading commit data...
gen-postmortem-metadata.py Loading commit data...
generate-builtins-tests.py Loading commit data...
generate-header-include-checks.py Loading commit data...
generate-runtime-call-stats.py Loading commit data...
generate-ten-powers.scm Loading commit data...
get_landmines.py Loading commit data...
grokdump.py Loading commit data...
ic-explorer.html Loading commit data...
ic-processor Loading commit data...
ic-processor-driver.mjs Loading commit data...
ic-processor.mjs Loading commit data...
index.html Loading commit data...
inspect-d8.js Loading commit data...
linux-tick-processor Loading commit data...
ll_prof.py Loading commit data...
lldb_commands.py Loading commit data...
locs.py Loading commit data...
logreader.js Loading commit data...
logreader.mjs Loading commit data...
mac-nm Loading commit data...
mac-tick-processor Loading commit data...
map-processor Loading commit data...
map-processor-driver.mjs Loading commit data...
map-processor.html Loading commit data...
map-processor.mjs Loading commit data...
objdump-v8 Loading commit data...
parse-processor Loading commit data...
parse-processor-driver.mjs Loading commit data...
parse-processor.html Loading commit data...
parse-processor.mjs Loading commit data...
perf-compare.py Loading commit data...
predictable_wrapper.py Loading commit data...
profile.js Loading commit data...
profile.mjs Loading commit data...
profile_view.js Loading commit data...
profile_view.mjs Loading commit data...
regexp-sequences.py Loading commit data...
run-clang-tidy.py Loading commit data...
run-llprof.sh Loading commit data...
run-num-fuzzer.py Loading commit data...
run-perf.sh Loading commit data...
run-tests.py Loading commit data...
run-wasm-api-tests.py Loading commit data...
run.py Loading commit data...
run_perf.py Loading commit data...
shell-utils.h Loading commit data...
sourcemap.mjs Loading commit data...
splaytree.js Loading commit data...
splaytree.mjs Loading commit data...
stats-viewer.py Loading commit data...
test262-results-parser.js Loading commit data...
tick-processor.html Loading commit data...
tickprocessor-driver.js Loading commit data...
tickprocessor-driver.mjs Loading commit data...
tickprocessor.js Loading commit data...
tickprocessor.mjs Loading commit data...
try_perf.py Loading commit data...
turbolizer-perf.py Loading commit data...
update-object-macros-undef.py Loading commit data...
v8_presubmit.py Loading commit data...
v8heapconst.py Loading commit data...
whitespace.txt Loading commit data...
windbg.js Loading commit data...
windows-tick-processor.bat Loading commit data...