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:
parent
76284bdcad
commit
ff885a1114
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user