[wasm][debug] Fix tier down during streaming compilation
If the debugger is enabled while streaming compilation is happening, we won't correctly tier down to Liftoff. This is because during streaming compilation, we always compile for no debugging. Fixing that is a bit tricky, since when the debugger is enabled, functions can either already have finished compiling, or they are currently being compiled, or their wire bytes are not received yet. Instead of handling this correctly while streaming compilation is running, we just recompile the whole module with Liftoff after streaming compilation finished. For testing this, we use the existing tests for async compilation, and enable --wasm-test-streaming, which compiles via the streaming decoder even in the async compilation case. R=thibaudm@chromium.org Bug: v8:10531 Change-Id: I0177248a9ad2e90f83faee965d6746de05423f1f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2207133 Reviewed-by: Thibaud Michaud <thibaudm@chromium.org> Commit-Queue: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#67882}
This commit is contained in:
parent
b10ad8b4e4
commit
3cc981cb7a
@ -802,6 +802,9 @@ class CompilationUnitBuilder {
|
|||||||
ExecutionTierPair tiers = GetRequestedExecutionTiers(
|
ExecutionTierPair tiers = GetRequestedExecutionTiers(
|
||||||
native_module_->module(), compilation_state()->compile_mode(),
|
native_module_->module(), compilation_state()->compile_mode(),
|
||||||
native_module_->enabled_features(), func_index);
|
native_module_->enabled_features(), func_index);
|
||||||
|
// Compile everything for non-debugging initially. If needed, we will tier
|
||||||
|
// down when the module is fully compiled. Synchronization would be pretty
|
||||||
|
// difficult otherwise.
|
||||||
baseline_units_.emplace_back(func_index, tiers.baseline_tier, kNoDebugging);
|
baseline_units_.emplace_back(func_index, tiers.baseline_tier, kNoDebugging);
|
||||||
if (tiers.baseline_tier != tiers.top_tier) {
|
if (tiers.baseline_tier != tiers.top_tier) {
|
||||||
tiering_units_.emplace_back(func_index, tiers.top_tier, kNoDebugging);
|
tiering_units_.emplace_back(func_index, tiers.top_tier, kNoDebugging);
|
||||||
@ -2406,6 +2409,13 @@ void AsyncStreamingProcessor::OnFinishedStream(OwnedVector<uint8_t> bytes) {
|
|||||||
}
|
}
|
||||||
const bool needs_finish = job_->DecrementAndCheckFinisherCount();
|
const bool needs_finish = job_->DecrementAndCheckFinisherCount();
|
||||||
DCHECK_IMPLIES(!has_code_section, needs_finish);
|
DCHECK_IMPLIES(!has_code_section, needs_finish);
|
||||||
|
// We might need to recompile the module for debugging, if the debugger was
|
||||||
|
// enabled while streaming compilation was running. Since handling this while
|
||||||
|
// compiling via streaming is tricky, we just tier down now, before publishing
|
||||||
|
// the module.
|
||||||
|
if (job_->native_module_->IsTieredDown()) {
|
||||||
|
job_->native_module_->TriggerRecompilation();
|
||||||
|
}
|
||||||
if (needs_finish) {
|
if (needs_finish) {
|
||||||
const bool failed = job_->native_module_->compilation_state()->failed();
|
const bool failed = job_->native_module_->compilation_state()->failed();
|
||||||
if (!cache_hit) {
|
if (!cache_hit) {
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
// Copyright 2020 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.
|
||||||
|
|
||||||
|
// Flags: --wasm-test-streaming
|
||||||
|
|
||||||
|
load('test/debugger/debug/wasm/debug-enabled-tier-down-wasm.js');
|
Loading…
Reference in New Issue
Block a user