From ed977c972ee243b8fe4dc152fc42e0113725014d Mon Sep 17 00:00:00 2001 From: jarin Date: Mon, 15 Jun 2015 03:14:28 -0700 Subject: [PATCH] Fix debug printing of inputs in the deoptimizer, pull out printing into separate methods. Also fixed the duplicated output of context deopt. BUG= Review URL: https://codereview.chromium.org/1187533002 Cr-Commit-Position: refs/heads/master@{#29019} --- src/deoptimizer.cc | 379 ++++++++++++++++++----------------------------------- src/deoptimizer.h | 13 +- 2 files changed, 136 insertions(+), 256 deletions(-) diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc index a194db7..4d2c676 100644 --- a/src/deoptimizer.cc +++ b/src/deoptimizer.cc @@ -837,6 +837,7 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, unsigned height_in_bytes = height * kPointerSize; JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); value_iterator++; + input_index++; if (trace_scope_ != NULL) { PrintF(trace_scope_->file(), " translating frame "); function->PrintName(trace_scope_->file()); @@ -892,8 +893,8 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, unsigned input_offset = input_frame_size; for (int i = 0; i < parameter_count; ++i) { output_offset -= kPointerSize; - WriteValueToOutput(&value_iterator, &input_index, frame_index, - output_offset); + WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, + output_offset); } input_offset -= (parameter_count * kPointerSize); @@ -914,12 +915,7 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, value = output_[frame_index - 1]->GetPc(); } output_frame->SetCallerPc(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's pc\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "caller's pc\n"); // The caller's frame pointer for the bottommost output frame is the same // as in the input frame. For all subsequent output frames, it can be @@ -938,12 +934,7 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, has_alignment_padding_ * kPointerSize) == fp_value); output_frame->SetFp(fp_value); if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's fp\n", - fp_value, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n"); DCHECK(!is_bottommost || !has_alignment_padding_ || (fp_value & kPointerSize) != 0); @@ -959,11 +950,8 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, value = output_[frame_index - 1]->GetConstantPool(); } output_frame->SetCallerConstantPool(output_offset, value); - if (trace_scope_) { - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR "; caller's constant_pool\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "caller's constant_pool\n"); } // For the bottommost output frame the context can be gotten from the input @@ -973,31 +961,25 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, output_offset -= kPointerSize; input_offset -= kPointerSize; // Read the context from the translations. - WriteValueToOutput(&value_iterator, &input_index, frame_index, output_offset); - value = output_frame->GetFrameSlot(output_offset); + Object* context = value_iterator->GetRawValue(); // The context should not be a placeholder for a materialized object. - CHECK(value != - reinterpret_cast(isolate_->heap()->arguments_marker())); - if (value == - reinterpret_cast(isolate_->heap()->undefined_value())) { + CHECK(context != isolate_->heap()->arguments_marker()); + if (context == isolate_->heap()->undefined_value()) { // If the context was optimized away, just use the context from // the activation. This should only apply to Crankshaft code. CHECK(!compiled_code_->is_turbofanned()); - if (is_bottommost) { - value = input_->GetFrameSlot(input_offset); - } else { - value = reinterpret_cast(function->context()); - } - output_frame->SetFrameSlot(output_offset, value); + context = + is_bottommost + ? reinterpret_cast(input_->GetFrameSlot(input_offset)) + : function->context(); } + value = reinterpret_cast(context); output_frame->SetContext(value); if (is_topmost) output_frame->SetRegister(context_reg.code(), value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR "; context\n", - top_address + output_offset, output_offset, value); - } + WriteValueToOutput(context, input_index, frame_index, output_offset, + "context "); + value_iterator++; + input_index++; // The function was mentioned explicitly in the BEGIN_FRAME. output_offset -= kPointerSize; @@ -1006,19 +988,13 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, // The function for the bottommost output frame should also agree with the // input frame. DCHECK(!is_bottommost || input_->GetFrameSlot(input_offset) == value); - output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR "; function\n", - top_address + output_offset, output_offset, value); - } + WriteValueToOutput(function, 0, frame_index, output_offset, "function "); // Translate the rest of the frame. for (unsigned i = 0; i < height; ++i) { output_offset -= kPointerSize; - WriteValueToOutput(&value_iterator, &input_index, frame_index, - output_offset); + WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, + output_offset); } CHECK_EQ(0u, output_offset); @@ -1076,6 +1052,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, unsigned height_in_bytes = height * kPointerSize; JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); value_iterator++; + input_index++; if (trace_scope_ != NULL) { PrintF(trace_scope_->file(), " translating arguments adaptor => height=%d\n", height_in_bytes); @@ -1105,20 +1082,15 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, unsigned output_offset = output_frame_size; for (int i = 0; i < parameter_count; ++i) { output_offset -= kPointerSize; - WriteValueToOutput(&value_iterator, &input_index, frame_index, - output_offset); + WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, + output_offset); } // Read caller's PC from the previous frame. output_offset -= kPCOnStackSize; intptr_t callers_pc = output_[frame_index - 1]->GetPc(); output_frame->SetCallerPc(output_offset, callers_pc); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's pc\n", - top_address + output_offset, output_offset, callers_pc); - } + DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n"); // Read caller's FP from the previous frame, and set this frame's FP. output_offset -= kFPOnStackSize; @@ -1126,23 +1098,15 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, output_frame->SetCallerFp(output_offset, value); intptr_t fp_value = top_address + output_offset; output_frame->SetFp(fp_value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's fp\n", - fp_value, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n"); if (FLAG_enable_embedded_constant_pool) { // Read the caller's constant pool from the previous frame. output_offset -= kPointerSize; value = output_[frame_index - 1]->GetConstantPool(); output_frame->SetCallerConstantPool(output_offset, value); - if (trace_scope_) { - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR "; caller's constant_pool\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "caller's constant_pool\n"); } // A marker value is used in place of the context. @@ -1150,33 +1114,21 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, intptr_t context = reinterpret_cast( Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); output_frame->SetFrameSlot(output_offset, context); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; context (adaptor sentinel)\n", - top_address + output_offset, output_offset, context); - } + DebugPrintOutputSlot(context, frame_index, output_offset, + "context (adaptor sentinel)\n"); // The function was mentioned explicitly in the ARGUMENTS_ADAPTOR_FRAME. output_offset -= kPointerSize; value = reinterpret_cast(function); - output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; function\n", - top_address + output_offset, output_offset, value); - } + WriteValueToOutput(function, 0, frame_index, output_offset, "function "); // Number of incoming arguments. output_offset -= kPointerSize; value = reinterpret_cast(Smi::FromInt(height - 1)); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; argc (%d)\n", - top_address + output_offset, output_offset, value, height - 1); + DebugPrintOutputSlot(value, frame_index, output_offset, "argc "); + if (trace_scope_ != nullptr) { + PrintF(trace_scope_->file(), "(%d)\n", height - 1); } DCHECK(0 == output_offset); @@ -1209,6 +1161,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, unsigned height_in_bytes = height * kPointerSize; JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); value_iterator++; + input_index++; if (trace_scope_ != NULL) { PrintF(trace_scope_->file(), " translating construct stub => height=%d\n", height_in_bytes); @@ -1241,8 +1194,8 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, // The allocated receiver of a construct stub frame is passed as the // receiver parameter through the translation. It might be encoding // a captured object, override the slot address for a captured object. - WriteValueToOutput( - &value_iterator, &input_index, frame_index, output_offset, + WriteTranslatedValueToOutput( + &value_iterator, &input_index, frame_index, output_offset, nullptr, (i == 0) ? reinterpret_cast
(top_address) : nullptr); } @@ -1250,12 +1203,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, output_offset -= kPCOnStackSize; intptr_t callers_pc = output_[frame_index - 1]->GetPc(); output_frame->SetCallerPc(output_offset, callers_pc); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's pc\n", - top_address + output_offset, output_offset, callers_pc); - } + DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n"); // Read caller's FP from the previous frame, and set this frame's FP. output_offset -= kFPOnStackSize; @@ -1263,81 +1211,51 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, output_frame->SetCallerFp(output_offset, value); intptr_t fp_value = top_address + output_offset; output_frame->SetFp(fp_value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's fp\n", - fp_value, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n"); if (FLAG_enable_embedded_constant_pool) { // Read the caller's constant pool from the previous frame. output_offset -= kPointerSize; value = output_[frame_index - 1]->GetConstantPool(); output_frame->SetCallerConstantPool(output_offset, value); - if (trace_scope_) { - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's constant pool\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "caller's constant_pool\n"); } // The context can be gotten from the previous frame. output_offset -= kPointerSize; value = output_[frame_index - 1]->GetContext(); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; context\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); // A marker value is used in place of the function. output_offset -= kPointerSize; value = reinterpret_cast(Smi::FromInt(StackFrame::CONSTRUCT)); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; function (construct sentinel)\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "function (construct sentinel)\n"); // The output frame reflects a JSConstructStubGeneric frame. output_offset -= kPointerSize; value = reinterpret_cast(construct_stub); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; code object\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); // Number of incoming arguments. output_offset -= kPointerSize; value = reinterpret_cast(Smi::FromInt(height - 1)); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; argc (%d)\n", - top_address + output_offset, output_offset, value, height - 1); + DebugPrintOutputSlot(value, frame_index, output_offset, "argc "); + if (trace_scope_ != nullptr) { + PrintF(trace_scope_->file(), "(%d)\n", height - 1); } // Constructor function being invoked by the stub (only present on some // architectures, indicated by kConstructorOffset). if (ConstructFrameConstants::kConstructorOffset != kMinInt) { output_offset -= kPointerSize; - value = reinterpret_cast(function); - output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; constructor function\n", - top_address + output_offset, output_offset, value); - } + WriteValueToOutput(function, 0, frame_index, output_offset, + "constructor function "); } // The newly allocated object was passed as receiver in the artificial @@ -1345,12 +1263,8 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator, output_offset -= kPointerSize; value = output_frame->GetFrameSlot(output_frame_size - kPointerSize); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; allocated receiver\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "allocated receiver\n"); CHECK_EQ(0u, output_offset); @@ -1376,6 +1290,7 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, JSFunction* accessor = JSFunction::cast(value_iterator->GetRawValue()); value_iterator++; + input_index++; // The receiver (and the implicit return value, if any) are expected in // registers by the LoadIC/StoreIC, so they don't belong to the output stack // frame. This means that we have to use a height of 0. @@ -1419,12 +1334,7 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, output_offset -= kPCOnStackSize; intptr_t callers_pc = output_[frame_index - 1]->GetPc(); output_frame->SetCallerPc(output_offset, callers_pc); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR - " ; caller's pc\n", - top_address + output_offset, output_offset, callers_pc); - } + DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n"); // Read caller's FP from the previous frame, and set this frame's FP. output_offset -= kFPOnStackSize; @@ -1432,45 +1342,30 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, output_frame->SetCallerFp(output_offset, value); intptr_t fp_value = top_address + output_offset; output_frame->SetFp(fp_value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR - " ; caller's fp\n", - fp_value, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n"); if (FLAG_enable_embedded_constant_pool) { // Read the caller's constant pool from the previous frame. output_offset -= kPointerSize; value = output_[frame_index - 1]->GetConstantPool(); output_frame->SetCallerConstantPool(output_offset, value); - if (trace_scope_) { - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's constant pool\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, + "caller's constant_pool\n"); } // The context can be gotten from the previous frame. output_offset -= kPointerSize; value = output_[frame_index - 1]->GetContext(); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR - " ; context\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); // A marker value is used in place of the function. output_offset -= kPointerSize; value = reinterpret_cast(Smi::FromInt(StackFrame::INTERNAL)); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR - " ; function (%s sentinel)\n", - top_address + output_offset, output_offset, value, kind); + DebugPrintOutputSlot(value, frame_index, output_offset, "function "); + if (trace_scope_ != nullptr) { + PrintF(trace_scope_->file(), "(%s sentinel)\n", kind); } // Get Code object from accessor stub. @@ -1481,22 +1376,18 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, Code* accessor_stub = isolate_->builtins()->builtin(name); value = reinterpret_cast(accessor_stub); output_frame->SetFrameSlot(output_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR - " ; code object\n", - top_address + output_offset, output_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); // Skip receiver. value_iterator++; + input_index++; if (is_setter_stub_frame) { // The implicit return value was part of the artificial setter stub // environment. output_offset -= kPointerSize; - WriteValueToOutput(&value_iterator, &input_index, frame_index, - output_offset); + WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, + output_offset); } CHECK_EQ(0u, output_offset); @@ -1598,12 +1489,8 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, unsigned output_frame_offset = output_frame_size - kFPOnStackSize; intptr_t value = input_->GetFrameSlot(input_frame_offset); output_frame->SetCallerPc(output_frame_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's pc\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, + "caller's pc\n"); // Read caller's FP from the input frame, and set this frame's FP. input_frame_offset -= kFPOnStackSize; @@ -1613,12 +1500,8 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); output_frame->SetRegister(fp_reg.code(), frame_ptr); output_frame->SetFp(frame_ptr); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's fp\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, + "caller's fp\n"); if (FLAG_enable_embedded_constant_pool) { // Read the caller's constant pool from the input frame. @@ -1626,11 +1509,8 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, value = input_->GetFrameSlot(input_frame_offset); output_frame_offset -= kPointerSize; output_frame->SetCallerConstantPool(output_frame_offset, value); - if (trace_scope_) { - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; caller's constant_pool\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, + "caller's constant_pool\n"); } // The context can be gotten from the input frame. @@ -1641,24 +1521,15 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, output_frame_offset -= kPointerSize; output_frame->SetFrameSlot(output_frame_offset, value); CHECK(reinterpret_cast(value)->IsContext()); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; context\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, "context\n"); // A marker value is used in place of the function. output_frame_offset -= kPointerSize; value = reinterpret_cast( Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE)); output_frame->SetFrameSlot(output_frame_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; function (stub failure sentinel)\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, + "function (stub failure sentinel)\n"); intptr_t caller_arg_count = 0; bool arg_count_known = !descriptor.stack_parameter_count().is_valid(); @@ -1676,42 +1547,30 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, } output_frame->SetFrameSlot(args_arguments_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; args.arguments %s\n", - top_address + args_arguments_offset, args_arguments_offset, value, - arg_count_known ? "" : "(the hole)"); - } + DebugPrintOutputSlot( + value, frame_index, args_arguments_offset, + arg_count_known ? "args.arguments\n" : "args.arguments (the hole)\n"); output_frame_offset -= kPointerSize; int length_frame_offset = output_frame_offset; value = arg_count_known ? caller_arg_count : the_hole; output_frame->SetFrameSlot(length_frame_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; args.length %s\n", - top_address + length_frame_offset, length_frame_offset, value, - arg_count_known ? "" : "(the hole)"); - } + DebugPrintOutputSlot( + value, frame_index, length_frame_offset, + arg_count_known ? "args.length\n" : "args.length (the hole)\n"); output_frame_offset -= kPointerSize; value = frame_ptr + StandardFrameConstants::kCallerSPOffset - (output_frame_size - output_frame_offset) + kPointerSize; output_frame->SetFrameSlot(output_frame_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; args*\n", - top_address + output_frame_offset, output_frame_offset, value); - } + DebugPrintOutputSlot(value, frame_index, output_frame_offset, "args*\n"); // Copy the register parameters to the failure frame. int arguments_length_offset = -1; for (int i = 0; i < param_count; ++i) { output_frame_offset -= kPointerSize; - WriteValueToOutput(&value_iterator, &input_index, 0, output_frame_offset); + WriteTranslatedValueToOutput(&value_iterator, &input_index, 0, + output_frame_offset); if (!arg_count_known && descriptor.IsEnvironmentParameterCountRegister(i)) { arguments_length_offset = output_frame_offset; @@ -1729,23 +1588,13 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, output_frame->GetFrameSlot(arguments_length_offset)); caller_arg_count = smi_caller_arg_count->value(); output_frame->SetFrameSlot(length_frame_offset, caller_arg_count); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; args.length\n", - top_address + length_frame_offset, length_frame_offset, - caller_arg_count); - } + DebugPrintOutputSlot(caller_arg_count, frame_index, length_frame_offset, + "args.length\n"); value = frame_ptr + StandardFrameConstants::kCallerSPOffset + (caller_arg_count - 1) * kPointerSize; output_frame->SetFrameSlot(args_arguments_offset, value); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" - V8PRIxPTR " ; args.arguments\n", - top_address + args_arguments_offset, args_arguments_offset, - value); - } + DebugPrintOutputSlot(value, frame_index, args_arguments_offset, + "args.arguments"); } // Copy the double registers from the input into the output frame. @@ -1856,25 +1705,19 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( } -void Deoptimizer::WriteValueToOutput( +void Deoptimizer::WriteTranslatedValueToOutput( TranslatedFrame::iterator* iterator, int* input_index, int frame_index, - unsigned output_offset, Address output_address_for_materialization) { + unsigned output_offset, const char* debug_hint_string, + Address output_address_for_materialization) { Object* value = (*iterator)->GetRawValue(); - output_[frame_index]->SetFrameSlot(output_offset, - reinterpret_cast(value)); - Address output_address = - reinterpret_cast
(output_[frame_index]->GetTop()) + output_offset; - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; ", - reinterpret_cast(output_address), output_offset, - reinterpret_cast(value)); - value->ShortPrint(trace_scope_->file()); - PrintF(trace_scope_->file(), " (input #%d)\n", *input_index); - } + WriteValueToOutput(value, *input_index, frame_index, output_offset, + debug_hint_string); if (value == isolate_->heap()->arguments_marker()) { + Address output_address = + reinterpret_cast
(output_[frame_index]->GetTop()) + + output_offset; if (output_address_for_materialization == nullptr) { output_address_for_materialization = output_address; } @@ -1887,6 +1730,36 @@ void Deoptimizer::WriteValueToOutput( } +void Deoptimizer::WriteValueToOutput(Object* value, int input_index, + int frame_index, unsigned output_offset, + const char* debug_hint_string) { + output_[frame_index]->SetFrameSlot(output_offset, + reinterpret_cast(value)); + + if (trace_scope_ != nullptr) { + DebugPrintOutputSlot(reinterpret_cast(value), frame_index, + output_offset, debug_hint_string); + value->ShortPrint(trace_scope_->file()); + PrintF(trace_scope_->file(), " (input #%d)\n", input_index); + } +} + + +void Deoptimizer::DebugPrintOutputSlot(intptr_t value, int frame_index, + unsigned output_offset, + const char* debug_hint_string) { + if (trace_scope_ != nullptr) { + Address output_address = + reinterpret_cast
(output_[frame_index]->GetTop()) + + output_offset; + PrintF(trace_scope_->file(), + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s", + reinterpret_cast(output_address), output_offset, value, + debug_hint_string == nullptr ? "" : debug_hint_string); + } +} + + unsigned Deoptimizer::ComputeInputFrameSize() const { unsigned fixed_size = ComputeFixedSize(function_); // The fp-to-sp delta already takes the context, constant pool pointer and the diff --git a/src/deoptimizer.h b/src/deoptimizer.h index aa77bf5..591505f 100644 --- a/src/deoptimizer.h +++ b/src/deoptimizer.h @@ -646,9 +646,16 @@ class Deoptimizer : public Malloced { void DoComputeCompiledStubFrame(TranslationIterator* iterator, int frame_index); - void WriteValueToOutput(TranslatedFrame::iterator* iterator, int* input_index, - int frame_index, unsigned output_offset, - Address output_address_for_materialization = nullptr); + void WriteTranslatedValueToOutput( + TranslatedFrame::iterator* iterator, int* input_index, int frame_index, + unsigned output_offset, const char* debug_hint_string = nullptr, + Address output_address_for_materialization = nullptr); + void WriteValueToOutput(Object* value, int input_index, int frame_index, + unsigned output_offset, + const char* debug_hint_string); + void DebugPrintOutputSlot(intptr_t value, int frame_index, + unsigned output_offset, + const char* debug_hint_string); unsigned ComputeInputFrameSize() const; unsigned ComputeFixedSize(JSFunction* function) const; -- 2.7.4