Commit 0045327b authored by serya@chromium.org's avatar serya@chromium.org

Review URL: http://codereview.chromium.org/555164

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3775 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c4bd2aa0
...@@ -6182,13 +6182,6 @@ void GenericUnaryOpStub::Generate(MacroAssembler* masm) { ...@@ -6182,13 +6182,6 @@ void GenericUnaryOpStub::Generate(MacroAssembler* masm) {
} }
int CEntryStub::MinorKey() {
ASSERT(result_size_ <= 2);
// Result returned in r0 or r0+r1 by default.
return 0;
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
// r0 holds the exception. // r0 holds the exception.
...@@ -6296,7 +6289,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -6296,7 +6289,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
Label* throw_normal_exception, Label* throw_normal_exception,
Label* throw_termination_exception, Label* throw_termination_exception,
Label* throw_out_of_memory_exception, Label* throw_out_of_memory_exception,
ExitFrame::Mode mode,
bool do_gc, bool do_gc,
bool always_allocate) { bool always_allocate) {
// r0: result parameter for PerformGC, if any // r0: result parameter for PerformGC, if any
...@@ -6356,7 +6348,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -6356,7 +6348,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
// r0:r1: result // r0:r1: result
// sp: stack pointer // sp: stack pointer
// fp: frame pointer // fp: frame pointer
__ LeaveExitFrame(mode); __ LeaveExitFrame(mode_);
// check if we should retry or throw exception // check if we should retry or throw exception
Label retry; Label retry;
...@@ -6389,7 +6381,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -6389,7 +6381,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
} }
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { void CEntryStub::Generate(MacroAssembler* masm) {
// Called from JavaScript; parameters are on stack as if calling JS function // Called from JavaScript; parameters are on stack as if calling JS function
// r0: number of arguments including receiver // r0: number of arguments including receiver
// r1: pointer to builtin function // r1: pointer to builtin function
...@@ -6397,17 +6389,15 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -6397,17 +6389,15 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
// sp: stack pointer (restored as callee's sp after C call) // sp: stack pointer (restored as callee's sp after C call)
// cp: current context (C callee-saved) // cp: current context (C callee-saved)
// Result returned in r0 or r0+r1 by default.
// NOTE: Invocations of builtins may return failure objects // NOTE: Invocations of builtins may return failure objects
// instead of a proper result. The builtin entry handles // instead of a proper result. The builtin entry handles
// this by performing a garbage collection and retrying the // this by performing a garbage collection and retrying the
// builtin once. // builtin once.
ExitFrame::Mode mode = is_debug_break
? ExitFrame::MODE_DEBUG
: ExitFrame::MODE_NORMAL;
// Enter the exit frame that transitions from JavaScript to C++. // Enter the exit frame that transitions from JavaScript to C++.
__ EnterExitFrame(mode); __ EnterExitFrame(mode_);
// r4: number of arguments (C callee-saved) // r4: number of arguments (C callee-saved)
// r5: pointer to builtin function (C callee-saved) // r5: pointer to builtin function (C callee-saved)
...@@ -6422,7 +6412,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -6422,7 +6412,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
false, false,
false); false);
...@@ -6431,7 +6420,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -6431,7 +6420,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
false); false);
...@@ -6442,7 +6430,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -6442,7 +6430,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
true); true);
......
...@@ -98,7 +98,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, ...@@ -98,7 +98,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
__ mov(r0, Operand(0)); // no arguments __ mov(r0, Operand(0)); // no arguments
__ mov(r1, Operand(ExternalReference::debug_break())); __ mov(r1, Operand(ExternalReference::debug_break()));
CEntryStub ceb(1); CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
__ CallStub(&ceb); __ CallStub(&ceb);
// Restore the register values containing object pointers from the expression // Restore the register values containing object pointers from the expression
......
...@@ -479,6 +479,19 @@ void ArgumentsAccessStub::Generate(MacroAssembler* masm) { ...@@ -479,6 +479,19 @@ void ArgumentsAccessStub::Generate(MacroAssembler* masm) {
} }
int CEntryStub::MinorKey() {
ASSERT(result_size_ <= 2);
#ifdef _WIN64
const indirect_result = result_size_ > 1;
#else
const bool indirect_result = false;
#endif
return ExitFrameModeBits::encode(mode_)
| IndirectResultBits::encode(indirect_result > 1);
}
bool ApiGetterEntryStub::GetCustomCache(Code** code_out) { bool ApiGetterEntryStub::GetCustomCache(Code** code_out) {
Object* cache = info()->load_stub_cache(); Object* cache = info()->load_stub_cache();
if (cache->IsUndefined()) { if (cache->IsUndefined()) {
......
...@@ -330,25 +330,30 @@ class CompareStub: public CodeStub { ...@@ -330,25 +330,30 @@ class CompareStub: public CodeStub {
class CEntryStub : public CodeStub { class CEntryStub : public CodeStub {
public: public:
explicit CEntryStub(int result_size) : result_size_(result_size) { } explicit CEntryStub(int result_size,
ExitFrame::Mode mode = ExitFrame::MODE_NORMAL)
: result_size_(result_size), mode_(mode) { }
void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } void Generate(MacroAssembler* masm);
protected: private:
void GenerateBody(MacroAssembler* masm, bool is_debug_break);
void GenerateCore(MacroAssembler* masm, void GenerateCore(MacroAssembler* masm,
Label* throw_normal_exception, Label* throw_normal_exception,
Label* throw_termination_exception, Label* throw_termination_exception,
Label* throw_out_of_memory_exception, Label* throw_out_of_memory_exception,
ExitFrame::Mode mode,
bool do_gc, bool do_gc,
bool always_allocate_scope); bool always_allocate_scope);
void GenerateThrowTOS(MacroAssembler* masm); void GenerateThrowTOS(MacroAssembler* masm);
void GenerateThrowUncatchable(MacroAssembler* masm, void GenerateThrowUncatchable(MacroAssembler* masm,
UncatchableExceptionType type); UncatchableExceptionType type);
private:
// Number of pointers/values returned. // Number of pointers/values returned.
int result_size_; int const result_size_;
ExitFrame::Mode const mode_;
// Minor key encoding
class ExitFrameModeBits: public BitField<ExitFrame::Mode, 0, 1> {};
class IndirectResultBits: public BitField<bool, 1, 1> {};
Major MajorKey() { return CEntry; } Major MajorKey() { return CEntry; }
// Minor key must differ if different result_size_ values means different // Minor key must differ if different result_size_ values means different
...@@ -385,7 +390,7 @@ class ApiGetterEntryStub : public CodeStub { ...@@ -385,7 +390,7 @@ class ApiGetterEntryStub : public CodeStub {
}; };
// Mark the debugger statemet to be recognized bu debugger (by the MajorKey) // Mark the debugger statemet to be recognized by debugger (by the MajorKey)
class DebugerStatementStub : public CodeStub { class DebugerStatementStub : public CodeStub {
public: public:
DebugerStatementStub() { } DebugerStatementStub() { }
......
...@@ -410,7 +410,7 @@ Object*& ExitFrame::code_slot() const { ...@@ -410,7 +410,7 @@ Object*& ExitFrame::code_slot() const {
Code* ExitFrame::code() const { Code* ExitFrame::code() const {
Object* code = code_slot(); Object* code = code_slot();
if (code->IsSmi()) { if (code->IsSmi()) {
return Heap::c_entry_debug_break_code(); return Heap::debugger_statement_code();
} else { } else {
return Code::cast(code); return Code::cast(code);
} }
......
...@@ -1500,7 +1500,7 @@ void Heap::CreateRegExpCEntryStub() { ...@@ -1500,7 +1500,7 @@ void Heap::CreateRegExpCEntryStub() {
void Heap::CreateCEntryDebugBreakStub() { void Heap::CreateCEntryDebugBreakStub() {
DebugerStatementStub stub; DebugerStatementStub stub;
set_c_entry_debug_break_code(*stub.GetCode()); set_debugger_statement_code(*stub.GetCode());
} }
...@@ -1527,7 +1527,7 @@ void Heap::CreateFixedStubs() { ...@@ -1527,7 +1527,7 @@ void Heap::CreateFixedStubs() {
// c_entry_code_ = *stub.GetCode(); // c_entry_code_ = *stub.GetCode();
// } // }
// { DebugerStatementStub stub; // { DebugerStatementStub stub;
// c_entry_debug_break_code_ = *stub.GetCode(); // debugger_statement_code_ = *stub.GetCode();
// } // }
// To workaround the problem, make separate functions without inlining. // To workaround the problem, make separate functions without inlining.
Heap::CreateCEntryStub(); Heap::CreateCEntryStub();
......
...@@ -101,7 +101,7 @@ namespace internal { ...@@ -101,7 +101,7 @@ namespace internal {
V(Code, js_entry_code, JsEntryCode) \ V(Code, js_entry_code, JsEntryCode) \
V(Code, js_construct_entry_code, JsConstructEntryCode) \ V(Code, js_construct_entry_code, JsConstructEntryCode) \
V(Code, c_entry_code, CEntryCode) \ V(Code, c_entry_code, CEntryCode) \
V(Code, c_entry_debug_break_code, CEntryDebugBreakCode) \ V(Code, debugger_statement_code, DebuggerStatementCode) \
V(FixedArray, number_string_cache, NumberStringCache) \ V(FixedArray, number_string_cache, NumberStringCache) \
V(FixedArray, single_character_string_cache, SingleCharacterStringCache) \ V(FixedArray, single_character_string_cache, SingleCharacterStringCache) \
V(FixedArray, natives_source_cache, NativesSourceCache) \ V(FixedArray, natives_source_cache, NativesSourceCache) \
......
...@@ -9073,13 +9073,6 @@ void CallFunctionStub::Generate(MacroAssembler* masm) { ...@@ -9073,13 +9073,6 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
} }
int CEntryStub::MinorKey() {
ASSERT(result_size_ <= 2);
// Result returned in eax, or eax+edx if result_size_ is 2.
return 0;
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
// eax holds the exception. // eax holds the exception.
...@@ -9189,7 +9182,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -9189,7 +9182,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
Label* throw_normal_exception, Label* throw_normal_exception,
Label* throw_termination_exception, Label* throw_termination_exception,
Label* throw_out_of_memory_exception, Label* throw_out_of_memory_exception,
ExitFrame::Mode mode,
bool do_gc, bool do_gc,
bool always_allocate_scope) { bool always_allocate_scope) {
// eax: result parameter for PerformGC, if any // eax: result parameter for PerformGC, if any
...@@ -9199,6 +9191,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -9199,6 +9191,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
// edi: number of arguments including receiver (C callee-saved) // edi: number of arguments including receiver (C callee-saved)
// esi: pointer to the first argument (C callee-saved) // esi: pointer to the first argument (C callee-saved)
// Result returned in eax, or eax+edx if result_size_ is 2.
if (do_gc) { if (do_gc) {
__ mov(Operand(esp, 0 * kPointerSize), eax); // Result. __ mov(Operand(esp, 0 * kPointerSize), eax); // Result.
__ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY);
...@@ -9239,7 +9233,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -9239,7 +9233,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
__ j(zero, &failure_returned, not_taken); __ j(zero, &failure_returned, not_taken);
// Exit the JavaScript to C++ exit frame. // Exit the JavaScript to C++ exit frame.
__ LeaveExitFrame(mode); __ LeaveExitFrame(mode_);
__ ret(0); __ ret(0);
// Handling of failure. // Handling of failure.
...@@ -9326,7 +9320,7 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, ...@@ -9326,7 +9320,7 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
} }
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { void CEntryStub::Generate(MacroAssembler* masm) {
// eax: number of arguments including receiver // eax: number of arguments including receiver
// ebx: pointer to C function (C callee-saved) // ebx: pointer to C function (C callee-saved)
// ebp: frame pointer (restored after C call) // ebp: frame pointer (restored after C call)
...@@ -9338,12 +9332,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -9338,12 +9332,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
// of a proper result. The builtin entry handles this by performing // of a proper result. The builtin entry handles this by performing
// a garbage collection and retrying the builtin (twice). // a garbage collection and retrying the builtin (twice).
ExitFrame::Mode mode = is_debug_break
? ExitFrame::MODE_DEBUG
: ExitFrame::MODE_NORMAL;
// Enter the exit frame that transitions from JavaScript to C++. // Enter the exit frame that transitions from JavaScript to C++.
__ EnterExitFrame(mode); __ EnterExitFrame(mode_);
// eax: result parameter for PerformGC, if any (setup below) // eax: result parameter for PerformGC, if any (setup below)
// ebx: pointer to builtin function (C callee-saved) // ebx: pointer to builtin function (C callee-saved)
...@@ -9361,7 +9351,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -9361,7 +9351,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
false, false,
false); false);
...@@ -9370,7 +9359,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -9370,7 +9359,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
false); false);
...@@ -9381,7 +9369,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -9381,7 +9369,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
true); true);
......
...@@ -94,7 +94,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, ...@@ -94,7 +94,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
__ Set(eax, Immediate(0)); // no arguments __ Set(eax, Immediate(0)); // no arguments
__ mov(ebx, Immediate(ExternalReference::debug_break())); __ mov(ebx, Immediate(ExternalReference::debug_break()));
CEntryStub ceb(1); CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
__ CallStub(&ceb); __ CallStub(&ceb);
// Restore the register values containing object pointers from the expression // Restore the register values containing object pointers from the expression
......
...@@ -7332,21 +7332,6 @@ void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { ...@@ -7332,21 +7332,6 @@ void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) {
} }
int CEntryStub::MinorKey() {
ASSERT(result_size_ <= 2);
#ifdef _WIN64
// Simple results returned in rax (using default code).
// Complex results must be written to address passed as first argument.
return (result_size_ < 2) ? 0 : 1;
#else
// Single results returned in rax (both AMD64 and Win64 calling conventions)
// and a struct of two pointers in rax+rdx (AMD64 calling convention only)
// by default.
return 0;
#endif
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
// Check that stack should contain next handler, frame pointer, state and // Check that stack should contain next handler, frame pointer, state and
// return address in that order. // return address in that order.
...@@ -7380,7 +7365,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -7380,7 +7365,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
Label* throw_normal_exception, Label* throw_normal_exception,
Label* throw_termination_exception, Label* throw_termination_exception,
Label* throw_out_of_memory_exception, Label* throw_out_of_memory_exception,
ExitFrame::Mode mode,
bool do_gc, bool do_gc,
bool always_allocate_scope) { bool always_allocate_scope) {
// rax: result parameter for PerformGC, if any. // rax: result parameter for PerformGC, if any.
...@@ -7392,6 +7376,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -7392,6 +7376,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
// This pointer is reused in LeaveExitFrame(), so it is stored in a // This pointer is reused in LeaveExitFrame(), so it is stored in a
// callee-saved register. // callee-saved register.
// Simple results returned in rax (both AMD64 and Win64 calling conventions).
// Complex results must be written to address passed as first argument.
// AMD64 calling convention: a struct of two pointers in rax+rdx
if (do_gc) { if (do_gc) {
// Pass failure code returned from last attempt as first argument to GC. // Pass failure code returned from last attempt as first argument to GC.
#ifdef _WIN64 #ifdef _WIN64
...@@ -7463,7 +7451,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -7463,7 +7451,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
__ j(zero, &failure_returned); __ j(zero, &failure_returned);
// Exit the JavaScript to C++ exit frame. // Exit the JavaScript to C++ exit frame.
__ LeaveExitFrame(mode, result_size_); __ LeaveExitFrame(mode_, result_size_);
__ ret(0); __ ret(0);
// Handling of failure. // Handling of failure.
...@@ -7607,7 +7595,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) { ...@@ -7607,7 +7595,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
} }
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { void CEntryStub::Generate(MacroAssembler* masm) {
// rax: number of arguments including receiver // rax: number of arguments including receiver
// rbx: pointer to C function (C callee-saved) // rbx: pointer to C function (C callee-saved)
// rbp: frame pointer of calling JS frame (restored after C call) // rbp: frame pointer of calling JS frame (restored after C call)
...@@ -7619,12 +7607,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -7619,12 +7607,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
// this by performing a garbage collection and retrying the // this by performing a garbage collection and retrying the
// builtin once. // builtin once.
ExitFrame::Mode mode = is_debug_break ?
ExitFrame::MODE_DEBUG :
ExitFrame::MODE_NORMAL;
// Enter the exit frame that transitions from JavaScript to C++. // Enter the exit frame that transitions from JavaScript to C++.
__ EnterExitFrame(mode, result_size_); __ EnterExitFrame(mode_, result_size_);
// rax: Holds the context at this point, but should not be used. // rax: Holds the context at this point, but should not be used.
// On entry to code generated by GenerateCore, it must hold // On entry to code generated by GenerateCore, it must hold
...@@ -7647,7 +7631,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -7647,7 +7631,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
false, false,
false); false);
...@@ -7656,7 +7639,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -7656,7 +7639,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
false); false);
...@@ -7667,7 +7649,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { ...@@ -7667,7 +7649,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
&throw_normal_exception, &throw_normal_exception,
&throw_termination_exception, &throw_termination_exception,
&throw_out_of_memory_exception, &throw_out_of_memory_exception,
mode,
true, true,
true); true);
......
...@@ -68,7 +68,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, ...@@ -68,7 +68,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
__ xor_(rax, rax); // No arguments (argc == 0). __ xor_(rax, rax); // No arguments (argc == 0).
__ movq(rbx, ExternalReference::debug_break()); __ movq(rbx, ExternalReference::debug_break());
CEntryStub ceb(1); CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
__ CallStub(&ceb); __ CallStub(&ceb);
// Restore the register values containing object pointers from the expression // Restore the register values containing object pointers from the expression
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment