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 <memory>
9#include <string>
10
11#include "src/base/platform/elapsed-timer.h"
12#include "src/compilation-statistics.h"
13#include "src/compiler/zone-stats.h"
14
15namespace v8 {
16namespace internal {
17namespace compiler {
18
19class PhaseScope;
20
21class PipelineStatistics : public Malloced {
22 public:
23  PipelineStatistics(CompilationInfo* info, ZoneStats* zone_stats);
24  ~PipelineStatistics();
25
26  void BeginPhaseKind(const char* phase_kind_name);
27  void EndPhaseKind();
28
29 private:
30  size_t OuterZoneSize() {
31    return static_cast<size_t>(outer_zone_->allocation_size());
32  }
33
34  class CommonStats {
35   public:
36    CommonStats() : outer_zone_initial_size_(0) {}
37
38    void Begin(PipelineStatistics* pipeline_stats);
39    void End(PipelineStatistics* pipeline_stats,
40             CompilationStatistics::BasicStats* diff);
41
42    std::unique_ptr<ZoneStats::StatsScope> scope_;
43    base::ElapsedTimer timer_;
44    size_t outer_zone_initial_size_;
45    size_t allocated_bytes_at_start_;
46
47   private:
48    DISALLOW_COPY_AND_ASSIGN(CommonStats);
49  };
50
51  bool InPhaseKind() { return !!phase_kind_stats_.scope_; }
52
53  friend class PhaseScope;
54  bool InPhase() { return !!phase_stats_.scope_; }
55  void BeginPhase(const char* name);
56  void EndPhase();
57
58  Isolate* isolate_;
59  Zone* outer_zone_;
60  ZoneStats* zone_stats_;
61  CompilationStatistics* compilation_stats_;
62  std::string function_name_;
63
64  // Stats for the entire compilation.
65  CommonStats total_stats_;
66  size_t source_size_;
67
68  // Stats for phase kind.
69  const char* phase_kind_name_;
70  CommonStats phase_kind_stats_;
71
72  // Stats for phase.
73  const char* phase_name_;
74  CommonStats phase_stats_;
75
76  DISALLOW_COPY_AND_ASSIGN(PipelineStatistics);
77};
78
79
80class PhaseScope {
81 public:
82  PhaseScope(PipelineStatistics* pipeline_stats, const char* name)
83      : pipeline_stats_(pipeline_stats) {
84    if (pipeline_stats_ != nullptr) pipeline_stats_->BeginPhase(name);
85  }
86  ~PhaseScope() {
87    if (pipeline_stats_ != nullptr) pipeline_stats_->EndPhase();
88  }
89
90 private:
91  PipelineStatistics* const pipeline_stats_;
92
93  DISALLOW_COPY_AND_ASSIGN(PhaseScope);
94};
95
96}  // namespace compiler
97}  // namespace internal
98}  // namespace v8
99
100#endif
101