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