Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_COMPILER_H_ | 5 #ifndef V8_COMPILER_H_ |
| 6 #define V8_COMPILER_H_ | 6 #define V8_COMPILER_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 561 int osr_expr_stack_height_; | 561 int osr_expr_stack_height_; |
| 562 | 562 |
| 563 // The current OSR frame for specialization or {nullptr}. | 563 // The current OSR frame for specialization or {nullptr}. |
| 564 JavaScriptFrame* osr_frame_ = nullptr; | 564 JavaScriptFrame* osr_frame_ = nullptr; |
| 565 | 565 |
| 566 const char* debug_name_; | 566 const char* debug_name_; |
| 567 | 567 |
| 568 DISALLOW_COPY_AND_ASSIGN(CompilationInfo); | 568 DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
| 569 }; | 569 }; |
| 570 | 570 |
| 571 | 571 // A base class for compilation jobs intended to concurrent to the main thread. |
|
ahaas
2016/04/08 12:24:39
intended to RUN concurrent ...
Michael Starzinger
2016/04/08 16:44:57
Done.
| |
| 572 class HGraph; | 572 // The job is split into three phases which are called in sequence on different |
| 573 class LChunk; | 573 // threads and with different limitations: |
| 574 | 574 // 1) CreateGraph: Runs on main thread. No major limitations. |
| 575 // A helper class that calls the three compilation phases in | 575 // 2) OptimizeGraph: Runs concurrently. No heap allocation or handle derefs. |
| 576 // Crankshaft and keeps track of its state. The three phases | 576 // 3) GenerateCode: Runs on main thread. No dependency changes. |
| 577 // CreateGraph, OptimizeGraph and GenerateAndInstallCode can either | 577 // |
| 578 // fail, bail-out to the full code generator or succeed. Apart from | 578 // Each of the three phases can either fail, bail-out to full code generator or |
| 579 // their return value, the status of the phase last run can be checked | 579 // succeed. Apart from their return value, the status of the phase last run can |
| 580 // using last_status(). | 580 // be checked using {last_status()} as well. |
| 581 class OptimizedCompileJob: public ZoneObject { | 581 class OptimizedCompileJob: public ZoneObject { |
| 582 public: | 582 public: |
| 583 explicit OptimizedCompileJob(CompilationInfo* info) | 583 explicit OptimizedCompileJob(CompilationInfo* info) |
| 584 : info_(info), graph_(NULL), chunk_(NULL), last_status_(FAILED) {} | 584 : info_(info), last_status_(SUCCEEDED) {} |
| 585 virtual ~OptimizedCompileJob() {} | |
| 585 | 586 |
| 586 enum Status { | 587 enum Status { |
| 587 FAILED, BAILED_OUT, SUCCEEDED | 588 FAILED, BAILED_OUT, SUCCEEDED |
| 588 }; | 589 }; |
| 589 | 590 |
| 590 MUST_USE_RESULT Status CreateGraph(); | 591 MUST_USE_RESULT Status CreateGraph(); |
| 591 MUST_USE_RESULT Status OptimizeGraph(); | 592 MUST_USE_RESULT Status OptimizeGraph(); |
| 592 MUST_USE_RESULT Status GenerateCode(); | 593 MUST_USE_RESULT Status GenerateCode(); |
| 593 | 594 |
| 594 Status last_status() const { return last_status_; } | 595 Status last_status() const { return last_status_; } |
| 595 CompilationInfo* info() const { return info_; } | 596 CompilationInfo* info() const { return info_; } |
| 596 Isolate* isolate() const { return info()->isolate(); } | 597 Isolate* isolate() const { return info()->isolate(); } |
| 597 | 598 |
| 598 Status RetryOptimization(BailoutReason reason) { | 599 Status RetryOptimization(BailoutReason reason) { |
| 599 info_->RetryOptimization(reason); | 600 info_->RetryOptimization(reason); |
| 600 return SetLastStatus(BAILED_OUT); | 601 return SetLastStatus(BAILED_OUT); |
| 601 } | 602 } |
| 602 | 603 |
| 603 Status AbortOptimization(BailoutReason reason) { | 604 Status AbortOptimization(BailoutReason reason) { |
| 604 info_->AbortOptimization(reason); | 605 info_->AbortOptimization(reason); |
| 605 return SetLastStatus(BAILED_OUT); | 606 return SetLastStatus(BAILED_OUT); |
| 606 } | 607 } |
| 607 | 608 |
| 609 void RecordOptimizationStats(); | |
| 610 | |
| 611 protected: | |
| 612 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code); | |
| 613 | |
| 614 // Overridden by the actual implementation. | |
| 615 virtual Status CreateGraphImpl() = 0; | |
| 616 virtual Status OptimizeGraphImpl() = 0; | |
| 617 virtual Status GenerateCodeImpl() = 0; | |
| 618 | |
| 608 private: | 619 private: |
| 609 CompilationInfo* info_; | 620 CompilationInfo* info_; |
| 610 HGraph* graph_; | |
| 611 LChunk* chunk_; | |
| 612 base::TimeDelta time_taken_to_create_graph_; | 621 base::TimeDelta time_taken_to_create_graph_; |
| 613 base::TimeDelta time_taken_to_optimize_; | 622 base::TimeDelta time_taken_to_optimize_; |
| 614 base::TimeDelta time_taken_to_codegen_; | 623 base::TimeDelta time_taken_to_codegen_; |
| 615 Status last_status_; | 624 Status last_status_; |
| 616 | 625 |
| 617 MUST_USE_RESULT Status SetLastStatus(Status status) { | 626 MUST_USE_RESULT Status SetLastStatus(Status status) { |
| 618 last_status_ = status; | 627 last_status_ = status; |
| 619 return last_status_; | 628 return last_status_; |
| 620 } | 629 } |
| 621 void RecordOptimizationStats(); | |
| 622 | |
| 623 struct Timer { | |
| 624 Timer(OptimizedCompileJob* job, base::TimeDelta* location) | |
| 625 : job_(job), location_(location) { | |
| 626 DCHECK(location_ != NULL); | |
| 627 timer_.Start(); | |
| 628 } | |
| 629 | |
| 630 ~Timer() { | |
| 631 *location_ += timer_.Elapsed(); | |
| 632 } | |
| 633 | |
| 634 OptimizedCompileJob* job_; | |
| 635 base::ElapsedTimer timer_; | |
| 636 base::TimeDelta* location_; | |
| 637 }; | |
| 638 }; | 630 }; |
| 639 | 631 |
| 640 } // namespace internal | 632 } // namespace internal |
| 641 } // namespace v8 | 633 } // namespace v8 |
| 642 | 634 |
| 643 #endif // V8_COMPILER_H_ | 635 #endif // V8_COMPILER_H_ |
| OLD | NEW |