Home | History | Annotate | Download | only in compiler
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_COMPILER_PIPELINE_STATISTICS_H_
      6 #define V8_COMPILER_PIPELINE_STATISTICS_H_
      7 
      8 #include <string>
      9 
     10 #include "src/compilation-statistics.h"
     11 #include "src/compiler/zone-pool.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 namespace compiler {
     16 
     17 class PhaseScope;
     18 
     19 class PipelineStatistics : public Malloced {
     20  public:
     21   PipelineStatistics(CompilationInfo* info, ZonePool* zone_pool);
     22   ~PipelineStatistics();
     23 
     24   void BeginPhaseKind(const char* phase_kind_name);
     25 
     26  private:
     27   size_t OuterZoneSize() {
     28     return static_cast<size_t>(outer_zone_->allocation_size());
     29   }
     30 
     31   class CommonStats {
     32    public:
     33     CommonStats() : outer_zone_initial_size_(0) {}
     34 
     35     void Begin(PipelineStatistics* pipeline_stats);
     36     void End(PipelineStatistics* pipeline_stats,
     37              CompilationStatistics::BasicStats* diff);
     38 
     39     base::SmartPointer<ZonePool::StatsScope> scope_;
     40     base::ElapsedTimer timer_;
     41     size_t outer_zone_initial_size_;
     42     size_t allocated_bytes_at_start_;
     43   };
     44 
     45   bool InPhaseKind() { return !phase_kind_stats_.scope_.is_empty(); }
     46   void EndPhaseKind();
     47 
     48   friend class PhaseScope;
     49   bool InPhase() { return !phase_stats_.scope_.is_empty(); }
     50   void BeginPhase(const char* name);
     51   void EndPhase();
     52 
     53   Isolate* isolate_;
     54   Zone* outer_zone_;
     55   ZonePool* zone_pool_;
     56   CompilationStatistics* compilation_stats_;
     57   std::string function_name_;
     58 
     59   // Stats for the entire compilation.
     60   CommonStats total_stats_;
     61   size_t source_size_;
     62 
     63   // Stats for phase kind.
     64   const char* phase_kind_name_;
     65   CommonStats phase_kind_stats_;
     66 
     67   // Stats for phase.
     68   const char* phase_name_;
     69   CommonStats phase_stats_;
     70 
     71   DISALLOW_COPY_AND_ASSIGN(PipelineStatistics);
     72 };
     73 
     74 
     75 class PhaseScope {
     76  public:
     77   PhaseScope(PipelineStatistics* pipeline_stats, const char* name)
     78       : pipeline_stats_(pipeline_stats) {
     79     if (pipeline_stats_ != nullptr) pipeline_stats_->BeginPhase(name);
     80   }
     81   ~PhaseScope() {
     82     if (pipeline_stats_ != nullptr) pipeline_stats_->EndPhase();
     83   }
     84 
     85  private:
     86   PipelineStatistics* const pipeline_stats_;
     87 
     88   DISALLOW_COPY_AND_ASSIGN(PhaseScope);
     89 };
     90 
     91 }  // namespace compiler
     92 }  // namespace internal
     93 }  // namespace v8
     94 
     95 #endif
     96