Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Unified Diff: src/deoptimizer.cc

Issue 1187533002: Fix debug printing of inputs in the deoptimizer, pull out printing into separate methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Another tweak Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/deoptimizer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/deoptimizer.cc
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
index a194db7f78492845d9fe2091fa1e72a6460c3899..4d2c6761f08b0c22b04836f945ff6cdc65d8ed5a 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<intptr_t>(isolate_->heap()->arguments_marker()));
- if (value ==
- reinterpret_cast<intptr_t>(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<intptr_t>(function->context());
- }
- output_frame->SetFrameSlot(output_offset, value);
+ context =
+ is_bottommost
+ ? reinterpret_cast<Object*>(input_->GetFrameSlot(input_offset))
+ : function->context();
}
+ value = reinterpret_cast<intptr_t>(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<intptr_t>(
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<intptr_t>(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<intptr_t>(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<Address>(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<intptr_t>(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<intptr_t>(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<intptr_t>(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<intptr_t>(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<intptr_t>(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<intptr_t>(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<Object*>(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<intptr_t>(
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<intptr_t>(value));
- Address output_address =
- reinterpret_cast<Address>(output_[frame_index]->GetTop()) + output_offset;
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(),
- " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; ",
- reinterpret_cast<intptr_t>(output_address), output_offset,
- reinterpret_cast<intptr_t>(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<Address>(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<intptr_t>(value));
+
+ if (trace_scope_ != nullptr) {
+ DebugPrintOutputSlot(reinterpret_cast<intptr_t>(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<Address>(output_[frame_index]->GetTop()) +
+ output_offset;
+ PrintF(trace_scope_->file(),
+ " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s",
+ reinterpret_cast<intptr_t>(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
« no previous file with comments | « src/deoptimizer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698