OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/deoptimizer.h" | 5 #include "src/deoptimizer.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 | 66 |
67 | 67 |
68 // We rely on this function not causing a GC. It is called from generated code | 68 // We rely on this function not causing a GC. It is called from generated code |
69 // without having a real stack frame in place. | 69 // without having a real stack frame in place. |
70 Deoptimizer* Deoptimizer::New(JSFunction* function, | 70 Deoptimizer* Deoptimizer::New(JSFunction* function, |
71 BailoutType type, | 71 BailoutType type, |
72 unsigned bailout_id, | 72 unsigned bailout_id, |
73 Address from, | 73 Address from, |
74 int fp_to_sp_delta, | 74 int fp_to_sp_delta, |
75 Isolate* isolate) { | 75 Isolate* isolate) { |
76 Deoptimizer* deoptimizer = new Deoptimizer(isolate, | 76 Deoptimizer* deoptimizer = new Deoptimizer(isolate, function, type, |
77 function, | 77 bailout_id, from, fp_to_sp_delta); |
78 type, | |
79 bailout_id, | |
80 from, | |
81 fp_to_sp_delta, | |
82 NULL); | |
83 CHECK(isolate->deoptimizer_data()->current_ == NULL); | 78 CHECK(isolate->deoptimizer_data()->current_ == NULL); |
84 isolate->deoptimizer_data()->current_ = deoptimizer; | 79 isolate->deoptimizer_data()->current_ = deoptimizer; |
85 return deoptimizer; | 80 return deoptimizer; |
86 } | 81 } |
87 | 82 |
88 | 83 |
89 // No larger than 2K on all platforms | 84 // No larger than 2K on all platforms |
90 static const int kDeoptTableMaxEpilogueCodeSize = 2 * KB; | 85 static const int kDeoptTableMaxEpilogueCodeSize = 2 * KB; |
91 | 86 |
92 | 87 |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 case EAGER: return "eager"; | 455 case EAGER: return "eager"; |
461 case SOFT: return "soft"; | 456 case SOFT: return "soft"; |
462 case LAZY: return "lazy"; | 457 case LAZY: return "lazy"; |
463 } | 458 } |
464 FATAL("Unsupported deopt type"); | 459 FATAL("Unsupported deopt type"); |
465 return NULL; | 460 return NULL; |
466 } | 461 } |
467 | 462 |
468 Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction* function, | 463 Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction* function, |
469 BailoutType type, unsigned bailout_id, Address from, | 464 BailoutType type, unsigned bailout_id, Address from, |
470 int fp_to_sp_delta, Code* optimized_code) | 465 int fp_to_sp_delta) |
471 : isolate_(isolate), | 466 : isolate_(isolate), |
472 function_(function), | 467 function_(function), |
473 bailout_id_(bailout_id), | 468 bailout_id_(bailout_id), |
474 bailout_type_(type), | 469 bailout_type_(type), |
475 from_(from), | 470 from_(from), |
476 fp_to_sp_delta_(fp_to_sp_delta), | 471 fp_to_sp_delta_(fp_to_sp_delta), |
477 deoptimizing_throw_(false), | 472 deoptimizing_throw_(false), |
478 catch_handler_data_(-1), | 473 catch_handler_data_(-1), |
479 catch_handler_pc_offset_(-1), | 474 catch_handler_pc_offset_(-1), |
480 input_(nullptr), | 475 input_(nullptr), |
(...skipping 22 matching lines...) Expand all Loading... |
503 function->shared()->increment_deopt_count(); | 498 function->shared()->increment_deopt_count(); |
504 if (bailout_type_ == Deoptimizer::SOFT) { | 499 if (bailout_type_ == Deoptimizer::SOFT) { |
505 isolate->counters()->soft_deopts_executed()->Increment(); | 500 isolate->counters()->soft_deopts_executed()->Increment(); |
506 // Soft deopts shouldn't count against the overall re-optimization count | 501 // Soft deopts shouldn't count against the overall re-optimization count |
507 // that can eventually lead to disabling optimization for a function. | 502 // that can eventually lead to disabling optimization for a function. |
508 int opt_count = function->shared()->opt_count(); | 503 int opt_count = function->shared()->opt_count(); |
509 if (opt_count > 0) opt_count--; | 504 if (opt_count > 0) opt_count--; |
510 function->shared()->set_opt_count(opt_count); | 505 function->shared()->set_opt_count(opt_count); |
511 } | 506 } |
512 } | 507 } |
513 compiled_code_ = FindOptimizedCode(function, optimized_code); | 508 compiled_code_ = FindOptimizedCode(function); |
514 #if DEBUG | 509 #if DEBUG |
515 DCHECK(compiled_code_ != NULL); | 510 DCHECK(compiled_code_ != NULL); |
516 if (type == EAGER || type == SOFT || type == LAZY) { | 511 if (type == EAGER || type == SOFT || type == LAZY) { |
517 DCHECK(compiled_code_->kind() != Code::FUNCTION); | 512 DCHECK(compiled_code_->kind() != Code::FUNCTION); |
518 } | 513 } |
519 #endif | 514 #endif |
520 | 515 |
521 StackFrame::Type frame_type = function == NULL | 516 StackFrame::Type frame_type = function == NULL |
522 ? StackFrame::STUB | 517 ? StackFrame::STUB |
523 : StackFrame::JAVA_SCRIPT; | 518 : StackFrame::JAVA_SCRIPT; |
524 trace_scope_ = TraceEnabledFor(type, frame_type) ? | 519 trace_scope_ = TraceEnabledFor(type, frame_type) ? |
525 new CodeTracer::Scope(isolate->GetCodeTracer()) : NULL; | 520 new CodeTracer::Scope(isolate->GetCodeTracer()) : NULL; |
526 #ifdef DEBUG | 521 #ifdef DEBUG |
527 CHECK(AllowHeapAllocation::IsAllowed()); | 522 CHECK(AllowHeapAllocation::IsAllowed()); |
528 disallow_heap_allocation_ = new DisallowHeapAllocation(); | 523 disallow_heap_allocation_ = new DisallowHeapAllocation(); |
529 #endif // DEBUG | 524 #endif // DEBUG |
530 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { | 525 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { |
531 PROFILE(isolate_, CodeDeoptEvent(compiled_code_, from_, fp_to_sp_delta_)); | 526 PROFILE(isolate_, CodeDeoptEvent(compiled_code_, from_, fp_to_sp_delta_)); |
532 } | 527 } |
533 unsigned size = ComputeInputFrameSize(); | 528 unsigned size = ComputeInputFrameSize(); |
534 int parameter_count = | 529 int parameter_count = |
535 function == nullptr | 530 function == nullptr |
536 ? 0 | 531 ? 0 |
537 : (function->shared()->internal_formal_parameter_count() + 1); | 532 : (function->shared()->internal_formal_parameter_count() + 1); |
538 input_ = new (size) FrameDescription(size, parameter_count); | 533 input_ = new (size) FrameDescription(size, parameter_count); |
539 input_->SetFrameType(frame_type); | 534 input_->SetFrameType(frame_type); |
540 } | 535 } |
541 | 536 |
542 | 537 Code* Deoptimizer::FindOptimizedCode(JSFunction* function) { |
543 Code* Deoptimizer::FindOptimizedCode(JSFunction* function, | |
544 Code* optimized_code) { | |
545 switch (bailout_type_) { | 538 switch (bailout_type_) { |
546 case Deoptimizer::SOFT: | 539 case Deoptimizer::SOFT: |
547 case Deoptimizer::EAGER: | 540 case Deoptimizer::EAGER: |
548 case Deoptimizer::LAZY: { | 541 case Deoptimizer::LAZY: { |
549 Code* compiled_code = FindDeoptimizingCode(from_); | 542 Code* compiled_code = FindDeoptimizingCode(from_); |
550 return (compiled_code == NULL) | 543 return (compiled_code == NULL) |
551 ? static_cast<Code*>(isolate_->FindCodeObject(from_)) | 544 ? static_cast<Code*>(isolate_->FindCodeObject(from_)) |
552 : compiled_code; | 545 : compiled_code; |
553 } | 546 } |
554 } | 547 } |
(...skipping 3451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4006 CHECK(value_info->IsMaterializedObject()); | 3999 CHECK(value_info->IsMaterializedObject()); |
4007 | 4000 |
4008 value_info->value_ = | 4001 value_info->value_ = |
4009 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 4002 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
4010 } | 4003 } |
4011 } | 4004 } |
4012 } | 4005 } |
4013 | 4006 |
4014 } // namespace internal | 4007 } // namespace internal |
4015 } // namespace v8 | 4008 } // namespace v8 |
OLD | NEW |