Chromium Code Reviews| Index: src/deoptimizer.cc |
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
| index a82fda90f653d83776f2b4d861be59a48b93b48a..5cc3bcd1decbd3342585772ef3c9933d73541e8b 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,14 @@ 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 (FLAG_trace_deopt && frame_type != StackFrame::STUB) || |
| + (FLAG_trace_stub_failures && frame_type == StackFrame::STUB); |
|
Sven Panne
2013/02/05 13:03:11
I think a ternary is clearer here:
return (fra
|
| case OSR: |
| return FLAG_trace_osr; |
| } |
| @@ -540,7 +542,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 +553,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 +721,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 +799,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 +837,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 +882,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 +917,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 +933,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 +980,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 +998,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 +1025,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 +1052,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 +1071,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 +1091,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 +1121,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 +1149,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 +1165,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 +1180,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); |