Fix handling of last position for lazy deopt on X64, ARM and MIPS.

BUG=
R=jkummerow@chromium.org

Review URL: https://codereview.chromium.org/140773002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18642 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
titzer@chromium.org 2014-01-16 11:58:06 +00:00
parent 76284bdcad
commit ff885a1114
3 changed files with 36 additions and 44 deletions

View File

@ -720,7 +720,6 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
LInstruction* instr, LInstruction* instr,
SafepointMode safepoint_mode, SafepointMode safepoint_mode,
TargetAddressStorageMode storage_mode) { TargetAddressStorageMode storage_mode) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
ASSERT(instr != NULL); ASSERT(instr != NULL);
// Block literal pool emission to ensure nop indicating no inlined smi code // Block literal pool emission to ensure nop indicating no inlined smi code
// is in the correct position. // is in the correct position.
@ -5579,26 +5578,27 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) {
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
if (info()->IsStub()) return; if (!info()->IsStub()) {
// Ensure that we have enough space after the previous lazy-bailout // Ensure that we have enough space after the previous lazy-bailout
// instruction for patching the code here. // instruction for patching the code here.
int current_pc = masm()->pc_offset(); int current_pc = masm()->pc_offset();
if (current_pc < last_lazy_deopt_pc_ + space_needed) { if (current_pc < last_lazy_deopt_pc_ + space_needed) {
// Block literal pool emission for duration of padding. // Block literal pool emission for duration of padding.
Assembler::BlockConstPoolScope block_const_pool(masm()); Assembler::BlockConstPoolScope block_const_pool(masm());
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
ASSERT_EQ(0, padding_size % Assembler::kInstrSize); ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
while (padding_size > 0) { while (padding_size > 0) {
__ nop(); __ nop();
padding_size -= Assembler::kInstrSize; padding_size -= Assembler::kInstrSize;
}
} }
} }
last_lazy_deopt_pc_ = masm()->pc_offset();
} }
void LCodeGen::DoLazyBailout(LLazyBailout* instr) { void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
ASSERT(instr->HasEnvironment()); ASSERT(instr->HasEnvironment());
LEnvironment* env = instr->environment(); LEnvironment* env = instr->environment();
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
@ -5673,7 +5673,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
RelocInfo::CODE_TARGET, RelocInfo::CODE_TARGET,
instr); instr);
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(&done); __ bind(&done);
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
@ -5686,7 +5685,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
__ cmp(sp, Operand(ip)); __ cmp(sp, Operand(ip));
__ b(lo, deferred_stack_check->entry()); __ b(lo, deferred_stack_check->entry());
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(instr->done_label()); __ bind(instr->done_label());
deferred_stack_check->SetExit(instr->done_label()); deferred_stack_check->SetExit(instr->done_label());
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);

View File

@ -692,7 +692,6 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
RelocInfo::Mode mode, RelocInfo::Mode mode,
LInstruction* instr, LInstruction* instr,
SafepointMode safepoint_mode) { SafepointMode safepoint_mode) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
ASSERT(instr != NULL); ASSERT(instr != NULL);
__ Call(code, mode); __ Call(code, mode);
RecordSafepointWithLazyDeopt(instr, safepoint_mode); RecordSafepointWithLazyDeopt(instr, safepoint_mode);
@ -5575,24 +5574,25 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) {
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
if (info()->IsStub()) return; if (!info()->IsStub()) {
// Ensure that we have enough space after the previous lazy-bailout // Ensure that we have enough space after the previous lazy-bailout
// instruction for patching the code here. // instruction for patching the code here.
int current_pc = masm()->pc_offset(); int current_pc = masm()->pc_offset();
if (current_pc < last_lazy_deopt_pc_ + space_needed) { if (current_pc < last_lazy_deopt_pc_ + space_needed) {
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
ASSERT_EQ(0, padding_size % Assembler::kInstrSize); ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
while (padding_size > 0) { while (padding_size > 0) {
__ nop(); __ nop();
padding_size -= Assembler::kInstrSize; padding_size -= Assembler::kInstrSize;
}
} }
} }
last_lazy_deopt_pc_ = masm()->pc_offset();
} }
void LCodeGen::DoLazyBailout(LLazyBailout* instr) { void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
ASSERT(instr->HasEnvironment()); ASSERT(instr->HasEnvironment());
LEnvironment* env = instr->environment(); LEnvironment* env = instr->environment();
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
@ -5665,7 +5665,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
RelocInfo::CODE_TARGET, RelocInfo::CODE_TARGET,
instr); instr);
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(&done); __ bind(&done);
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
@ -5677,7 +5676,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
__ LoadRoot(at, Heap::kStackLimitRootIndex); __ LoadRoot(at, Heap::kStackLimitRootIndex);
__ Branch(deferred_stack_check->entry(), lo, sp, Operand(at)); __ Branch(deferred_stack_check->entry(), lo, sp, Operand(at));
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(instr->done_label()); __ bind(instr->done_label());
deferred_stack_check->SetExit(instr->done_label()); deferred_stack_check->SetExit(instr->done_label());
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);

View File

@ -50,9 +50,7 @@ class SafepointGenerator V8_FINAL : public CallWrapper {
deopt_mode_(mode) { } deopt_mode_(mode) { }
virtual ~SafepointGenerator() {} virtual ~SafepointGenerator() {}
virtual void BeforeCall(int call_size) const V8_OVERRIDE { virtual void BeforeCall(int call_size) const V8_OVERRIDE {}
codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size);
}
virtual void AfterCall() const V8_OVERRIDE { virtual void AfterCall() const V8_OVERRIDE {
codegen_->RecordSafepoint(pointers_, deopt_mode_); codegen_->RecordSafepoint(pointers_, deopt_mode_);
@ -602,7 +600,6 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
LInstruction* instr, LInstruction* instr,
SafepointMode safepoint_mode, SafepointMode safepoint_mode,
int argc) { int argc) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - masm()->CallSize(code));
ASSERT(instr != NULL); ASSERT(instr != NULL);
__ call(code, mode); __ call(code, mode);
RecordSafepointWithLazyDeopt(instr, safepoint_mode, argc); RecordSafepointWithLazyDeopt(instr, safepoint_mode, argc);
@ -5414,20 +5411,21 @@ void LCodeGen::EmitIsConstructCall(Register temp) {
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
if (info()->IsStub()) return; if (!info()->IsStub()) {
// Ensure that we have enough space after the previous lazy-bailout // Ensure that we have enough space after the previous lazy-bailout
// instruction for patching the code here. // instruction for patching the code here.
int current_pc = masm()->pc_offset(); int current_pc = masm()->pc_offset();
if (current_pc < last_lazy_deopt_pc_ + space_needed) { if (current_pc < last_lazy_deopt_pc_ + space_needed) {
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
__ Nop(padding_size); __ Nop(padding_size);
}
} }
last_lazy_deopt_pc_ = masm()->pc_offset();
} }
void LCodeGen::DoLazyBailout(LLazyBailout* instr) { void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
ASSERT(instr->HasEnvironment()); ASSERT(instr->HasEnvironment());
LEnvironment* env = instr->environment(); LEnvironment* env = instr->environment();
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
@ -5500,7 +5498,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
RelocInfo::CODE_TARGET, RelocInfo::CODE_TARGET,
instr); instr);
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(&done); __ bind(&done);
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
@ -5512,7 +5509,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
__ CompareRoot(rsp, Heap::kStackLimitRootIndex); __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
__ j(below, deferred_stack_check->entry()); __ j(below, deferred_stack_check->entry());
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
last_lazy_deopt_pc_ = masm()->pc_offset();
__ bind(instr->done_label()); __ bind(instr->done_label());
deferred_stack_check->SetExit(instr->done_label()); deferred_stack_check->SetExit(instr->done_label());
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);