5f6aa2e5bf
With conservative stack scanning enabled, a snapshot of the call stack upon entry to GC will be used to determine part of the root-set. When the collector walks the stack, it looks at each value and determines whether it could be a potential on-heap object pointer. However, unlike with Handles, these on-stack pointers aren't guaranteed to point to the start of the object: the compiler may decide hide these pointers, and create interior pointers in C++ frames which the GC doesn't know about. The solution to this is to include an object start bitmap in the header of each page. Each bit in the bitmap represents a word in the page payload which is set when an object is allocated. This means that when the collector finds an arbitrary potential pointer into the page, it can walk backwards through the bitmap until it finds the relevant object's base pointer. To prevent the bitmap becoming stale after compaction, it is rebuilt during object sweeping. This is experimental, and currently only works with inline allocation disabled, and single generational collection. Bug: v8:10614 Change-Id: I28ebd9562f58f335f8b3c2d1189cdf39feaa1f52 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2375195 Commit-Queue: Anton Bikineev <bikineev@chromium.org> Reviewed-by: Michael Achenbach <machenbach@chromium.org> Reviewed-by: Dominik Inführ <dinfuehr@chromium.org> Reviewed-by: Anton Bikineev <bikineev@chromium.org> Cr-Commit-Position: refs/heads/master@{#69615}
420 lines
14 KiB
Plaintext
420 lines
14 KiB
Plaintext
# Copyright 2016 The V8 project authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import("../../gni/v8.gni")
|
|
|
|
if (is_fuchsia) {
|
|
import("//build/config/fuchsia/rules.gni")
|
|
|
|
cr_fuchsia_package("v8_unittests_pkg") {
|
|
testonly = true
|
|
binary = ":unittests"
|
|
package_name_override = "v8_unittests"
|
|
}
|
|
|
|
fuchsia_package_runner("v8_unittests_fuchsia") {
|
|
testonly = true
|
|
package = ":v8_unittests_pkg"
|
|
package_name_override = "v8_unittests"
|
|
}
|
|
}
|
|
|
|
# Stand-alone target for C++ GC unittests. This is used to ensure that it
|
|
# builds without V8 as well. They are also included in the regular unittests
|
|
# target for simplicity.
|
|
v8_executable("cppgc_unittests") {
|
|
testonly = true
|
|
|
|
configs = [
|
|
"../..:external_config",
|
|
"../..:internal_config_base",
|
|
]
|
|
|
|
sources = [ "heap/cppgc/run-all-unittests.cc" ]
|
|
|
|
deps = [
|
|
":cppgc_unittests_sources",
|
|
"../..:cppgc_for_testing",
|
|
"//testing/gmock",
|
|
"//testing/gtest",
|
|
]
|
|
}
|
|
|
|
v8_source_set("cppgc_unittests_sources") {
|
|
testonly = true
|
|
|
|
sources = [
|
|
"heap/cppgc/concurrent-sweeper-unittest.cc",
|
|
"heap/cppgc/custom-spaces-unittest.cc",
|
|
"heap/cppgc/finalizer-trait-unittest.cc",
|
|
"heap/cppgc/free-list-unittest.cc",
|
|
"heap/cppgc/garbage-collected-unittest.cc",
|
|
"heap/cppgc/gc-info-unittest.cc",
|
|
"heap/cppgc/gc-invoker-unittest.cc",
|
|
"heap/cppgc/heap-growing-unittest.cc",
|
|
"heap/cppgc/heap-object-header-unittest.cc",
|
|
"heap/cppgc/heap-page-unittest.cc",
|
|
"heap/cppgc/heap-unittest.cc",
|
|
"heap/cppgc/incremental-marking-schedule-unittest.cc",
|
|
"heap/cppgc/logging-unittest.cc",
|
|
"heap/cppgc/marker-unittest.cc",
|
|
"heap/cppgc/marking-verifier-unittest.cc",
|
|
"heap/cppgc/marking-visitor-unittest.cc",
|
|
"heap/cppgc/member-unittest.cc",
|
|
"heap/cppgc/minor-gc-unittest.cc",
|
|
"heap/cppgc/object-start-bitmap-unittest.cc",
|
|
"heap/cppgc/page-memory-unittest.cc",
|
|
"heap/cppgc/persistent-unittest.cc",
|
|
"heap/cppgc/prefinalizer-unittest.cc",
|
|
"heap/cppgc/source-location-unittest.cc",
|
|
"heap/cppgc/stack-unittest.cc",
|
|
"heap/cppgc/stats-collector-unittest.cc",
|
|
"heap/cppgc/sweeper-unittest.cc",
|
|
"heap/cppgc/test-platform.cc",
|
|
"heap/cppgc/test-platform.h",
|
|
"heap/cppgc/tests.cc",
|
|
"heap/cppgc/tests.h",
|
|
"heap/cppgc/visitor-unittest.cc",
|
|
"heap/cppgc/worklist-unittest.cc",
|
|
"heap/cppgc/write-barrier-unittest.cc",
|
|
]
|
|
|
|
configs = [
|
|
"../..:external_config",
|
|
"../..:internal_config_base",
|
|
"../..:cppgc_base_config",
|
|
]
|
|
|
|
deps = [
|
|
"//testing/gmock",
|
|
"//testing/gtest",
|
|
]
|
|
}
|
|
|
|
v8_executable("unittests") {
|
|
testonly = true
|
|
|
|
# TODO(machenbach): Translate from gyp.
|
|
#['OS=="aix"', {
|
|
# 'ldflags': [ '-Wl,-bbigtoc' ],
|
|
#}],
|
|
|
|
deps = [
|
|
":cppgc_unittests_sources",
|
|
":unittests_sources",
|
|
"../..:v8_for_testing",
|
|
"../..:v8_libbase",
|
|
"../..:v8_libplatform",
|
|
"//build/win:default_exe_manifest",
|
|
"//testing/gmock",
|
|
"//testing/gtest",
|
|
]
|
|
|
|
data_deps = [ "../../tools:v8_testrunner" ]
|
|
|
|
data = [
|
|
"testcfg.py",
|
|
"unittests.status",
|
|
]
|
|
|
|
configs = [
|
|
"../..:external_config",
|
|
"../..:internal_config_base",
|
|
]
|
|
}
|
|
|
|
v8_source_set("unittests_sources") {
|
|
testonly = true
|
|
|
|
sources = [
|
|
"../../test/common/assembler-tester.h",
|
|
"../../test/common/wasm/wasm-macro-gen.h",
|
|
"../../testing/gmock-support.h",
|
|
"../../testing/gtest-support.h",
|
|
"api/access-check-unittest.cc",
|
|
"api/exception-unittest.cc",
|
|
"api/interceptor-unittest.cc",
|
|
"api/isolate-unittest.cc",
|
|
"api/remote-object-unittest.cc",
|
|
"api/resource-constraints-unittest.cc",
|
|
"api/v8-object-unittest.cc",
|
|
"asmjs/asm-scanner-unittest.cc",
|
|
"asmjs/asm-types-unittest.cc",
|
|
"base/address-region-unittest.cc",
|
|
"base/atomic-utils-unittest.cc",
|
|
"base/bits-unittest.cc",
|
|
"base/cpu-unittest.cc",
|
|
"base/division-by-constant-unittest.cc",
|
|
"base/flags-unittest.cc",
|
|
"base/functional-unittest.cc",
|
|
"base/ieee754-unittest.cc",
|
|
"base/iterator-unittest.cc",
|
|
"base/logging-unittest.cc",
|
|
"base/macros-unittest.cc",
|
|
"base/ostreams-unittest.cc",
|
|
"base/platform/condition-variable-unittest.cc",
|
|
"base/platform/mutex-unittest.cc",
|
|
"base/platform/platform-unittest.cc",
|
|
"base/platform/semaphore-unittest.cc",
|
|
"base/platform/time-unittest.cc",
|
|
"base/region-allocator-unittest.cc",
|
|
"base/sys-info-unittest.cc",
|
|
"base/template-utils-unittest.cc",
|
|
"base/threaded-list-unittest.cc",
|
|
"base/utils/random-number-generator-unittest.cc",
|
|
"base/vlq-base64-unittest.cc",
|
|
"codegen/code-stub-assembler-unittest.cc",
|
|
"codegen/code-stub-assembler-unittest.h",
|
|
"codegen/register-configuration-unittest.cc",
|
|
"codegen/source-position-table-unittest.cc",
|
|
"compiler-dispatcher/compiler-dispatcher-unittest.cc",
|
|
"compiler-dispatcher/optimizing-compile-dispatcher-unittest.cc",
|
|
"compiler/backend/instruction-selector-unittest.cc",
|
|
"compiler/backend/instruction-selector-unittest.h",
|
|
"compiler/backend/instruction-sequence-unittest.cc",
|
|
"compiler/backend/instruction-sequence-unittest.h",
|
|
"compiler/backend/instruction-unittest.cc",
|
|
"compiler/branch-elimination-unittest.cc",
|
|
"compiler/bytecode-analysis-unittest.cc",
|
|
"compiler/checkpoint-elimination-unittest.cc",
|
|
"compiler/common-operator-reducer-unittest.cc",
|
|
"compiler/common-operator-unittest.cc",
|
|
"compiler/compiler-test-utils.h",
|
|
"compiler/constant-folding-reducer-unittest.cc",
|
|
"compiler/control-equivalence-unittest.cc",
|
|
"compiler/control-flow-optimizer-unittest.cc",
|
|
"compiler/dead-code-elimination-unittest.cc",
|
|
"compiler/decompression-optimizer-unittest.cc",
|
|
"compiler/diamond-unittest.cc",
|
|
"compiler/effect-control-linearizer-unittest.cc",
|
|
"compiler/graph-reducer-unittest.cc",
|
|
"compiler/graph-reducer-unittest.h",
|
|
"compiler/graph-trimmer-unittest.cc",
|
|
"compiler/graph-unittest.cc",
|
|
"compiler/graph-unittest.h",
|
|
"compiler/int64-lowering-unittest.cc",
|
|
"compiler/js-call-reducer-unittest.cc",
|
|
"compiler/js-create-lowering-unittest.cc",
|
|
"compiler/js-intrinsic-lowering-unittest.cc",
|
|
"compiler/js-native-context-specialization-unittest.cc",
|
|
"compiler/js-operator-unittest.cc",
|
|
"compiler/js-typed-lowering-unittest.cc",
|
|
"compiler/linkage-tail-call-unittest.cc",
|
|
"compiler/load-elimination-unittest.cc",
|
|
"compiler/loop-peeling-unittest.cc",
|
|
"compiler/machine-operator-reducer-unittest.cc",
|
|
"compiler/machine-operator-unittest.cc",
|
|
"compiler/node-cache-unittest.cc",
|
|
"compiler/node-matchers-unittest.cc",
|
|
"compiler/node-properties-unittest.cc",
|
|
"compiler/node-test-utils.cc",
|
|
"compiler/node-test-utils.h",
|
|
"compiler/node-unittest.cc",
|
|
"compiler/opcodes-unittest.cc",
|
|
"compiler/persistent-unittest.cc",
|
|
"compiler/redundancy-elimination-unittest.cc",
|
|
"compiler/regalloc/live-range-unittest.cc",
|
|
"compiler/regalloc/mid-tier-register-allocator-unittest.cc",
|
|
"compiler/regalloc/move-optimizer-unittest.cc",
|
|
"compiler/regalloc/register-allocator-unittest.cc",
|
|
"compiler/schedule-unittest.cc",
|
|
"compiler/scheduler-rpo-unittest.cc",
|
|
"compiler/scheduler-unittest.cc",
|
|
"compiler/simplified-lowering-unittest.cc",
|
|
"compiler/simplified-operator-reducer-unittest.cc",
|
|
"compiler/simplified-operator-unittest.cc",
|
|
"compiler/state-values-utils-unittest.cc",
|
|
"compiler/typed-optimization-unittest.cc",
|
|
"compiler/typer-unittest.cc",
|
|
"compiler/value-numbering-reducer-unittest.cc",
|
|
"compiler/zone-stats-unittest.cc",
|
|
"date/date-cache-unittest.cc",
|
|
"diagnostics/eh-frame-iterator-unittest.cc",
|
|
"diagnostics/eh-frame-writer-unittest.cc",
|
|
"execution/microtask-queue-unittest.cc",
|
|
"heap/allocation-observer-unittest.cc",
|
|
"heap/barrier-unittest.cc",
|
|
"heap/bitmap-test-utils.h",
|
|
"heap/bitmap-unittest.cc",
|
|
"heap/code-object-registry-unittest.cc",
|
|
"heap/embedder-tracing-unittest.cc",
|
|
"heap/gc-idle-time-handler-unittest.cc",
|
|
"heap/gc-tracer-unittest.cc",
|
|
"heap/heap-controller-unittest.cc",
|
|
"heap/heap-unittest.cc",
|
|
"heap/heap-utils.h",
|
|
"heap/item-parallel-job-unittest.cc",
|
|
"heap/js-member-unittest.cc",
|
|
"heap/list-unittest.cc",
|
|
"heap/local-factory-unittest.cc",
|
|
"heap/local-heap-unittest.cc",
|
|
"heap/marking-unittest.cc",
|
|
"heap/marking-worklist-unittest.cc",
|
|
"heap/memory-reducer-unittest.cc",
|
|
"heap/object-stats-unittest.cc",
|
|
"heap/persistent-handles-unittest.cc",
|
|
"heap/safepoint-unittest.cc",
|
|
"heap/slot-set-unittest.cc",
|
|
"heap/spaces-unittest.cc",
|
|
"heap/unified-heap-unittest.cc",
|
|
"heap/unmapper-unittest.cc",
|
|
"heap/worklist-unittest.cc",
|
|
"interpreter/bytecode-array-builder-unittest.cc",
|
|
"interpreter/bytecode-array-iterator-unittest.cc",
|
|
"interpreter/bytecode-array-random-iterator-unittest.cc",
|
|
"interpreter/bytecode-array-writer-unittest.cc",
|
|
"interpreter/bytecode-decoder-unittest.cc",
|
|
"interpreter/bytecode-node-unittest.cc",
|
|
"interpreter/bytecode-operands-unittest.cc",
|
|
"interpreter/bytecode-register-allocator-unittest.cc",
|
|
"interpreter/bytecode-register-optimizer-unittest.cc",
|
|
"interpreter/bytecode-source-info-unittest.cc",
|
|
"interpreter/bytecode-utils.h",
|
|
"interpreter/bytecodes-unittest.cc",
|
|
"interpreter/constant-array-builder-unittest.cc",
|
|
"interpreter/interpreter-assembler-unittest.cc",
|
|
"interpreter/interpreter-assembler-unittest.h",
|
|
"libplatform/default-job-unittest.cc",
|
|
"libplatform/default-platform-unittest.cc",
|
|
"libplatform/default-worker-threads-task-runner-unittest.cc",
|
|
"libplatform/task-queue-unittest.cc",
|
|
"libplatform/worker-thread-unittest.cc",
|
|
"logging/counters-unittest.cc",
|
|
"numbers/bigint-unittest.cc",
|
|
"numbers/conversions-unittest.cc",
|
|
"objects/backing-store-unittest.cc",
|
|
"objects/object-unittest.cc",
|
|
"objects/osr-optimized-code-cache-unittest.cc",
|
|
"objects/value-serializer-unittest.cc",
|
|
"objects/weakarraylist-unittest.cc",
|
|
"parser/ast-value-unittest.cc",
|
|
"parser/preparser-unittest.cc",
|
|
"profiler/strings-storage-unittest.cc",
|
|
"regress/regress-crbug-1041240-unittest.cc",
|
|
"regress/regress-crbug-1056054-unittest.cc",
|
|
"regress/regress-crbug-938251-unittest.cc",
|
|
"run-all-unittests.cc",
|
|
"strings/char-predicates-unittest.cc",
|
|
"strings/unicode-unittest.cc",
|
|
"tasks/background-compile-task-unittest.cc",
|
|
"tasks/cancelable-tasks-unittest.cc",
|
|
"test-helpers.cc",
|
|
"test-helpers.h",
|
|
"test-utils.cc",
|
|
"test-utils.h",
|
|
"torque/earley-parser-unittest.cc",
|
|
"torque/ls-json-unittest.cc",
|
|
"torque/ls-message-unittest.cc",
|
|
"torque/ls-server-data-unittest.cc",
|
|
"torque/torque-unittest.cc",
|
|
"torque/torque-utils-unittest.cc",
|
|
"utils/allocation-unittest.cc",
|
|
"utils/detachable-vector-unittest.cc",
|
|
"utils/locked-queue-unittest.cc",
|
|
"utils/utils-unittest.cc",
|
|
"utils/vector-unittest.cc",
|
|
"wasm/control-transfer-unittest.cc",
|
|
"wasm/decoder-unittest.cc",
|
|
"wasm/function-body-decoder-unittest.cc",
|
|
"wasm/leb-helper-unittest.cc",
|
|
"wasm/loop-assignment-analysis-unittest.cc",
|
|
"wasm/module-decoder-unittest.cc",
|
|
"wasm/simd-shuffle-unittest.cc",
|
|
"wasm/streaming-decoder-unittest.cc",
|
|
"wasm/subtyping-unittest.cc",
|
|
"wasm/wasm-code-manager-unittest.cc",
|
|
"wasm/wasm-compiler-unittest.cc",
|
|
"wasm/wasm-macro-gen-unittest.cc",
|
|
"wasm/wasm-module-builder-unittest.cc",
|
|
"wasm/wasm-module-sourcemap-unittest.cc",
|
|
"zone/zone-allocator-unittest.cc",
|
|
"zone/zone-chunk-list-unittest.cc",
|
|
"zone/zone-unittest.cc",
|
|
]
|
|
|
|
if (v8_enable_wasm_gdb_remote_debugging) {
|
|
sources += [ "wasm/wasm-gdbserver-unittest.cc" ]
|
|
}
|
|
|
|
if (v8_enable_conservative_stack_scanning) {
|
|
sources += [ "heap/object-start-bitmap-unittest.cc" ]
|
|
}
|
|
|
|
if (v8_current_cpu == "arm") {
|
|
sources += [
|
|
"assembler/turbo-assembler-arm-unittest.cc",
|
|
"compiler/arm/instruction-selector-arm-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "arm64") {
|
|
sources += [
|
|
"assembler/turbo-assembler-arm64-unittest.cc",
|
|
"compiler/arm64/instruction-selector-arm64-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "x86") {
|
|
sources += [
|
|
"assembler/turbo-assembler-ia32-unittest.cc",
|
|
"compiler/ia32/instruction-selector-ia32-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "mips" || v8_current_cpu == "mipsel") {
|
|
sources += [
|
|
"assembler/turbo-assembler-mips-unittest.cc",
|
|
"compiler/mips/instruction-selector-mips-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "mips64" || v8_current_cpu == "mips64el") {
|
|
sources += [
|
|
"assembler/turbo-assembler-mips64-unittest.cc",
|
|
"compiler/mips64/instruction-selector-mips64-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "x64") {
|
|
sources += [
|
|
"assembler/turbo-assembler-x64-unittest.cc",
|
|
"compiler/x64/instruction-selector-x64-unittest.cc",
|
|
"wasm/trap-handler-x64-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "ppc" || v8_current_cpu == "ppc64") {
|
|
sources += [
|
|
"assembler/turbo-assembler-ppc-unittest.cc",
|
|
"compiler/ppc/instruction-selector-ppc-unittest.cc",
|
|
]
|
|
} else if (v8_current_cpu == "s390" || v8_current_cpu == "s390x") {
|
|
sources += [
|
|
"assembler/turbo-assembler-s390-unittest.cc",
|
|
"compiler/s390/instruction-selector-s390-unittest.cc",
|
|
]
|
|
}
|
|
|
|
if (is_posix) {
|
|
sources += [ "wasm/trap-handler-posix-unittest.cc" ]
|
|
}
|
|
|
|
if (is_win) {
|
|
sources += [ "wasm/trap-handler-win-unittest.cc" ]
|
|
}
|
|
|
|
configs = [
|
|
"../..:cppgc_base_config",
|
|
"../..:external_config",
|
|
"../..:internal_config_base",
|
|
]
|
|
|
|
deps = [
|
|
"..:common_test_headers",
|
|
"../..:v8_for_testing",
|
|
"../..:v8_libbase",
|
|
"../..:v8_libplatform",
|
|
"../..:wasm_test_common",
|
|
"../../third_party/inspector_protocol:crdtp_test",
|
|
"//build/win:default_exe_manifest",
|
|
"//testing/gmock",
|
|
"//testing/gtest",
|
|
]
|
|
|
|
if (is_win) {
|
|
# This warning is benignly triggered by the U16 and U32 macros in
|
|
# bytecode-utils.h.
|
|
# C4309: 'static_cast': truncation of constant value
|
|
cflags = [ "/wd4309" ]
|
|
}
|
|
}
|