From d2192c60baf188f90ccf3ace7a10e4b344997eed Mon Sep 17 00:00:00 2001 From: "balazs.kilvady" Date: Thu, 5 Mar 2015 11:26:49 -0800 Subject: [PATCH] MIPS: [turbofan] Implement throwing exceptions into TurboFan code. Port 1382879f29bd71c36aeda2421e867c4cdd232a0d Original commit message: This extends the stack unwinding logic to respect optimized frames and perform a lookup in the handler table to find handlers. It also contains fixes to the API call stubs to allow a stack walk while promoting scheduled exceptions. BUG= Review URL: https://codereview.chromium.org/988463002 Cr-Commit-Position: refs/heads/master@{#27027} --- src/mips/code-stubs-mips.cc | 26 ++++++++++++-------------- src/mips64/code-stubs-mips64.cc | 27 +++++++++++++-------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index edb80ca054..91b6f3ce2f 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -5036,7 +5036,6 @@ static void CallApiFunctionAndReturn( } Label promote_scheduled_exception; - Label exception_handled; Label delete_allocated_handles; Label leave_exit_frame; Label return_value_loaded; @@ -5057,13 +5056,8 @@ static void CallApiFunctionAndReturn( __ lw(at, MemOperand(s3, kLimitOffset)); __ Branch(&delete_allocated_handles, ne, s1, Operand(at)); - // Check if the function scheduled an exception. + // Leave the API exit frame. __ bind(&leave_exit_frame); - __ LoadRoot(t0, Heap::kTheHoleValueRootIndex); - __ li(at, Operand(ExternalReference::scheduled_exception_address(isolate))); - __ lw(t1, MemOperand(at)); - __ Branch(&promote_scheduled_exception, ne, t0, Operand(t1)); - __ bind(&exception_handled); bool restore_context = context_restore_operand != NULL; if (restore_context) { @@ -5076,16 +5070,20 @@ static void CallApiFunctionAndReturn( } else { __ li(s0, Operand(stack_space)); } - __ LeaveExitFrame(false, s0, !restore_context, EMIT_RETURN, + __ LeaveExitFrame(false, s0, !restore_context, NO_EMIT_RETURN, stack_space_offset != kInvalidStackOffset); + // Check if the function scheduled an exception. + __ LoadRoot(t0, Heap::kTheHoleValueRootIndex); + __ li(at, Operand(ExternalReference::scheduled_exception_address(isolate))); + __ lw(t1, MemOperand(at)); + __ Branch(&promote_scheduled_exception, ne, t0, Operand(t1)); + + __ Ret(); + + // Re-throw by promoting a scheduled exception. __ bind(&promote_scheduled_exception); - { - FrameScope frame(masm, StackFrame::INTERNAL); - __ CallExternalReference( - ExternalReference(Runtime::kPromoteScheduledException, isolate), 0); - } - __ jmp(&exception_handled); + __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); // HandleScope limit has changed. Delete allocated extensions. __ bind(&delete_allocated_handles); diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc index a9f04dffc5..9127f99ea3 100644 --- a/src/mips64/code-stubs-mips64.cc +++ b/src/mips64/code-stubs-mips64.cc @@ -5081,7 +5081,6 @@ static void CallApiFunctionAndReturn( } Label promote_scheduled_exception; - Label exception_handled; Label delete_allocated_handles; Label leave_exit_frame; Label return_value_loaded; @@ -5102,13 +5101,8 @@ static void CallApiFunctionAndReturn( __ ld(at, MemOperand(s3, kLimitOffset)); __ Branch(&delete_allocated_handles, ne, s1, Operand(at)); - // Check if the function scheduled an exception. + // Leave the API exit frame. __ bind(&leave_exit_frame); - __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); - __ li(at, Operand(ExternalReference::scheduled_exception_address(isolate))); - __ ld(a5, MemOperand(at)); - __ Branch(&promote_scheduled_exception, ne, a4, Operand(a5)); - __ bind(&exception_handled); bool restore_context = context_restore_operand != NULL; if (restore_context) { @@ -5120,15 +5114,20 @@ static void CallApiFunctionAndReturn( } else { __ li(s0, Operand(stack_space)); } - __ LeaveExitFrame(false, s0, !restore_context, EMIT_RETURN, + __ LeaveExitFrame(false, s0, !restore_context, NO_EMIT_RETURN, stack_space_offset != kInvalidStackOffset); + + // Check if the function scheduled an exception. + __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); + __ li(at, Operand(ExternalReference::scheduled_exception_address(isolate))); + __ ld(a5, MemOperand(at)); + __ Branch(&promote_scheduled_exception, ne, a4, Operand(a5)); + + __ Ret(); + + // Re-throw by promoting a scheduled exception. __ bind(&promote_scheduled_exception); - { - FrameScope frame(masm, StackFrame::INTERNAL); - __ CallExternalReference( - ExternalReference(Runtime::kPromoteScheduledException, isolate), 0); - } - __ jmp(&exception_handled); + __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); // HandleScope limit has changed. Delete allocated extensions. __ bind(&delete_allocated_handles);