Revision: 10126
Author: [email protected]
Date: Thu Dec 1 06:19:34 2011
Log: Insert proper padding between lazy deoptimization points and
safepoints.
On x64 we need 13 bytes for patching the call for lazy deopt. We have to
make sure that patching does not overwrite the code at the safepoint.
BUG=v8:1847
Review URL: http://codereview.chromium.org/8775009
http://code.google.com/p/v8/source/detail?r=10126
Modified:
/branches/bleeding_edge/src/x64/lithium-codegen-x64.cc
/branches/bleeding_edge/src/x64/lithium-codegen-x64.h
=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Thu Dec 1
01:54:05 2011
+++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Thu Dec 1
06:19:34 2011
@@ -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
=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.h Fri Nov 25
05:15:31 2011
+++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.h Thu Dec 1
06:19:34 2011
@@ -305,7 +305,7 @@
Address address;
};
- void EnsureSpaceForLazyDeopt();
+ void EnsureSpaceForLazyDeopt(int space_needed);
LChunk* const chunk_;
MacroAssembler* const masm_;
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev