diff options
Diffstat (limited to 'deps/v8/src/x64/debug-x64.cc')
-rw-r--r-- | deps/v8/src/x64/debug-x64.cc | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/deps/v8/src/x64/debug-x64.cc b/deps/v8/src/x64/debug-x64.cc index c8f9456f75..ee2b5c526a 100644 --- a/deps/v8/src/x64/debug-x64.cc +++ b/deps/v8/src/x64/debug-x64.cc @@ -14,58 +14,57 @@ namespace v8 { namespace internal { -bool BreakLocationIterator::IsDebugBreakAtReturn() { - return Debug::IsDebugBreakAtReturn(rinfo()); -} +// Patch the code at the current PC with a call to the target address. +// Additional guard int3 instructions can be added if required. +void PatchCodeWithCall(Address pc, Address target, int guard_bytes) { + int code_size = Assembler::kCallSequenceLength + guard_bytes; + // Create a code patcher. + CodePatcher patcher(pc, code_size); -// Patch the JS frame exit code with a debug break call. See -// CodeGenerator::VisitReturnStatement and VirtualFrame::Exit in codegen-x64.cc -// for the precise return instructions sequence. -void BreakLocationIterator::SetDebugBreakAtReturn() { - DCHECK(Assembler::kJSReturnSequenceLength >= Assembler::kCallSequenceLength); - rinfo()->PatchCodeWithCall( - debug_info_->GetIsolate()->builtins()->Return_DebugBreak()->entry(), - Assembler::kJSReturnSequenceLength - Assembler::kCallSequenceLength); -} +// Add a label for checking the size of the code used for returning. +#ifdef DEBUG + Label check_codesize; + patcher.masm()->bind(&check_codesize); +#endif + // Patch the code. + patcher.masm()->movp(kScratchRegister, reinterpret_cast<void*>(target), + Assembler::RelocInfoNone()); + patcher.masm()->call(kScratchRegister); -// Restore the JS frame exit code. -void BreakLocationIterator::ClearDebugBreakAtReturn() { - rinfo()->PatchCode(original_rinfo()->pc(), - Assembler::kJSReturnSequenceLength); -} + // Check that the size of the code generated is as expected. + DCHECK_EQ(Assembler::kCallSequenceLength, + patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); + // Add the requested number of int3 instructions after the call. + for (int i = 0; i < guard_bytes; i++) { + patcher.masm()->int3(); + } -// A debug break in the frame exit code is identified by the JS frame exit code -// having been patched with a call instruction. -bool Debug::IsDebugBreakAtReturn(v8::internal::RelocInfo* rinfo) { - DCHECK(RelocInfo::IsJSReturn(rinfo->rmode())); - return rinfo->IsPatchedReturnSequence(); + CpuFeatures::FlushICache(pc, code_size); } -bool BreakLocationIterator::IsDebugBreakAtSlot() { - DCHECK(IsDebugBreakSlot()); - // Check whether the debug break slot instructions have been patched. - return rinfo()->IsPatchedDebugBreakSlotSequence(); +// Patch the JS frame exit code with a debug break call. See +// CodeGenerator::VisitReturnStatement and VirtualFrame::Exit in codegen-x64.cc +// for the precise return instructions sequence. +void BreakLocation::SetDebugBreakAtReturn() { + DCHECK(Assembler::kJSReturnSequenceLength >= Assembler::kCallSequenceLength); + PatchCodeWithCall( + pc(), debug_info_->GetIsolate()->builtins()->Return_DebugBreak()->entry(), + Assembler::kJSReturnSequenceLength - Assembler::kCallSequenceLength); } -void BreakLocationIterator::SetDebugBreakAtSlot() { +void BreakLocation::SetDebugBreakAtSlot() { DCHECK(IsDebugBreakSlot()); - rinfo()->PatchCodeWithCall( - debug_info_->GetIsolate()->builtins()->Slot_DebugBreak()->entry(), + PatchCodeWithCall( + pc(), debug_info_->GetIsolate()->builtins()->Slot_DebugBreak()->entry(), Assembler::kDebugBreakSlotLength - Assembler::kCallSequenceLength); } -void BreakLocationIterator::ClearDebugBreakAtSlot() { - DCHECK(IsDebugBreakSlot()); - rinfo()->PatchCode(original_rinfo()->pc(), Assembler::kDebugBreakSlotLength); -} - - #define __ ACCESS_MASM(masm) |