Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index a82fda90f653d83776f2b4d861be59a48b93b48a..e12f3b6bc8a8f7e42e1f88e2cc4c1d4b277b90d7 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -1,4 +1,4 @@ |
-// Copyright 2012 the V8 project authors. All rights reserved. |
+// Copyright 2013 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -491,12 +491,15 @@ void Deoptimizer::ComputeOutputFrames(Deoptimizer* deoptimizer) { |
} |
-bool Deoptimizer::TraceEnabledFor(BailoutType type) { |
- switch (type) { |
+bool Deoptimizer::TraceEnabledFor(BailoutType deopt_type, |
+ StackFrame::Type frame_type) { |
+ switch (deopt_type) { |
case EAGER: |
case LAZY: |
case DEBUGGER: |
- return FLAG_trace_deopt; |
+ return (frame_type == StackFrame::STUB) |
+ ? FLAG_trace_stub_failures |
+ : FLAG_trace_deopt; |
case OSR: |
return FLAG_trace_osr; |
} |
@@ -540,7 +543,8 @@ Deoptimizer::Deoptimizer(Isolate* isolate, |
output_(NULL), |
deferred_arguments_objects_values_(0), |
deferred_arguments_objects_(0), |
- deferred_heap_numbers_(0) { |
+ deferred_heap_numbers_(0), |
+ trace_(false) { |
// For COMPILED_STUBs called from builtins, the function pointer is a SMI |
// indicating an internal frame. |
if (function->IsSmi()) { |
@@ -550,13 +554,14 @@ Deoptimizer::Deoptimizer(Isolate* isolate, |
function->shared()->increment_deopt_count(); |
} |
compiled_code_ = FindOptimizedCode(function, optimized_code); |
- if (TraceEnabledFor(type)) Trace(); |
- ASSERT(HEAP->allow_allocation(false)); |
- unsigned size = ComputeInputFrameSize(); |
- input_ = new(size) FrameDescription(size, function); |
StackFrame::Type frame_type = function == NULL |
? StackFrame::STUB |
: StackFrame::JAVA_SCRIPT; |
+ trace_ = TraceEnabledFor(type, frame_type); |
+ if (trace_) Trace(); |
+ ASSERT(HEAP->allow_allocation(false)); |
+ unsigned size = ComputeInputFrameSize(); |
+ input_ = new(size) FrameDescription(size, function); |
input_->SetFrameType(frame_type); |
} |
@@ -717,7 +722,7 @@ void Deoptimizer::DoComputeOutputFrames() { |
// Print some helpful diagnostic information. |
int64_t start = OS::Ticks(); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF("[deoptimizing%s: begin 0x%08" V8PRIxPTR " ", |
(bailout_type_ == LAZY ? " (lazy)" : ""), |
reinterpret_cast<intptr_t>(function_)); |
@@ -795,7 +800,7 @@ void Deoptimizer::DoComputeOutputFrames() { |
} |
// Print some helpful diagnostic information. |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
double ms = static_cast<double>(OS::Ticks() - start) / 1000; |
int index = output_count_ - 1; // Index of the topmost frame. |
JSFunction* function = output_[index]->GetFunction(); |
@@ -833,7 +838,7 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { |
for (int i = 0; i < deferred_heap_numbers_.length(); i++) { |
HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i]; |
Handle<Object> num = isolate_->factory()->NewNumber(d.value()); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF("Materializing a new heap number %p [%e] in slot %p\n", |
reinterpret_cast<void*>(*num), |
d.value(), |
@@ -878,7 +883,7 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { |
} |
frame->SetExpression(i, *arguments); |
ASSERT_EQ(Memory::Object_at(descriptor.slot_address()), *arguments); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF("Materializing %sarguments object for %p: ", |
frame->has_adapted_arguments() ? "(adapted) " : "", |
reinterpret_cast<void*>(descriptor.slot_address())); |
@@ -913,7 +918,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
int index = (info->parameters_count() - 1) - |
static_cast<int>(slot - parameters_top) / kPointerSize; |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF("Materializing a new heap number %p [%e] in slot %p" |
"for parameter slot #%d\n", |
reinterpret_cast<void*>(*num), |
@@ -929,7 +934,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
int index = info->expression_count() - 1 - |
static_cast<int>(slot - expressions_top) / kPointerSize; |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF("Materializing a new heap number %p [%e] in slot %p" |
"for expression slot #%d\n", |
reinterpret_cast<void*>(*num), |
@@ -976,7 +981,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::REGISTER: { |
int input_reg = iterator->Next(); |
intptr_t input_value = input_->GetRegister(input_reg); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF( |
" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ", |
output_[frame_index]->GetTop() + output_offset, |
@@ -994,7 +999,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
int input_reg = iterator->Next(); |
intptr_t value = input_->GetRegister(input_reg); |
bool is_smi = Smi::IsValid(value); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF( |
" 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIdPTR " ; %s (%s)\n", |
output_[frame_index]->GetTop() + output_offset, |
@@ -1021,7 +1026,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
int input_reg = iterator->Next(); |
uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg)); |
bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF( |
" 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIuPTR |
" ; uint %s (%s)\n", |
@@ -1048,7 +1053,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
double value = input_->GetDoubleRegister(input_reg); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n", |
output_[frame_index]->GetTop() + output_offset, |
output_offset, |
@@ -1067,7 +1072,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
unsigned input_offset = |
input_->GetOffsetFromSlotIndex(input_slot_index); |
intptr_t input_value = input_->GetFrameSlot(input_offset); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": ", |
output_[frame_index]->GetTop() + output_offset); |
PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [sp + %d] ", |
@@ -1087,7 +1092,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
input_->GetOffsetFromSlotIndex(input_slot_index); |
intptr_t value = input_->GetFrameSlot(input_offset); |
bool is_smi = Smi::IsValid(value); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": ", |
output_[frame_index]->GetTop() + output_offset); |
PrintF("[top + %d] <- %" V8PRIdPTR " ; [sp + %d] (%s)\n", |
@@ -1117,7 +1122,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
uintptr_t value = |
static_cast<uintptr_t>(input_->GetFrameSlot(input_offset)); |
bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": ", |
output_[frame_index]->GetTop() + output_offset); |
PrintF("[top + %d] <- %" V8PRIuPTR " ; [sp + %d] (uint32 %s)\n", |
@@ -1145,7 +1150,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
unsigned input_offset = |
input_->GetOffsetFromSlotIndex(input_slot_index); |
double value = input_->GetDoubleFrameSlot(input_offset); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n", |
output_[frame_index]->GetTop() + output_offset, |
output_offset, |
@@ -1161,7 +1166,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::LITERAL: { |
Object* literal = ComputeLiteral(iterator->Next()); |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", |
output_[frame_index]->GetTop() + output_offset, |
output_offset); |
@@ -1176,7 +1181,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::ARGUMENTS_OBJECT: { |
int args_index = iterator->Next() + 1; // Skip receiver. |
int args_length = iterator->Next() - 1; // Skip receiver. |
- if (FLAG_trace_deopt) { |
+ if (trace_) { |
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", |
output_[frame_index]->GetTop() + output_offset, |
output_offset); |