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 #include "src/base/platform/mutex.h"
15 #include "src/globals.h"
16 
17 namespace v8 {
18 namespace internal {
19 
20 class BasicBlockProfiler {
21  public:
22   class Data {
23    public:
n_blocks()24     size_t n_blocks() const { return n_blocks_; }
counts()25     const uint32_t* counts() const { return &counts_[0]; }
26 
27     void SetCode(std::ostringstream* os);
28     void SetFunctionName(std::unique_ptr<char[]> name);
29     void SetSchedule(std::ostringstream* os);
30     void SetBlockRpoNumber(size_t offset, int32_t block_rpo);
31     intptr_t GetCounterAddress(size_t offset);
32 
33    private:
34     friend class BasicBlockProfiler;
35     friend std::ostream& operator<<(std::ostream& os,
36                                     const BasicBlockProfiler::Data& s);
37 
38     explicit Data(size_t n_blocks);
39     ~Data();
40 
41     void ResetCounts();
42 
43     const size_t n_blocks_;
44     std::vector<int32_t> block_rpo_numbers_;
45     std::vector<uint32_t> counts_;
46     std::string function_name_;
47     std::string schedule_;
48     std::string code_;
49     DISALLOW_COPY_AND_ASSIGN(Data);
50   };
51 
52   typedef std::list<Data*> DataList;
53 
54   BasicBlockProfiler();
55   ~BasicBlockProfiler();
56 
57   V8_EXPORT_PRIVATE static BasicBlockProfiler* Get();
58   Data* NewData(size_t n_blocks);
59   void ResetCounts();
60 
data_list()61   const DataList* data_list() { return &data_list_; }
62 
63  private:
64   friend V8_EXPORT_PRIVATE std::ostream& operator<<(
65       std::ostream& os, const BasicBlockProfiler& s);
66 
67   DataList data_list_;
68   base::Mutex data_list_mutex_;
69 
70   DISALLOW_COPY_AND_ASSIGN(BasicBlockProfiler);
71 };
72 
73 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
74                                            const BasicBlockProfiler& s);
75 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler::Data& s);
76 
77 }  // namespace internal
78 }  // namespace v8
79 
80 #endif  // V8_BASIC_BLOCK_PROFILER_H_
81