1212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redistribution and use in source and binary forms, with or without 35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modification, are permitted provided that the following conditions are 45c838251403b0be9a882540f1922577abba4c872ager@chromium.org// met: 55c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 65c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Redistributions of source code must retain the above copyright 75c838251403b0be9a882540f1922577abba4c872ager@chromium.org// notice, this list of conditions and the following disclaimer. 85c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Redistributions in binary form must reproduce the above 95c838251403b0be9a882540f1922577abba4c872ager@chromium.org// copyright notice, this list of conditions and the following 105c838251403b0be9a882540f1922577abba4c872ager@chromium.org// disclaimer in the documentation and/or other materials provided 115c838251403b0be9a882540f1922577abba4c872ager@chromium.org// with the distribution. 125c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Neither the name of Google Inc. nor the names of its 135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// contributors may be used to endorse or promote products derived 145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// from this software without specific prior written permission. 155c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c838251403b0be9a882540f1922577abba4c872ager@chromium.org 285c838251403b0be9a882540f1922577abba4c872ager@chromium.org 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "v8.h" 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_MIPS 339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 3483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org#include "codegen.h" 355c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "debug.h" 365c838251403b0be9a882540f1922577abba4c872ager@chromium.org 375c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace v8 { 385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace internal { 395c838251403b0be9a882540f1922577abba4c872ager@chromium.org 405c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool BreakLocationIterator::IsDebugBreakAtReturn() { 437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return Debug::IsDebugBreakAtReturn(rinfo()); 445c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org 465c838251403b0be9a882540f1922577abba4c872ager@chromium.org 475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid BreakLocationIterator::SetDebugBreakAtReturn() { 487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Mips return sequence: 497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // mov sp, fp 507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // lw fp, sp(0) 517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // lw ra, sp(4) 527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // addiu sp, sp, 8 537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // addiu sp, sp, N 547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // jr ra 557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // nop (in branch delay slot) 567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Make sure this constant matches the number if instrucntions we emit. 587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT(Assembler::kJSReturnSequenceInstructions == 7); 597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org CodePatcher patcher(rinfo()->pc(), Assembler::kJSReturnSequenceInstructions); 607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // li and Call pseudo-instructions emit two instructions each. 617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->li(v8::internal::t9, 627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Operand(reinterpret_cast<int32_t>( 63e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org debug_info_->GetIsolate()->debug()->debug_break_return()->entry()))); 647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->Call(v8::internal::t9); 657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->nop(); 667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->nop(); 677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->nop(); 687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // TODO(mips): Open issue about using breakpoint instruction instead of nops. 707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // patcher.masm()->bkpt(0); 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 735c838251403b0be9a882540f1922577abba4c872ager@chromium.org 745c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Restore the JS frame exit code. 755c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid BreakLocationIterator::ClearDebugBreakAtReturn() { 767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org rinfo()->PatchCode(original_rinfo()->pc(), 777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Assembler::kJSReturnSequenceInstructions); 785c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 795c838251403b0be9a882540f1922577abba4c872ager@chromium.org 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org 817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// A debug break in the exit code is identified by the JS frame exit code 827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// having been patched with li/call psuedo-instrunction (liu/ori/jalr). 835c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool Debug::IsDebugBreakAtReturn(RelocInfo* rinfo) { 847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT(RelocInfo::IsJSReturn(rinfo->rmode())); 857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return rinfo->IsPatchedReturnSequence(); 865c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 875c838251403b0be9a882540f1922577abba4c872ager@chromium.org 885c838251403b0be9a882540f1922577abba4c872ager@chromium.org 897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgbool BreakLocationIterator::IsDebugBreakAtSlot() { 907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT(IsDebugBreakSlot()); 917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Check whether the debug break slot instructions have been patched. 927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return rinfo()->IsPatchedDebugBreakSlotSequence(); 937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid BreakLocationIterator::SetDebugBreakAtSlot() { 977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT(IsDebugBreakSlot()); 987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Patch the code changing the debug break slot code from: 997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // nop(DEBUG_BREAK_NOP) - nop(1) is sll(zero_reg, zero_reg, 1) 1007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // nop(DEBUG_BREAK_NOP) 1017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // nop(DEBUG_BREAK_NOP) 1027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // nop(DEBUG_BREAK_NOP) 1037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // to a call to the debug break slot code. 1047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // li t9, address (lui t9 / ori t9 instruction pair) 1057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // call t9 (jalr t9 / nop instruction pair) 1067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org CodePatcher patcher(rinfo()->pc(), Assembler::kDebugBreakSlotInstructions); 1077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->li(v8::internal::t9, Operand(reinterpret_cast<int32_t>( 108e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org debug_info_->GetIsolate()->debug()->debug_break_slot()->entry()))); 1097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org patcher.masm()->Call(v8::internal::t9); 1107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 1117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid BreakLocationIterator::ClearDebugBreakAtSlot() { 1147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT(IsDebugBreakSlot()); 1157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org rinfo()->PatchCode(original_rinfo()->pc(), 1167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Assembler::kDebugBreakSlotInstructions); 1177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org 119212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgconst bool Debug::FramePaddingLayout::kIsSupported = false; 120212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org 1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define __ ACCESS_MASM(masm) 1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1245c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic void Generate_DebugBreakCallHelper(MacroAssembler* masm, 1277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org RegList object_regs, 1287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org RegList non_object_regs) { 129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FrameScope scope(masm, StackFrame::INTERNAL); 131c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 132c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Store the registers containing live values on the expression stack to 133c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // make sure that these are correctly updated during GC. Non object values 134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // are stored as a smi causing it to be untouched by GC. 135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT((object_regs & ~kJSCallerSaved) == 0); 136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT((non_object_regs & ~kJSCallerSaved) == 0); 137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT((object_regs & non_object_regs) == 0); 138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if ((object_regs | non_object_regs) != 0) { 139c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (int i = 0; i < kNumJSCallerSaved; i++) { 140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int r = JSCallerSavedCode(i); 141c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Register reg = { r }; 142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if ((non_object_regs & (1 << r)) != 0) { 143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_debug_code) { 144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ And(at, reg, 0xc0000000); 145594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org __ Assert(eq, kUnableToEncodeValueAsSmi, at, Operand(zero_reg)); 146c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ sll(reg, reg, kSmiTagSize); 1487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ MultiPush(object_regs | non_object_regs); 1517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef DEBUG 154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ RecordComment("// Calling from debug break to runtime - come in - over"); 1557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif 1566ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org __ PrepareCEntryArgs(0); // No arguments. 1576ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org __ PrepareCEntryFunction(ExternalReference::debug_break(masm->isolate())); 158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CEntryStub ceb(1); 160c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ CallStub(&ceb); 161c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 162c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Restore the register values from the expression stack. 163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if ((object_regs | non_object_regs) != 0) { 164c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ MultiPop(object_regs | non_object_regs); 165c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (int i = 0; i < kNumJSCallerSaved; i++) { 166c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int r = JSCallerSavedCode(i); 167c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Register reg = { r }; 168c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if ((non_object_regs & (1 << r)) != 0) { 169c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ srl(reg, reg, kSmiTagSize); 170c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 171c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_debug_code && 172c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (((object_regs |non_object_regs) & (1 << r)) == 0)) { 173c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com __ li(reg, kDebugZapValue); 174c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 178c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Leave the internal frame. 179c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Now that the break point has been handled, resume normal execution by 1827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // jumping to the target address intended by the caller and that was 1837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // overwritten by the address of DebugBreakXXX. 1847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ li(t9, Operand( 1857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ExternalReference(Debug_Address::AfterBreakTarget(), masm->isolate()))); 1867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ lw(t9, MemOperand(t9)); 1877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ Jump(t9); 1887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1915c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateLoadICDebugBreak(MacroAssembler* masm) { 1927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Calling convention for IC load (from ic-mips.cc). 1937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------- S t a t e ------------- 1947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a2 : name 1957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- ra : return address 1967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a0 : receiver 1977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- [sp] : receiver 1987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------------------------------- 1997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Registers a0 and a2 contain objects that need to be pushed on the 2007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // expression stack of the fake JS frame. 2017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, a0.bit() | a2.bit(), 0); 2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2045c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateStoreICDebugBreak(MacroAssembler* masm) { 2067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Calling convention for IC store (from ic-mips.cc). 2077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------- S t a t e ------------- 2087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a0 : value 2097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a1 : receiver 2107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a2 : name 2117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- ra : return address 2127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------------------------------- 2137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Registers a0, a1, and a2 contain objects that need to be pushed on the 2147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // expression stack of the fake JS frame. 2157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, a0.bit() | a1.bit() | a2.bit(), 0); 2165c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2175c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2185c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2195c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateKeyedLoadICDebugBreak(MacroAssembler* masm) { 2207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ---------- S t a t e -------------- 2217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- ra : return address 2227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a0 : key 2237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a1 : receiver 2247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, a0.bit() | a1.bit(), 0); 2255c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2265c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2275c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2285c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateKeyedStoreICDebugBreak(MacroAssembler* masm) { 2297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ---------- S t a t e -------------- 2307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a0 : value 2317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a1 : key 2327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a2 : receiver 2337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- ra : return address 2347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, a0.bit() | a1.bit() | a2.bit(), 0); 2355c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2365c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 23887a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.comvoid Debug::GenerateCompareNilICDebugBreak(MacroAssembler* masm) { 23987a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com // Register state for CompareNil IC 24087a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com // ----------- S t a t e ------------- 24187a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com // -- a0 : value 24287a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com // ----------------------------------- 24387a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com Generate_DebugBreakCallHelper(masm, a0.bit(), 0); 24487a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com} 24587a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com 24687a74ee197718a2c3049986df903f3141ab00255palfia@homejinni.com 2475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateCallICDebugBreak(MacroAssembler* masm) { 2487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Calling convention for IC call (from ic-mips.cc). 2497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------- S t a t e ------------- 2507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // -- a2: name 2517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------------------------------- 2527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, a2.bit(), 0); 2535c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2545c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2555c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Debug::GenerateReturnDebugBreak(MacroAssembler* masm) { 2577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // In places other than IC call sites it is expected that v0 is TOS which 2587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // is an object - this is not generally the case so this should be used with 2597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // care. 2607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, v0.bit(), 0); 2615c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2625c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2635c838251403b0be9a882540f1922577abba4c872ager@chromium.org 264c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgvoid Debug::GenerateCallFunctionStubDebugBreak(MacroAssembler* masm) { 265fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Register state for CallFunctionStub (from code-stubs-mips.cc). 2667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------- S t a t e ------------- 267c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // -- a1 : function 2687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // ----------------------------------- 269c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Generate_DebugBreakCallHelper(masm, a1.bit(), 0); 2705c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2715c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 273fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgvoid Debug::GenerateCallFunctionStubRecordDebugBreak(MacroAssembler* masm) { 274fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Register state for CallFunctionStub (from code-stubs-mips.cc). 275fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------- S t a t e ------------- 276fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a1 : function 277fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a2 : cache cell for call target 278fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------------------------------- 279fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Generate_DebugBreakCallHelper(masm, a1.bit() | a2.bit(), 0); 280fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 281fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 282fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 283fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgvoid Debug::GenerateCallConstructStubDebugBreak(MacroAssembler* masm) { 284fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Calling convention for CallConstructStub (from code-stubs-mips.cc). 285fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------- S t a t e ------------- 286fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a0 : number of arguments (not smi) 287fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a1 : constructor function 288fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------------------------------- 289fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Generate_DebugBreakCallHelper(masm, a1.bit() , a0.bit()); 290fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 291fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 292fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 293fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgvoid Debug::GenerateCallConstructStubRecordDebugBreak(MacroAssembler* masm) { 294fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Calling convention for CallConstructStub (from code-stubs-mips.cc). 295fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------- S t a t e ------------- 296fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a0 : number of arguments (not smi) 297fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a1 : constructor function 298fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // -- a2 : cache cell for call target 299fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // ----------------------------------- 300fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Generate_DebugBreakCallHelper(masm, a1.bit() | a2.bit(), a0.bit()); 301fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 302fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 303fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 3047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid Debug::GenerateSlot(MacroAssembler* masm) { 3057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Generate enough nop's to make space for a call instruction. Avoid emitting 3067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // the trampoline pool in the debug break slot code. 3077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm); 3087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Label check_codesize; 3097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ bind(&check_codesize); 3107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ RecordDebugBreakSlot(); 3117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org for (int i = 0; i < Assembler::kDebugBreakSlotInstructions; i++) { 3127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org __ nop(MacroAssembler::DEBUG_BREAK_NOP); 3137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 3147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ASSERT_EQ(Assembler::kDebugBreakSlotInstructions, 3157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org masm->InstructionsGeneratedSince(&check_codesize)); 3167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 3177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgvoid Debug::GenerateSlotDebugBreak(MacroAssembler* masm) { 3207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // In the places where a debug break slot is inserted no registers can contain 3217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // object pointers. 3227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Generate_DebugBreakCallHelper(masm, 0, 0); 3237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} 3247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 326357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Debug::GeneratePlainReturnLiveEdit(MacroAssembler* masm) { 327594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnMips); 328357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 329357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 3307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 331357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) { 332594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnMips); 333357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 334357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 3355c838251403b0be9a882540f1922577abba4c872ager@chromium.org 336ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgconst bool Debug::kFrameDropperSupported = false; 337357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 338ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org#undef __ 339357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 340357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 3415c838251403b0be9a882540f1922577abba4c872ager@chromium.org#endif // ENABLE_DEBUGGER_SUPPORT 3425c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3435c838251403b0be9a882540f1922577abba4c872ager@chromium.org} } // namespace v8::internal 3445c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_MIPS 346