[wasm][debug] Do not install debug code when tiered up

If the debugger is disabled for an isolate, we first remove all
breakpoints for that isolate, and then tier up the module (if there is
no other isolate that keeps it tiered down).
During the first step, functions might get recompiled since the
set breakpoints change. This is not needed in case we will tier-up the
module afterwards anyway. It also triggers a DCHECK if we reinstall
debugging code even though the module is already marked "tiered up".

This CL avoids the installation of debugging if the module is not tiered
down, and also slightly modified the condition for installing new code
when tiered-up (to allow overwriting debugging code with non-debugging
code even if it's the same tier).

R=thibaudm@chromium.org

Bug: chromium:1228628
Change-Id: I83828d4186e299f779a858006eafa3dbc7966c35
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3026707
Reviewed-by: Thibaud Michaud <thibaudm@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75722}
This commit is contained in:
Clemens Backes 2021-07-14 13:09:07 +02:00 committed by V8 LUCI CQ
parent a3b24ecc51
commit dc318df364

View File

@ -1216,8 +1216,10 @@ WasmCode* NativeModule::PublishCodeLocked(
(tiering_state_ == kTieredDown
// Tiered down: Install breakpoints over normal debug code.
? prior_code->for_debugging() <= code->for_debugging()
// Tiered up: Install if the tier is higher than before.
: prior_code->tier() < code->tier()));
// Tiered up: Install if the tier is higher than before or we
// replace debugging code with non-debugging code.
: (prior_code->tier() < code->tier() ||
(prior_code->for_debugging() && !code->for_debugging()))));
if (update_code_table) {
code_table_[slot_idx] = code;
if (prior_code) {
@ -1246,7 +1248,9 @@ void NativeModule::ReinstallDebugCode(WasmCode* code) {
DCHECK(!code->IsAnonymous());
DCHECK_LE(module_->num_imported_functions, code->index());
DCHECK_LT(code->index(), num_functions());
DCHECK_EQ(kTieredDown, tiering_state_);
// If the module is tiered up by now, do not reinstall debug code.
if (tiering_state_ != kTieredDown) return;
uint32_t slot_idx = declared_function_index(module(), code->index());
if (WasmCode* prior_code = code_table_[slot_idx]) {