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: OuterZoneSize()27 size_t OuterZoneSize() { 28 return static_cast<size_t>(outer_zone_->allocation_size()); 29 } 30 31 class CommonStats { 32 public: CommonStats()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 InPhaseKind()45 bool InPhaseKind() { return !phase_kind_stats_.scope_.is_empty(); } 46 void EndPhaseKind(); 47 48 friend class PhaseScope; InPhase()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: PhaseScope(PipelineStatistics * pipeline_stats,const char * name)77 PhaseScope(PipelineStatistics* pipeline_stats, const char* name) 78 : pipeline_stats_(pipeline_stats) { 79 if (pipeline_stats_ != nullptr) pipeline_stats_->BeginPhase(name); 80 } ~PhaseScope()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