| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index d79b02248c7b0a1d25016b3ee6ad4d58c9948ff1..a0b50ede4bd627fdf2f6d936bcd39c7660a59546 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -477,37 +477,32 @@ void Deoptimizer::ComputeOutputFrames(Deoptimizer* deoptimizer) {
|
| }
|
|
|
|
|
| -static Code* FindOptimizedCode(Isolate* isolate,
|
| - JSFunction* function,
|
| - Deoptimizer::BailoutType type,
|
| - Address from,
|
| - Code* optimized_code) {
|
| +bool Deoptimizer::TraceEnabledFor(BailoutType type) {
|
| switch (type) {
|
| - case Deoptimizer::EAGER:
|
| - ASSERT(from == NULL);
|
| - return function->code();
|
| - case Deoptimizer::LAZY: {
|
| - Code* compiled_code =
|
| - isolate->deoptimizer_data()->FindDeoptimizingCode(from);
|
| - return (compiled_code == NULL)
|
| - ? static_cast<Code*>(isolate->heap()->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;
|
| + case EAGER:
|
| + case LAZY:
|
| + case DEBUGGER:
|
| + return FLAG_trace_deopt;
|
| + case OSR:
|
| + return FLAG_trace_osr;
|
| }
|
| UNREACHABLE();
|
| - return NULL;
|
| + return false;
|
| +}
|
| +
|
| +
|
| +const char* Deoptimizer::MessageFor(BailoutType type) {
|
| + switch (type) {
|
| + case EAGER:
|
| + case LAZY:
|
| + return "DEOPT";
|
| + case DEBUGGER:
|
| + return "DEOPT FOR DEBUGGER";
|
| + case OSR:
|
| + return "OSR";
|
| + }
|
| + UNREACHABLE();
|
| + return false;
|
| }
|
|
|
|
|
| @@ -532,38 +527,16 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| deferred_arguments_objects_values_(0),
|
| deferred_arguments_objects_(0),
|
| deferred_heap_numbers_(0) {
|
| - if (FLAG_trace_deopt && type != OSR) {
|
| - if (type == DEBUGGER) {
|
| - PrintF("**** DEOPT FOR DEBUGGER: ");
|
| - } else {
|
| - PrintF("**** DEOPT: ");
|
| - }
|
| - function->PrintName();
|
| - PrintF(" at bailout #%u, address 0x%" V8PRIxPTR ", frame size %d\n",
|
| - bailout_id,
|
| - reinterpret_cast<intptr_t>(from),
|
| - fp_to_sp_delta - (2 * kPointerSize));
|
| - } else if (FLAG_trace_osr && type == OSR) {
|
| - PrintF("**** OSR: ");
|
| - function->PrintName();
|
| - PrintF(" at ast id #%u, address 0x%" V8PRIxPTR ", frame size %d\n",
|
| - bailout_id,
|
| - reinterpret_cast<intptr_t>(from),
|
| - fp_to_sp_delta - (2 * kPointerSize));
|
| - }
|
| - // For COMPILED_STUBs called from builtins, the function pointer
|
| - // is a SMI indicating an internal frame.
|
| + // For COMPILED_STUBs called from builtins, the function pointer is a SMI
|
| + // indicating an internal frame.
|
| if (function->IsSmi()) {
|
| function = NULL;
|
| }
|
| if (function != NULL && function->IsOptimized()) {
|
| function->shared()->increment_deopt_count();
|
| }
|
| - compiled_code_ =
|
| - FindOptimizedCode(isolate, function, type, from, optimized_code);
|
| - if (FLAG_trace_deopt && type == EAGER) {
|
| - compiled_code_->PrintDeoptLocation(bailout_id);
|
| - }
|
| + compiled_code_ = FindOptimizedCode(function, optimized_code);
|
| + if (TraceEnabledFor(type)) Trace();
|
| ASSERT(HEAP->allow_allocation(false));
|
| unsigned size = ComputeInputFrameSize();
|
| input_ = new(size) FrameDescription(size, function);
|
| @@ -571,6 +544,57 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| }
|
|
|
|
|
| +Code* Deoptimizer::FindOptimizedCode(JSFunction* function,
|
| + Code* optimized_code) {
|
| + switch (bailout_type_) {
|
| + case Deoptimizer::EAGER:
|
| + ASSERT(from_ == NULL);
|
| + return function->code();
|
| + case Deoptimizer::LAZY: {
|
| + Code* compiled_code =
|
| + isolate_->deoptimizer_data()->FindDeoptimizingCode(from_);
|
| + return (compiled_code == NULL)
|
| + ? static_cast<Code*>(isolate_->heap()->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;
|
| + }
|
| + UNREACHABLE();
|
| + return NULL;
|
| +}
|
| +
|
| +
|
| +void Deoptimizer::Trace() {
|
| + PrintF("**** %s: ", Deoptimizer::MessageFor(bailout_type_));
|
| + PrintFunctionName();
|
| + PrintF(" at id #%u, address 0x%" V8PRIxPTR ", frame size %d\n",
|
| + bailout_id_,
|
| + reinterpret_cast<intptr_t>(from_),
|
| + fp_to_sp_delta_ - (2 * kPointerSize));
|
| + if (bailout_type_ == EAGER) compiled_code_->PrintDeoptLocation(bailout_id_);
|
| +}
|
| +
|
| +
|
| +void Deoptimizer::PrintFunctionName() {
|
| + if (function_->IsJSFunction()) {
|
| + function_->PrintName();
|
| + } else {
|
| + PrintF("%s", Code::Kind2String(compiled_code_->kind()));
|
| + }
|
| +}
|
| +
|
| +
|
| Deoptimizer::~Deoptimizer() {
|
| ASSERT(input_ == NULL && output_ == NULL);
|
| }
|
| @@ -681,7 +705,7 @@ void Deoptimizer::DoComputeOutputFrames() {
|
| PrintF("[deoptimizing%s: begin 0x%08" V8PRIxPTR " ",
|
| (bailout_type_ == LAZY ? " (lazy)" : ""),
|
| reinterpret_cast<intptr_t>(function_));
|
| - function_->PrintName();
|
| + PrintFunctionName();
|
| PrintF(" @%d]\n", bailout_id_);
|
| }
|
|
|
| @@ -761,7 +785,7 @@ void Deoptimizer::DoComputeOutputFrames() {
|
| JSFunction* function = output_[index]->GetFunction();
|
| PrintF("[deoptimizing: end 0x%08" V8PRIxPTR " ",
|
| reinterpret_cast<intptr_t>(function));
|
| - function->PrintName();
|
| + if (function != NULL) function->PrintName();
|
| PrintF(" => node=%d, pc=0x%08" V8PRIxPTR ", state=%s, alignment=%s,"
|
| " took %0.3f ms]\n",
|
| node_id.ToInt(),
|
|
|