Index: src/x64/lithium-codegen-x64.cc |
=================================================================== |
--- src/x64/lithium-codegen-x64.cc (revision 10122) |
+++ src/x64/lithium-codegen-x64.cc (working copy) |
@@ -49,7 +49,9 @@ |
deopt_mode_(mode) { } |
virtual ~SafepointGenerator() { } |
- virtual void BeforeCall(int call_size) const { } |
+ virtual void BeforeCall(int call_size) const { |
+ codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size); |
+ } |
virtual void AfterCall() const { |
codegen_->RecordSafepoint(pointers_, deopt_mode_); |
@@ -241,7 +243,7 @@ |
instr->CompileToNative(this); |
} |
} |
- EnsureSpaceForLazyDeopt(); |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
return !is_aborted(); |
} |
@@ -439,6 +441,7 @@ |
LInstruction* instr, |
SafepointMode safepoint_mode, |
int argc) { |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - masm()->CallSize(code)); |
ASSERT(instr != NULL); |
LPointerMap* pointers = instr->pointer_map(); |
RecordPosition(pointers->position()); |
@@ -4176,25 +4179,24 @@ |
} |
-void LCodeGen::EnsureSpaceForLazyDeopt() { |
+void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { |
// Ensure that we have enough space after the previous lazy-bailout |
// instruction for patching the code here. |
int current_pc = masm()->pc_offset(); |
- int patch_size = Deoptimizer::patch_size(); |
- if (current_pc < last_lazy_deopt_pc_ + patch_size) { |
- int padding_size = last_lazy_deopt_pc_ + patch_size - current_pc; |
+ if (current_pc < last_lazy_deopt_pc_ + space_needed) { |
+ int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
while (padding_size > 0) { |
int nop_size = padding_size > 9 ? 9 : padding_size; |
__ nop(nop_size); |
padding_size -= nop_size; |
} |
} |
- last_lazy_deopt_pc_ = masm()->pc_offset(); |
} |
void LCodeGen::DoLazyBailout(LLazyBailout* instr) { |
- EnsureSpaceForLazyDeopt(); |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
+ last_lazy_deopt_pc_ = masm()->pc_offset(); |
ASSERT(instr->HasEnvironment()); |
LEnvironment* env = instr->environment(); |
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
@@ -4265,7 +4267,7 @@ |
new DeferredStackCheck(this, instr); |
__ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
__ j(below, deferred_stack_check->entry()); |
- EnsureSpaceForLazyDeopt(); |
+ EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |
__ bind(instr->done_label()); |
deferred_stack_check->SetExit(instr->done_label()); |
// There is no LLazyBailout instruction for stack-checks. We have to |