Index: src/x64/lithium-codegen-x64.cc |
=================================================================== |
--- src/x64/lithium-codegen-x64.cc (revision 10131) |
+++ src/x64/lithium-codegen-x64.cc (working copy) |
@@ -4263,21 +4263,38 @@ |
LStackCheck* instr_; |
}; |
- DeferredStackCheck* deferred_stack_check = |
- new DeferredStackCheck(this, instr); |
- __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
- __ j(below, deferred_stack_check->entry()); |
- EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
- __ bind(instr->done_label()); |
- deferred_stack_check->SetExit(instr->done_label()); |
+ ASSERT(instr->HasEnvironment()); |
+ LEnvironment* env = instr->environment(); |
// There is no LLazyBailout instruction for stack-checks. We have to |
// prepare for lazy deoptimization explicitly here. |
- ASSERT(instr->HasEnvironment()); |
- LEnvironment* env = instr->environment(); |
- RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
- // Don't record a deoptimization index for the safepoint here. |
- // This will be done explicitly when emitting call and the safepoint in |
- // the deferred code. |
+ if (instr->hydrogen()->is_function_entry()) { |
+ // Perform stack overflow check. |
+ Label done; |
+ __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
+ __ j(above_equal, &done, Label::kNear); |
+ StackCheckStub stub; |
+ CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
+ last_lazy_deopt_pc_ = masm()->pc_offset(); |
+ __ bind(&done); |
+ RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
+ safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
+ } else { |
+ ASSERT(instr->hydrogen()->is_backwards_branch()); |
+ // Perform stack overflow check if this goto needs it before jumping. |
+ DeferredStackCheck* deferred_stack_check = |
+ new DeferredStackCheck(this, instr); |
+ __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
+ __ j(below, deferred_stack_check->entry()); |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
+ last_lazy_deopt_pc_ = masm()->pc_offset(); |
+ __ bind(instr->done_label()); |
+ deferred_stack_check->SetExit(instr->done_label()); |
+ RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
+ // Don't record a deoptimization index for the safepoint here. |
+ // This will be done explicitly when emitting call and the safepoint in |
+ // the deferred code. |
+ } |
} |