[liftoff] Allow resuming execution after stepping

R=clemensb@chromium.org

Bug: v8:10321
Change-Id: Ia082b842de8947ead3931943b3bc05903a0f9e29
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2101002
Reviewed-by: Clemens Backes <clemensb@chromium.org>
Commit-Queue: Thibaud Michaud <thibaudm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#66704}
This commit is contained in:
Thibaud Michaud 2020-03-13 12:51:04 +01:00 committed by Commit Bot
parent a0913c9dea
commit 9009939437
5 changed files with 35 additions and 1 deletions

View File

@ -619,6 +619,7 @@ RUNTIME_FUNCTION(Runtime_WasmDebugBreak) {
const auto undefined = ReadOnlyRoots(isolate).undefined_value();
auto* debug_info = frame_finder.frame()->native_module()->GetDebugInfo();
if (debug_info->IsStepping(frame_finder.frame())) {
debug_info->ClearStepping();
isolate->debug()->OnDebugBreak(isolate->factory()->empty_fixed_array());
return undefined;
}

View File

@ -684,10 +684,14 @@ class DebugInfoImpl {
isolate);
stepping_frame_ = frame->id();
}
stepping_ = true;
}
void ClearStepping() { stepping_ = false; }
bool IsStepping(WasmCompiledFrame* frame) {
return frame->id() == stepping_frame_;
DCHECK_IMPLIES(stepping_, stepping_frame_ != NO_ID);
return stepping_;
}
void RemoveDebugSideTables(Vector<WasmCode* const> codes) {
@ -788,6 +792,7 @@ class DebugInfoImpl {
// Store the frame ID when stepping, to avoid breaking in recursive calls of
// the same function.
StackFrameId stepping_frame_ = NO_ID;
bool stepping_ = false;
DISALLOW_COPY_AND_ASSIGN(DebugInfoImpl);
};
@ -813,6 +818,8 @@ void DebugInfo::SetBreakpoint(int func_index, int offset,
void DebugInfo::PrepareStep(Isolate* isolate) { impl_->PrepareStep(isolate); }
void DebugInfo::ClearStepping() { impl_->ClearStepping(); }
bool DebugInfo::IsStepping(WasmCompiledFrame* frame) {
return impl_->IsStepping(frame);
}

View File

@ -149,6 +149,8 @@ class DebugInfo {
void PrepareStep(Isolate*);
void ClearStepping();
bool IsStepping(WasmCompiledFrame*);
void RemoveDebugSideTables(Vector<WasmCode* const>);

View File

@ -10,6 +10,16 @@ Setting breakpoint on offset 59 (should be propagated to 60, the offset of the c
Paused at wasm://wasm/befe41aa:0:60
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:62
Debugger.resume called
Paused at wasm://wasm/befe41aa:0:60
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:62
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:46
Debugger.resume called
Paused at wasm://wasm/befe41aa:0:60
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:62
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:46
Debugger.stepOver called
@ -27,4 +37,9 @@ Paused at wasm://wasm/befe41aa:0:57
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:60
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:62
Debugger.stepOver called
Paused at wasm://wasm/befe41aa:0:46
Debugger.resume called
exports.main returned!
Finished!

View File

@ -75,8 +75,17 @@ function instantiate(bytes) {
const actualLocation = bpmsg.result.actualLocation;
InspectorTest.logMessage(actualLocation);
Protocol.Runtime.evaluate({ expression: 'instance.exports.main(4)' });
await waitForPauseAndStep('stepOver'); // over call to wasm_A
await waitForPauseAndStep('resume'); // stop on breakpoint
await waitForPauseAndStep('stepOver'); // over call
await waitForPauseAndStep('stepOver'); // over br
await waitForPauseAndStep('resume'); // to next breakpoint (3rd iteration)
await waitForPauseAndStep('stepOver'); // over wasm_A
// Step over 10 times.
for (let i = 0; i < 10; ++i) await waitForPauseAndStep('stepOver');
// Then just resume.
await waitForPauseAndStep('resume');
InspectorTest.log('exports.main returned!');
InspectorTest.log('Finished!');
})().catch(reason => InspectorTest.log(`Failed: ${reason}`))
.finally(InspectorTest.completeTest);