| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 61ce7803d5c669f1d61291bb0a96d002b17e7ead..c979a534d89f0a4322fdf9a94d17f0935e3a2afd 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -495,8 +495,6 @@ bool Deoptimizer::TraceEnabledFor(BailoutType deopt_type,
|
| return (frame_type == StackFrame::STUB)
|
| ? FLAG_trace_stub_failures
|
| : FLAG_trace_deopt;
|
| - case OSR:
|
| - return FLAG_trace_osr;
|
| }
|
| UNREACHABLE();
|
| return false;
|
| @@ -509,7 +507,6 @@ const char* Deoptimizer::MessageFor(BailoutType type) {
|
| case SOFT: return "soft";
|
| case LAZY: return "lazy";
|
| case DEBUGGER: return "debugger";
|
| - case OSR: return "OSR";
|
| }
|
| UNREACHABLE();
|
| return NULL;
|
| @@ -563,6 +560,14 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| }
|
| }
|
| compiled_code_ = FindOptimizedCode(function, optimized_code);
|
| +
|
| +#if DEBUG
|
| + ASSERT(compiled_code_ != NULL);
|
| + if (type == EAGER || type == SOFT || type == LAZY) {
|
| + ASSERT(compiled_code_->kind() != Code::FUNCTION);
|
| + }
|
| +#endif
|
| +
|
| StackFrame::Type frame_type = function == NULL
|
| ? StackFrame::STUB
|
| : StackFrame::JAVA_SCRIPT;
|
| @@ -588,15 +593,6 @@ Code* Deoptimizer::FindOptimizedCode(JSFunction* function,
|
| ? static_cast<Code*>(isolate_->FindCodeObject(from_))
|
| : compiled_code;
|
| }
|
| - case Deoptimizer::OSR: {
|
| - // The function has already been optimized and we're transitioning
|
| - // from the unoptimized shared version to the optimized one in the
|
| - // function. The return address (from_) points to unoptimized code.
|
| - Code* compiled_code = function->code();
|
| - ASSERT(compiled_code->kind() == Code::OPTIMIZED_FUNCTION);
|
| - ASSERT(!compiled_code->contains(from_));
|
| - return compiled_code;
|
| - }
|
| case Deoptimizer::DEBUGGER:
|
| ASSERT(optimized_code->contains(from_));
|
| return optimized_code;
|
| @@ -720,11 +716,6 @@ int Deoptimizer::GetDeoptimizedCodeCount(Isolate* isolate) {
|
| // We rely on this function not causing a GC. It is called from generated code
|
| // without having a real stack frame in place.
|
| void Deoptimizer::DoComputeOutputFrames() {
|
| - if (bailout_type_ == OSR) {
|
| - DoComputeOsrOutputFrame();
|
| - return;
|
| - }
|
| -
|
| // Print some helpful diagnostic information.
|
| if (FLAG_log_timer_events &&
|
| compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) {
|
| @@ -2346,192 +2337,6 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| }
|
|
|
|
|
| -bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator,
|
| - int* input_offset) {
|
| - disasm::NameConverter converter;
|
| - FrameDescription* output = output_[0];
|
| -
|
| - // The input values are all part of the unoptimized frame so they
|
| - // are all tagged pointers.
|
| - uintptr_t input_value = input_->GetFrameSlot(*input_offset);
|
| - Object* input_object = reinterpret_cast<Object*>(input_value);
|
| -
|
| - Translation::Opcode opcode =
|
| - static_cast<Translation::Opcode>(iterator->Next());
|
| -
|
| - switch (opcode) {
|
| - case Translation::BEGIN:
|
| - case Translation::JS_FRAME:
|
| - case Translation::ARGUMENTS_ADAPTOR_FRAME:
|
| - case Translation::CONSTRUCT_STUB_FRAME:
|
| - case Translation::GETTER_STUB_FRAME:
|
| - case Translation::SETTER_STUB_FRAME:
|
| - case Translation::COMPILED_STUB_FRAME:
|
| - UNREACHABLE(); // Malformed input.
|
| - return false;
|
| -
|
| - case Translation::REGISTER: {
|
| - int output_reg = iterator->Next();
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" %s <- 0x%08" V8PRIxPTR " ; [sp + %d]\n",
|
| - converter.NameOfCPURegister(output_reg),
|
| - input_value,
|
| - *input_offset);
|
| - }
|
| - output->SetRegister(output_reg, input_value);
|
| - break;
|
| - }
|
| -
|
| - case Translation::INT32_REGISTER: {
|
| - int32_t int32_value = 0;
|
| - if (!input_object->ToInt32(&int32_value)) return false;
|
| -
|
| - int output_reg = iterator->Next();
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" %s <- %d (int32) ; [sp + %d]\n",
|
| - converter.NameOfCPURegister(output_reg),
|
| - int32_value,
|
| - *input_offset);
|
| - }
|
| - output->SetRegister(output_reg, int32_value);
|
| - break;
|
| - }
|
| -
|
| - case Translation::UINT32_REGISTER: {
|
| - uint32_t uint32_value = 0;
|
| - if (!input_object->ToUint32(&uint32_value)) return false;
|
| -
|
| - int output_reg = iterator->Next();
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" %s <- %u (uint32) ; [sp + %d]\n",
|
| - converter.NameOfCPURegister(output_reg),
|
| - uint32_value,
|
| - *input_offset);
|
| - }
|
| - output->SetRegister(output_reg, static_cast<int32_t>(uint32_value));
|
| - }
|
| -
|
| -
|
| - case Translation::DOUBLE_REGISTER: {
|
| - // Abort OSR if we don't have a number.
|
| - if (!input_object->IsNumber()) return false;
|
| -
|
| - int output_reg = iterator->Next();
|
| - double double_value = input_object->Number();
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" %s <- %g (double) ; [sp + %d]\n",
|
| - DoubleRegister::AllocationIndexToString(output_reg),
|
| - double_value,
|
| - *input_offset);
|
| - }
|
| - output->SetDoubleRegister(output_reg, double_value);
|
| - break;
|
| - }
|
| -
|
| - case Translation::STACK_SLOT: {
|
| - int output_index = iterator->Next();
|
| - unsigned output_offset =
|
| - output->GetOffsetFromSlotIndex(output_index);
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" [sp + %d] <- 0x%08" V8PRIxPTR " ; [sp + %d] ",
|
| - output_offset,
|
| - input_value,
|
| - *input_offset);
|
| - reinterpret_cast<Object*>(input_value)->ShortPrint();
|
| - PrintF("\n");
|
| - }
|
| - output->SetFrameSlot(output_offset, input_value);
|
| - break;
|
| - }
|
| -
|
| - case Translation::INT32_STACK_SLOT: {
|
| - int32_t int32_value = 0;
|
| - if (!input_object->ToInt32(&int32_value)) return false;
|
| -
|
| - int output_index = iterator->Next();
|
| - unsigned output_offset =
|
| - output->GetOffsetFromSlotIndex(output_index);
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" [sp + %d] <- %d (int32) ; [sp + %d]\n",
|
| - output_offset,
|
| - int32_value,
|
| - *input_offset);
|
| - }
|
| - output->SetFrameSlot(output_offset, int32_value);
|
| - break;
|
| - }
|
| -
|
| - case Translation::UINT32_STACK_SLOT: {
|
| - uint32_t uint32_value = 0;
|
| - if (!input_object->ToUint32(&uint32_value)) return false;
|
| -
|
| - int output_index = iterator->Next();
|
| - unsigned output_offset =
|
| - output->GetOffsetFromSlotIndex(output_index);
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" [sp + %d] <- %u (uint32) ; [sp + %d]\n",
|
| - output_offset,
|
| - uint32_value,
|
| - *input_offset);
|
| - }
|
| - output->SetFrameSlot(output_offset, static_cast<int32_t>(uint32_value));
|
| - break;
|
| - }
|
| -
|
| - case Translation::DOUBLE_STACK_SLOT: {
|
| - static const int kLowerOffset = 0 * kPointerSize;
|
| - static const int kUpperOffset = 1 * kPointerSize;
|
| -
|
| - // Abort OSR if we don't have a number.
|
| - if (!input_object->IsNumber()) return false;
|
| -
|
| - int output_index = iterator->Next();
|
| - unsigned output_offset =
|
| - output->GetOffsetFromSlotIndex(output_index);
|
| - double double_value = input_object->Number();
|
| - uint64_t int_value = BitCast<uint64_t, double>(double_value);
|
| - int32_t lower = static_cast<int32_t>(int_value);
|
| - int32_t upper = static_cast<int32_t>(int_value >> kBitsPerInt);
|
| - if (FLAG_trace_osr) {
|
| - PrintF(" [sp + %d] <- 0x%08x (upper bits of %g) ; [sp + %d]\n",
|
| - output_offset + kUpperOffset,
|
| - upper,
|
| - double_value,
|
| - *input_offset);
|
| - PrintF(" [sp + %d] <- 0x%08x (lower bits of %g) ; [sp + %d]\n",
|
| - output_offset + kLowerOffset,
|
| - lower,
|
| - double_value,
|
| - *input_offset);
|
| - }
|
| - output->SetFrameSlot(output_offset + kLowerOffset, lower);
|
| - output->SetFrameSlot(output_offset + kUpperOffset, upper);
|
| - break;
|
| - }
|
| -
|
| - case Translation::LITERAL: {
|
| - // Just ignore non-materialized literals.
|
| - iterator->Next();
|
| - break;
|
| - }
|
| -
|
| - case Translation::DUPLICATED_OBJECT:
|
| - case Translation::ARGUMENTS_OBJECT:
|
| - case Translation::CAPTURED_OBJECT: {
|
| - // Optimized code assumes that the argument object has not been
|
| - // materialized and so bypasses it when doing arguments access.
|
| - // We should have bailed out before starting the frame
|
| - // translation.
|
| - UNREACHABLE();
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - *input_offset -= kPointerSize;
|
| - return true;
|
| -}
|
| -
|
| -
|
| void Deoptimizer::PatchInterruptCode(Isolate* isolate,
|
| Code* unoptimized) {
|
| DisallowHeapAllocation no_gc;
|
| @@ -2617,12 +2422,7 @@ unsigned Deoptimizer::ComputeInputFrameSize() const {
|
| // into account so we have to avoid double counting them (-2).
|
| unsigned result = fixed_size + fp_to_sp_delta_ - (2 * kPointerSize);
|
| #ifdef DEBUG
|
| - if (bailout_type_ == OSR) {
|
| - // TODO(kasperl): It would be nice if we could verify that the
|
| - // size matches with the stack height we can compute based on the
|
| - // environment at the OSR entry. The code for that his built into
|
| - // the DoComputeOsrOutputFrame function for now.
|
| - } else if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) {
|
| + if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) {
|
| unsigned stack_slots = compiled_code_->stack_slots();
|
| unsigned outgoing_size = ComputeOutgoingArgumentSize();
|
| ASSERT(result == fixed_size + (stack_slots * kPointerSize) + outgoing_size);
|
|
|