From: serya@chromium.org Date: Tue, 2 Feb 2010 18:35:53 +0000 (+0000) Subject: Review URL: http://codereview.chromium.org/555164 X-Git-Tag: upstream/4.7.83~22554 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0045327b7d0861bfcdac5b1000b9e6271247918d;p=platform%2Fupstream%2Fv8.git Review URL: http://codereview.chromium.org/555164 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3775 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index 7232e3497..2ab96328e 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -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) { // r0 holds the exception. @@ -6296,7 +6289,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, Label* throw_normal_exception, Label* throw_termination_exception, Label* throw_out_of_memory_exception, - ExitFrame::Mode mode, bool do_gc, bool always_allocate) { // r0: result parameter for PerformGC, if any @@ -6356,7 +6348,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, // r0:r1: result // sp: stack pointer // fp: frame pointer - __ LeaveExitFrame(mode); + __ LeaveExitFrame(mode_); // check if we should retry or throw exception Label retry; @@ -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 // r0: number of arguments including receiver // r1: pointer to builtin function @@ -6397,17 +6389,15 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { // sp: stack pointer (restored as callee's sp after C call) // cp: current context (C callee-saved) + // Result returned in r0 or r0+r1 by default. + // NOTE: Invocations of builtins may return failure objects // instead of a proper result. The builtin entry handles // this by performing a garbage collection and retrying the // builtin once. - ExitFrame::Mode mode = is_debug_break - ? ExitFrame::MODE_DEBUG - : ExitFrame::MODE_NORMAL; - // Enter the exit frame that transitions from JavaScript to C++. - __ EnterExitFrame(mode); + __ EnterExitFrame(mode_); // r4: number of arguments (C callee-saved) // r5: pointer to builtin function (C callee-saved) @@ -6422,7 +6412,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, false, false); @@ -6431,7 +6420,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, false); @@ -6442,7 +6430,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, true); diff --git a/src/arm/debug-arm.cc b/src/arm/debug-arm.cc index 2a0689fb3..6eb5239b8 100644 --- a/src/arm/debug-arm.cc +++ b/src/arm/debug-arm.cc @@ -98,7 +98,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ mov(r0, Operand(0)); // no arguments __ mov(r1, Operand(ExternalReference::debug_break())); - CEntryStub ceb(1); + CEntryStub ceb(1, ExitFrame::MODE_DEBUG); __ CallStub(&ceb); // Restore the register values containing object pointers from the expression diff --git a/src/codegen.cc b/src/codegen.cc index 1b8af1a7f..979b0aa65 100644 --- a/src/codegen.cc +++ b/src/codegen.cc @@ -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) { Object* cache = info()->load_stub_cache(); if (cache->IsUndefined()) { diff --git a/src/codegen.h b/src/codegen.h index 08b2e11ec..48566b202 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -330,25 +330,30 @@ class CompareStub: public CodeStub { class CEntryStub : public CodeStub { 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: - void GenerateBody(MacroAssembler* masm, bool is_debug_break); + private: void GenerateCore(MacroAssembler* masm, Label* throw_normal_exception, Label* throw_termination_exception, Label* throw_out_of_memory_exception, - ExitFrame::Mode mode, bool do_gc, bool always_allocate_scope); void GenerateThrowTOS(MacroAssembler* masm); void GenerateThrowUncatchable(MacroAssembler* masm, UncatchableExceptionType type); - private: + // Number of pointers/values returned. - int result_size_; + int const result_size_; + ExitFrame::Mode const mode_; + + // Minor key encoding + class ExitFrameModeBits: public BitField {}; + class IndirectResultBits: public BitField {}; Major MajorKey() { return CEntry; } // Minor key must differ if different result_size_ values means different @@ -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 { public: DebugerStatementStub() { } diff --git a/src/frames.cc b/src/frames.cc index f6c07bd97..e56a2c83e 100644 --- a/src/frames.cc +++ b/src/frames.cc @@ -410,7 +410,7 @@ Object*& ExitFrame::code_slot() const { Code* ExitFrame::code() const { Object* code = code_slot(); if (code->IsSmi()) { - return Heap::c_entry_debug_break_code(); + return Heap::debugger_statement_code(); } else { return Code::cast(code); } diff --git a/src/heap.cc b/src/heap.cc index 97d863c76..882900163 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -1500,7 +1500,7 @@ void Heap::CreateRegExpCEntryStub() { void Heap::CreateCEntryDebugBreakStub() { DebugerStatementStub stub; - set_c_entry_debug_break_code(*stub.GetCode()); + set_debugger_statement_code(*stub.GetCode()); } @@ -1527,7 +1527,7 @@ void Heap::CreateFixedStubs() { // c_entry_code_ = *stub.GetCode(); // } // { DebugerStatementStub stub; - // c_entry_debug_break_code_ = *stub.GetCode(); + // debugger_statement_code_ = *stub.GetCode(); // } // To workaround the problem, make separate functions without inlining. Heap::CreateCEntryStub(); diff --git a/src/heap.h b/src/heap.h index 0dd20c086..cbf0b73ed 100644 --- a/src/heap.h +++ b/src/heap.h @@ -101,7 +101,7 @@ namespace internal { V(Code, js_entry_code, JsEntryCode) \ V(Code, js_construct_entry_code, JsConstructEntryCode) \ 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, single_character_string_cache, SingleCharacterStringCache) \ V(FixedArray, natives_source_cache, NativesSourceCache) \ diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 0e2cc0194..1b4f098a1 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -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) { // eax holds the exception. @@ -9189,7 +9182,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, Label* throw_normal_exception, Label* throw_termination_exception, Label* throw_out_of_memory_exception, - ExitFrame::Mode mode, bool do_gc, bool always_allocate_scope) { // eax: result parameter for PerformGC, if any @@ -9199,6 +9191,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, // edi: number of arguments including receiver (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) { __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); @@ -9239,7 +9233,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, __ j(zero, &failure_returned, not_taken); // Exit the JavaScript to C++ exit frame. - __ LeaveExitFrame(mode); + __ LeaveExitFrame(mode_); __ ret(0); // Handling of failure. @@ -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 // ebx: pointer to C function (C callee-saved) // ebp: frame pointer (restored after C call) @@ -9338,12 +9332,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { // of a proper result. The builtin entry handles this by performing // 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++. - __ EnterExitFrame(mode); + __ EnterExitFrame(mode_); // eax: result parameter for PerformGC, if any (setup below) // ebx: pointer to builtin function (C callee-saved) @@ -9361,7 +9351,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, false, false); @@ -9370,7 +9359,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, false); @@ -9381,7 +9369,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, true); diff --git a/src/ia32/debug-ia32.cc b/src/ia32/debug-ia32.cc index d6851a9c7..1f34b3026 100644 --- a/src/ia32/debug-ia32.cc +++ b/src/ia32/debug-ia32.cc @@ -94,7 +94,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ Set(eax, Immediate(0)); // no arguments __ mov(ebx, Immediate(ExternalReference::debug_break())); - CEntryStub ceb(1); + CEntryStub ceb(1, ExitFrame::MODE_DEBUG); __ CallStub(&ceb); // Restore the register values containing object pointers from the expression diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 9b5f160e8..0fb0ce2da 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -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) { // Check that stack should contain next handler, frame pointer, state and // return address in that order. @@ -7380,7 +7365,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, Label* throw_normal_exception, Label* throw_termination_exception, Label* throw_out_of_memory_exception, - ExitFrame::Mode mode, bool do_gc, bool always_allocate_scope) { // rax: result parameter for PerformGC, if any. @@ -7392,6 +7376,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, // This pointer is reused in LeaveExitFrame(), so it is stored in a // 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) { // Pass failure code returned from last attempt as first argument to GC. #ifdef _WIN64 @@ -7463,7 +7451,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, __ j(zero, &failure_returned); // Exit the JavaScript to C++ exit frame. - __ LeaveExitFrame(mode, result_size_); + __ LeaveExitFrame(mode_, result_size_); __ ret(0); // Handling of failure. @@ -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 // rbx: pointer to C function (C callee-saved) // rbp: frame pointer of calling JS frame (restored after C call) @@ -7619,12 +7607,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { // this by performing a garbage collection and retrying the // builtin once. - ExitFrame::Mode mode = is_debug_break ? - ExitFrame::MODE_DEBUG : - ExitFrame::MODE_NORMAL; - // 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. // On entry to code generated by GenerateCore, it must hold @@ -7647,7 +7631,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, false, false); @@ -7656,7 +7639,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, false); @@ -7667,7 +7649,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { &throw_normal_exception, &throw_termination_exception, &throw_out_of_memory_exception, - mode, true, true); diff --git a/src/x64/debug-x64.cc b/src/x64/debug-x64.cc index 019e558b2..261b16c01 100644 --- a/src/x64/debug-x64.cc +++ b/src/x64/debug-x64.cc @@ -68,7 +68,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ xor_(rax, rax); // No arguments (argc == 0). __ movq(rbx, ExternalReference::debug_break()); - CEntryStub ceb(1); + CEntryStub ceb(1, ExitFrame::MODE_DEBUG); __ CallStub(&ceb); // Restore the register values containing object pointers from the expression