[Liftoff] Correctly unuse Labels
On Liftoff bailout, instead of binding all unbound labels (to avoid triggering DCHECKS in their destructor), just Unuse them. R=mstarzinger@chromium.org Bug: chromium:924843 Change-Id: Icf581bca06eaa7369ab2bbd5d805112289d6a801 Reviewed-on: https://chromium-review.googlesource.com/c/1442645 Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#59172}
This commit is contained in:
parent
b1224b7091
commit
3af3c9d100
@ -174,7 +174,7 @@ class LiftoffCompiler {
|
|||||||
compilation_zone_(compilation_zone),
|
compilation_zone_(compilation_zone),
|
||||||
safepoint_table_builder_(compilation_zone_) {}
|
safepoint_table_builder_(compilation_zone_) {}
|
||||||
|
|
||||||
~LiftoffCompiler() { BindUnboundLabels(nullptr); }
|
~LiftoffCompiler() { UnuseLabels(nullptr); }
|
||||||
|
|
||||||
bool ok() const { return ok_; }
|
bool ok() const { return ok_; }
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ class LiftoffCompiler {
|
|||||||
TRACE("unsupported: %s\n", reason);
|
TRACE("unsupported: %s\n", reason);
|
||||||
decoder->errorf(decoder->pc_offset(), "unsupported liftoff operation: %s",
|
decoder->errorf(decoder->pc_offset(), "unsupported liftoff operation: %s",
|
||||||
reason);
|
reason);
|
||||||
BindUnboundLabels(decoder);
|
UnuseLabels(decoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DidAssemblerBailout(FullDecoder* decoder) {
|
bool DidAssemblerBailout(FullDecoder* decoder) {
|
||||||
@ -225,23 +225,21 @@ class LiftoffCompiler {
|
|||||||
return safepoint_table_builder_.GetCodeOffset();
|
return safepoint_table_builder_.GetCodeOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BindUnboundLabels(FullDecoder* decoder) {
|
void UnuseLabels(FullDecoder* decoder) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Bind all labels now, otherwise their destructor will fire a DCHECK error
|
auto Unuse = [](Label* label) {
|
||||||
|
label->Unuse();
|
||||||
|
label->UnuseNear();
|
||||||
|
};
|
||||||
|
// Unuse all labels now, otherwise their destructor will fire a DCHECK error
|
||||||
// if they where referenced before.
|
// if they where referenced before.
|
||||||
uint32_t control_depth = decoder ? decoder->control_depth() : 0;
|
uint32_t control_depth = decoder ? decoder->control_depth() : 0;
|
||||||
for (uint32_t i = 0; i < control_depth; ++i) {
|
for (uint32_t i = 0; i < control_depth; ++i) {
|
||||||
Control* c = decoder->control_at(i);
|
Control* c = decoder->control_at(i);
|
||||||
Label* label = c->label.get();
|
Unuse(c->label.get());
|
||||||
if (!label->is_bound()) __ bind(label);
|
if (c->else_state) Unuse(c->else_state->label.get());
|
||||||
if (c->else_state) {
|
|
||||||
Label* else_label = c->else_state->label.get();
|
|
||||||
if (!else_label->is_bound()) __ bind(else_label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (auto& ool : out_of_line_code_) {
|
|
||||||
if (!ool.label.get()->is_bound()) __ bind(ool.label.get());
|
|
||||||
}
|
}
|
||||||
|
for (auto& ool : out_of_line_code_) Unuse(ool.label.get());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,7 +449,7 @@ class LiftoffCompiler {
|
|||||||
|
|
||||||
void OnFirstError(FullDecoder* decoder) {
|
void OnFirstError(FullDecoder* decoder) {
|
||||||
ok_ = false;
|
ok_ = false;
|
||||||
BindUnboundLabels(decoder);
|
UnuseLabels(decoder);
|
||||||
asm_.AbortCompilation();
|
asm_.AbortCompilation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
test/mjsunit/regress/wasm/regress-924843.js
Normal file
17
test/mjsunit/regress/wasm/regress-924843.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Copyright 2019 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.
|
||||||
|
|
||||||
|
load('test/mjsunit/wasm/wasm-constants.js');
|
||||||
|
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||||
|
|
||||||
|
const builder = new WasmModuleBuilder();
|
||||||
|
const sig = builder.addType(makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]));
|
||||||
|
builder.addFunction(undefined, sig)
|
||||||
|
.addBody([
|
||||||
|
kExprGetLocal, 2,
|
||||||
|
kExprIf, kWasmStmt,
|
||||||
|
kExprBlock, kWasmStmt
|
||||||
|
]);
|
||||||
|
builder.addExport('main', 0);
|
||||||
|
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
Loading…
Reference in New Issue
Block a user