Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 1b78bae30573e12b385cfbb24720aaef89561faf..4f799d43192d68ef0d19af904483833ba9671f96 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -968,24 +968,19 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, |
if (FLAG_enable_ool_constant_pool) { |
// For the bottommost output frame the constant pool pointer can be gotten |
- // from the input frame. For subsequent output frames, it can be gotten from |
- // the function's code. |
- Register constant_pool_reg = |
- JavaScriptFrame::constant_pool_pointer_register(); |
+ // from the input frame. For subsequent output frames, it can be read from |
+ // the previous frame. |
output_offset -= kPointerSize; |
input_offset -= kPointerSize; |
if (is_bottommost) { |
value = input_->GetFrameSlot(input_offset); |
} else { |
- value = reinterpret_cast<intptr_t>( |
- function->shared()->code()->constant_pool()); |
+ value = output_[frame_index - 1]->GetConstantPool(); |
} |
- output_frame->SetFrameSlot(output_offset, value); |
- output_frame->SetConstantPool(value); |
- if (is_topmost) output_frame->SetRegister(constant_pool_reg.code(), value); |
+ output_frame->SetCallerConstantPool(output_offset, value); |
if (trace_scope_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
- V8PRIxPTR "; constant_pool\n", |
+ V8PRIxPTR "; caller's constant_pool\n", |
top_address + output_offset, output_offset, value); |
} |
} |
@@ -1043,6 +1038,18 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, |
intptr_t pc_value = reinterpret_cast<intptr_t>(start + pc_offset); |
output_frame->SetPc(pc_value); |
+ // Update constant pool. |
+ if (FLAG_enable_ool_constant_pool) { |
+ intptr_t constant_pool_value = |
+ reinterpret_cast<intptr_t>(non_optimized_code->constant_pool()); |
+ output_frame->SetConstantPool(constant_pool_value); |
+ if (is_topmost) { |
+ Register constant_pool_reg = |
+ JavaScriptFrame::constant_pool_pointer_register(); |
+ output_frame->SetRegister(constant_pool_reg.code(), constant_pool_value); |
+ } |
+ } |
+ |
FullCodeGenerator::State state = |
FullCodeGenerator::StateField::decode(pc_and_state); |
output_frame->SetState(Smi::FromInt(state)); |
@@ -1126,15 +1133,14 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, |
} |
if (FLAG_enable_ool_constant_pool) { |
- // A marker value is used in place of the constant pool. |
+ // Read the caller's constant pool from the previous frame. |
output_offset -= kPointerSize; |
- intptr_t constant_pool = reinterpret_cast<intptr_t>( |
- Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
- output_frame->SetFrameSlot(output_offset, constant_pool); |
+ value = output_[frame_index - 1]->GetConstantPool(); |
+ output_frame->SetCallerConstantPool(output_offset, value); |
if (trace_scope_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
- V8PRIxPTR " ; constant_pool (adaptor sentinel)\n", |
- top_address + output_offset, output_offset, constant_pool); |
+ V8PRIxPTR "; caller's constant_pool\n", |
+ top_address + output_offset, output_offset, value); |
} |
} |
@@ -1181,6 +1187,11 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, |
adaptor_trampoline->instruction_start() + |
isolate_->heap()->arguments_adaptor_deopt_pc_offset()->value()); |
output_frame->SetPc(pc_value); |
+ if (FLAG_enable_ool_constant_pool) { |
+ intptr_t constant_pool_value = |
+ reinterpret_cast<intptr_t>(adaptor_trampoline->constant_pool()); |
+ output_frame->SetConstantPool(constant_pool_value); |
+ } |
} |
@@ -1256,13 +1267,13 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, |
} |
if (FLAG_enable_ool_constant_pool) { |
- // The constant pool pointer can be gotten from the previous frame. |
+ // Read the caller's constant pool from the previous frame. |
output_offset -= kPointerSize; |
value = output_[frame_index - 1]->GetConstantPool(); |
- output_frame->SetFrameSlot(output_offset, value); |
+ output_frame->SetCallerConstantPool(output_offset, value); |
if (trace_scope_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
- V8PRIxPTR " ; constant pool\n", |
+ V8PRIxPTR " ; caller's constant pool\n", |
top_address + output_offset, output_offset, value); |
} |
} |
@@ -1343,6 +1354,11 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, |
construct_stub->instruction_start() + |
isolate_->heap()->construct_stub_deopt_pc_offset()->value()); |
output_frame->SetPc(pc); |
+ if (FLAG_enable_ool_constant_pool) { |
+ intptr_t constant_pool_value = |
+ reinterpret_cast<intptr_t>(construct_stub->constant_pool()); |
+ output_frame->SetConstantPool(constant_pool_value); |
+ } |
} |
@@ -1414,13 +1430,13 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, |
} |
if (FLAG_enable_ool_constant_pool) { |
- // The constant pool pointer can be gotten from the previous frame. |
+ // Read the caller's constant pool from the previous frame. |
output_offset -= kPointerSize; |
value = output_[frame_index - 1]->GetConstantPool(); |
- output_frame->SetFrameSlot(output_offset, value); |
+ output_frame->SetCallerConstantPool(output_offset, value); |
if (trace_scope_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
- V8PRIxPTR " ; constant pool\n", |
+ V8PRIxPTR " ; caller's constant pool\n", |
top_address + output_offset, output_offset, value); |
} |
} |
@@ -1482,6 +1498,11 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, |
intptr_t pc = reinterpret_cast<intptr_t>( |
accessor_stub->instruction_start() + offset->value()); |
output_frame->SetPc(pc); |
+ if (FLAG_enable_ool_constant_pool) { |
+ intptr_t constant_pool_value = |
+ reinterpret_cast<intptr_t>(accessor_stub->constant_pool()); |
+ output_frame->SetConstantPool(constant_pool_value); |
+ } |
} |
@@ -1585,17 +1606,14 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, |
} |
if (FLAG_enable_ool_constant_pool) { |
- // The constant pool pointer can be gotten from the input frame. |
- Register constant_pool_pointer_register = |
- StubFailureTrampolineFrame::constant_pool_pointer_register(); |
+ // Read the caller's constant pool from the input frame. |
input_frame_offset -= kPointerSize; |
value = input_->GetFrameSlot(input_frame_offset); |
- output_frame->SetRegister(constant_pool_pointer_register.code(), value); |
output_frame_offset -= kPointerSize; |
- output_frame->SetFrameSlot(output_frame_offset, value); |
+ output_frame->SetCallerConstantPool(output_frame_offset, value); |
if (trace_scope_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
- V8PRIxPTR " ; constant_pool_pointer\n", |
+ V8PRIxPTR " ; caller's constant_pool\n", |
top_address + output_frame_offset, output_frame_offset, value); |
} |
} |
@@ -1729,6 +1747,14 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, |
ASSERT(trampoline != NULL); |
output_frame->SetPc(reinterpret_cast<intptr_t>( |
trampoline->instruction_start())); |
+ if (FLAG_enable_ool_constant_pool) { |
+ Register constant_pool_reg = |
+ StubFailureTrampolineFrame::constant_pool_pointer_register(); |
+ intptr_t constant_pool_value = |
+ reinterpret_cast<intptr_t>(trampoline->constant_pool()); |
+ output_frame->SetConstantPool(constant_pool_value); |
+ output_frame->SetRegister(constant_pool_reg.code(), constant_pool_value); |
+ } |
output_frame->SetState(Smi::FromInt(FullCodeGenerator::NO_REGISTERS)); |
Code* notify_failure = NotifyStubFailureBuiltin(); |
output_frame->SetContinuation( |