• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_BASIC_BLOCK_PROFILER_H_
6 #define V8_BASIC_BLOCK_PROFILER_H_
7 
8 #include <iosfwd>
9 #include <list>
10 #include <string>
11 #include <vector>
12 
13 #include "src/base/macros.h"
14 
15 namespace v8 {
16 namespace internal {
17 
18 class BasicBlockProfiler {
19  public:
20   class Data {
21    public:
n_blocks()22     size_t n_blocks() const { return n_blocks_; }
counts()23     const uint32_t* counts() const { return &counts_[0]; }
24 
25     void SetCode(std::ostringstream* os);
26     void SetFunctionName(std::ostringstream* os);
27     void SetSchedule(std::ostringstream* os);
28     void SetBlockId(size_t offset, size_t block_id);
29     uint32_t* GetCounterAddress(size_t offset);
30 
31    private:
32     friend class BasicBlockProfiler;
33     friend std::ostream& operator<<(std::ostream& os,
34                                     const BasicBlockProfiler::Data& s);
35 
36     explicit Data(size_t n_blocks);
37     ~Data();
38 
39     void ResetCounts();
40 
41     const size_t n_blocks_;
42     std::vector<size_t> block_ids_;
43     std::vector<uint32_t> counts_;
44     std::string function_name_;
45     std::string schedule_;
46     std::string code_;
47     DISALLOW_COPY_AND_ASSIGN(Data);
48   };
49 
50   typedef std::list<Data*> DataList;
51 
52   BasicBlockProfiler();
53   ~BasicBlockProfiler();
54 
55   Data* NewData(size_t n_blocks);
56   void ResetCounts();
57 
data_list()58   const DataList* data_list() { return &data_list_; }
59 
60  private:
61   friend std::ostream& operator<<(std::ostream& os,
62                                   const BasicBlockProfiler& s);
63 
64   DataList data_list_;
65 
66   DISALLOW_COPY_AND_ASSIGN(BasicBlockProfiler);
67 };
68 
69 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler& s);
70 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler::Data& s);
71 
72 }  // namespace internal
73 }  // namespace v8
74 
75 #endif  // V8_BASIC_BLOCK_PROFILER_H_
76