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,
|
||||
SafepointMode safepoint_mode,
|
||||
TargetAddressStorageMode storage_mode) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
|
||||
ASSERT(instr != NULL);
|
||||
// Block literal pool emission to ensure nop indicating no inlined smi code
|
||||
// is in the correct position.
|
||||
@ -5579,26 +5578,27 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) {
|
||||
|
||||
|
||||
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
|
||||
if (info()->IsStub()) return;
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
// Block literal pool emission for duration of padding.
|
||||
Assembler::BlockConstPoolScope block_const_pool(masm());
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
|
||||
while (padding_size > 0) {
|
||||
__ nop();
|
||||
padding_size -= Assembler::kInstrSize;
|
||||
if (!info()->IsStub()) {
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
// Block literal pool emission for duration of padding.
|
||||
Assembler::BlockConstPoolScope block_const_pool(masm());
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
|
||||
while (padding_size > 0) {
|
||||
__ nop();
|
||||
padding_size -= Assembler::kInstrSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
ASSERT(instr->HasEnvironment());
|
||||
LEnvironment* env = instr->environment();
|
||||
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
|
||||
@ -5673,7 +5673,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
||||
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());
|
||||
@ -5686,7 +5685,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
||||
__ cmp(sp, Operand(ip));
|
||||
__ b(lo, 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);
|
||||
|
@ -692,7 +692,6 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
|
||||
RelocInfo::Mode mode,
|
||||
LInstruction* instr,
|
||||
SafepointMode safepoint_mode) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
|
||||
ASSERT(instr != NULL);
|
||||
__ Call(code, mode);
|
||||
RecordSafepointWithLazyDeopt(instr, safepoint_mode);
|
||||
@ -5575,24 +5574,25 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) {
|
||||
|
||||
|
||||
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
|
||||
if (info()->IsStub()) return;
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
|
||||
while (padding_size > 0) {
|
||||
__ nop();
|
||||
padding_size -= Assembler::kInstrSize;
|
||||
if (!info()->IsStub()) {
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
ASSERT_EQ(0, padding_size % Assembler::kInstrSize);
|
||||
while (padding_size > 0) {
|
||||
__ nop();
|
||||
padding_size -= Assembler::kInstrSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
ASSERT(instr->HasEnvironment());
|
||||
LEnvironment* env = instr->environment();
|
||||
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
|
||||
@ -5665,7 +5665,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
||||
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());
|
||||
@ -5677,7 +5676,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
||||
__ LoadRoot(at, Heap::kStackLimitRootIndex);
|
||||
__ Branch(deferred_stack_check->entry(), lo, sp, Operand(at));
|
||||
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);
|
||||
|
@ -50,9 +50,7 @@ class SafepointGenerator V8_FINAL : public CallWrapper {
|
||||
deopt_mode_(mode) { }
|
||||
virtual ~SafepointGenerator() {}
|
||||
|
||||
virtual void BeforeCall(int call_size) const V8_OVERRIDE {
|
||||
codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size);
|
||||
}
|
||||
virtual void BeforeCall(int call_size) const V8_OVERRIDE {}
|
||||
|
||||
virtual void AfterCall() const V8_OVERRIDE {
|
||||
codegen_->RecordSafepoint(pointers_, deopt_mode_);
|
||||
@ -602,7 +600,6 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
|
||||
LInstruction* instr,
|
||||
SafepointMode safepoint_mode,
|
||||
int argc) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - masm()->CallSize(code));
|
||||
ASSERT(instr != NULL);
|
||||
__ call(code, mode);
|
||||
RecordSafepointWithLazyDeopt(instr, safepoint_mode, argc);
|
||||
@ -5414,20 +5411,21 @@ void LCodeGen::EmitIsConstructCall(Register temp) {
|
||||
|
||||
|
||||
void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
|
||||
if (info()->IsStub()) return;
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
__ Nop(padding_size);
|
||||
if (!info()->IsStub()) {
|
||||
// Ensure that we have enough space after the previous lazy-bailout
|
||||
// instruction for patching the code here.
|
||||
int current_pc = masm()->pc_offset();
|
||||
if (current_pc < last_lazy_deopt_pc_ + space_needed) {
|
||||
int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
|
||||
__ Nop(padding_size);
|
||||
}
|
||||
}
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
|
||||
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
|
||||
last_lazy_deopt_pc_ = masm()->pc_offset();
|
||||
ASSERT(instr->HasEnvironment());
|
||||
LEnvironment* env = instr->environment();
|
||||
RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
|
||||
@ -5500,7 +5498,6 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
||||
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());
|
||||
@ -5512,7 +5509,6 @@ void LCodeGen::DoStackCheck(LStackCheck* 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);
|
||||
|
Loading…
Reference in New Issue
Block a user