| 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(
|
|
|