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
17namespace v8 {
18namespace internal {
19
20class BasicBlockProfiler {
21 public:
22 class Data {
23 public:
24 size_t n_blocks() const { return n_blocks_; }
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() = default;
40
41 V8_EXPORT_PRIVATE 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() = default;
55 ~BasicBlockProfiler();
56
57 V8_EXPORT_PRIVATE static BasicBlockProfiler* Get();
58 Data* NewData(size_t n_blocks);
59 V8_EXPORT_PRIVATE void ResetCounts();
60
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
73V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
74 const BasicBlockProfiler& s);
75std::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