Index: src/x64/deoptimizer-x64.cc |
diff --git a/src/x64/deoptimizer-x64.cc b/src/x64/deoptimizer-x64.cc |
index bb8acce28d834f90247bd0317f7cf30f2fe7cb00..303b756cacdbd0ef3350e51a8831de4b68f0e45d 100644 |
--- a/src/x64/deoptimizer-x64.cc |
+++ b/src/x64/deoptimizer-x64.cc |
@@ -163,173 +163,6 @@ Deoptimizer::InterruptPatchState Deoptimizer::GetInterruptPatchState( |
#endif // DEBUG |
-static int LookupBailoutId(DeoptimizationInputData* data, BailoutId ast_id) { |
- ByteArray* translations = data->TranslationByteArray(); |
- int length = data->DeoptCount(); |
- for (int i = 0; i < length; i++) { |
- if (data->AstId(i) == ast_id) { |
- TranslationIterator it(translations, data->TranslationIndex(i)->value()); |
- int value = it.Next(); |
- ASSERT(Translation::BEGIN == static_cast<Translation::Opcode>(value)); |
- // Read the number of frames. |
- value = it.Next(); |
- if (value == 1) return i; |
- } |
- } |
- UNREACHABLE(); |
- return -1; |
-} |
- |
- |
-void Deoptimizer::DoComputeOsrOutputFrame() { |
- DeoptimizationInputData* data = DeoptimizationInputData::cast( |
- compiled_code_->deoptimization_data()); |
- unsigned ast_id = data->OsrAstId()->value(); |
- // TODO(kasperl): This should not be the bailout_id_. It should be |
- // the ast id. Confusing. |
- ASSERT(bailout_id_ == ast_id); |
- |
- int bailout_id = LookupBailoutId(data, BailoutId(ast_id)); |
- unsigned translation_index = data->TranslationIndex(bailout_id)->value(); |
- ByteArray* translations = data->TranslationByteArray(); |
- |
- TranslationIterator iterator(translations, translation_index); |
- Translation::Opcode opcode = |
- static_cast<Translation::Opcode>(iterator.Next()); |
- ASSERT(Translation::BEGIN == opcode); |
- USE(opcode); |
- int count = iterator.Next(); |
- iterator.Skip(1); // Drop JS frame count. |
- ASSERT(count == 1); |
- USE(count); |
- |
- opcode = static_cast<Translation::Opcode>(iterator.Next()); |
- USE(opcode); |
- ASSERT(Translation::JS_FRAME == opcode); |
- unsigned node_id = iterator.Next(); |
- USE(node_id); |
- ASSERT(node_id == ast_id); |
- int closure_id = iterator.Next(); |
- USE(closure_id); |
- ASSERT_EQ(Translation::kSelfLiteralId, closure_id); |
- unsigned height = iterator.Next(); |
- unsigned height_in_bytes = height * kPointerSize; |
- USE(height_in_bytes); |
- |
- unsigned fixed_size = ComputeFixedSize(function_); |
- unsigned input_frame_size = input_->GetFrameSize(); |
- ASSERT(fixed_size + height_in_bytes == input_frame_size); |
- |
- unsigned stack_slot_size = compiled_code_->stack_slots() * kPointerSize; |
- unsigned outgoing_height = data->ArgumentsStackHeight(bailout_id)->value(); |
- unsigned outgoing_size = outgoing_height * kPointerSize; |
- unsigned output_frame_size = fixed_size + stack_slot_size + outgoing_size; |
- ASSERT(outgoing_size == 0); // OSR does not happen in the middle of a call. |
- |
- if (FLAG_trace_osr) { |
- PrintF("[on-stack replacement: begin 0x%08" V8PRIxPTR " ", |
- reinterpret_cast<intptr_t>(function_)); |
- PrintFunctionName(); |
- PrintF(" => node=%u, frame=%d->%d]\n", |
- ast_id, |
- input_frame_size, |
- output_frame_size); |
- } |
- |
- // There's only one output frame in the OSR case. |
- output_count_ = 1; |
- output_ = new FrameDescription*[1]; |
- output_[0] = new(output_frame_size) FrameDescription( |
- output_frame_size, function_); |
- output_[0]->SetFrameType(StackFrame::JAVA_SCRIPT); |
- |
- // Clear the incoming parameters in the optimized frame to avoid |
- // confusing the garbage collector. |
- unsigned output_offset = output_frame_size - kPointerSize; |
- int parameter_count = function_->shared()->formal_parameter_count() + 1; |
- for (int i = 0; i < parameter_count; ++i) { |
- output_[0]->SetFrameSlot(output_offset, 0); |
- output_offset -= kPointerSize; |
- } |
- |
- // Translate the incoming parameters. This may overwrite some of the |
- // incoming argument slots we've just cleared. |
- int input_offset = input_frame_size - kPointerSize; |
- bool ok = true; |
- int limit = input_offset - (parameter_count * kPointerSize); |
- while (ok && input_offset > limit) { |
- ok = DoOsrTranslateCommand(&iterator, &input_offset); |
- } |
- |
- // There are no translation commands for the caller's pc and fp, the |
- // context, and the function. Set them up explicitly. |
- for (int i = StandardFrameConstants::kCallerPCOffset; |
- ok && i >= StandardFrameConstants::kMarkerOffset; |
- i -= kPointerSize) { |
- intptr_t input_value = input_->GetFrameSlot(input_offset); |
- if (FLAG_trace_osr) { |
- const char* name = "UNKNOWN"; |
- switch (i) { |
- case StandardFrameConstants::kCallerPCOffset: |
- name = "caller's pc"; |
- break; |
- case StandardFrameConstants::kCallerFPOffset: |
- name = "fp"; |
- break; |
- case StandardFrameConstants::kContextOffset: |
- name = "context"; |
- break; |
- case StandardFrameConstants::kMarkerOffset: |
- name = "function"; |
- break; |
- } |
- PrintF(" [rsp + %d] <- 0x%08" V8PRIxPTR " ; [rsp + %d] " |
- "(fixed part - %s)\n", |
- output_offset, |
- input_value, |
- input_offset, |
- name); |
- } |
- output_[0]->SetFrameSlot(output_offset, input_->GetFrameSlot(input_offset)); |
- input_offset -= kPointerSize; |
- output_offset -= kPointerSize; |
- } |
- |
- // Translate the rest of the frame. |
- while (ok && input_offset >= 0) { |
- ok = DoOsrTranslateCommand(&iterator, &input_offset); |
- } |
- |
- // If translation of any command failed, continue using the input frame. |
- if (!ok) { |
- delete output_[0]; |
- output_[0] = input_; |
- output_[0]->SetPc(reinterpret_cast<intptr_t>(from_)); |
- } else { |
- // Set up the frame pointer and the context pointer. |
- output_[0]->SetRegister(rbp.code(), input_->GetRegister(rbp.code())); |
- output_[0]->SetRegister(rsi.code(), input_->GetRegister(rsi.code())); |
- |
- unsigned pc_offset = data->OsrPcOffset()->value(); |
- intptr_t pc = reinterpret_cast<intptr_t>( |
- compiled_code_->entry() + pc_offset); |
- output_[0]->SetPc(pc); |
- } |
- Code* continuation = |
- function_->GetIsolate()->builtins()->builtin(Builtins::kNotifyOSR); |
- output_[0]->SetContinuation( |
- reinterpret_cast<intptr_t>(continuation->entry())); |
- |
- if (FLAG_trace_osr) { |
- PrintF("[on-stack replacement translation %s: 0x%08" V8PRIxPTR " ", |
- ok ? "finished" : "aborted", |
- reinterpret_cast<intptr_t>(function_)); |
- PrintFunctionName(); |
- PrintF(" => pc=0x%0" V8PRIxPTR "]\n", output_[0]->GetPc()); |
- } |
-} |
- |
- |
void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) { |
// Set the register values. The values are not important as there are no |
// callee saved registers in JavaScript frames, so all registers are |
@@ -526,9 +359,7 @@ void Deoptimizer::EntryGenerator::Generate() { |
} |
// Push state, pc, and continuation from the last output frame. |
- if (type() != OSR) { |
- __ push(Operand(rbx, FrameDescription::state_offset())); |
- } |
+ __ push(Operand(rbx, FrameDescription::state_offset())); |
__ push(Operand(rbx, FrameDescription::pc_offset())); |
__ push(Operand(rbx, FrameDescription::continuation_offset())); |