1 // Copyright 2020 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_BUILTINS_PROFILE_DATA_READER_H_
6 #define V8_BUILTINS_PROFILE_DATA_READER_H_
7 
8 #include <cstddef>
9 #include <cstdint>
10 #include <vector>
11 
12 namespace v8 {
13 namespace internal {
14 
15 class ProfileDataFromFile {
16  public:
17   // A hash of the function's Graph before scheduling. Allows us to avoid using
18   // profiling data if the function has been changed.
hash()19   int hash() const { return hash_; }
20 
21   // Returns how many times the block with the given ID was executed during
22   // profiling.
GetCounter(size_t block_id)23   uint32_t GetCounter(size_t block_id) const {
24     // The profile data is allowed to omit blocks which were never hit, so be
25     // careful to avoid out-of-bounds access.
26     return block_id < block_counts_by_id_.size() ? block_counts_by_id_[block_id]
27                                                  : 0;
28   }
29 
30   // Load basic block profiling data for the builtin with the given name, if
31   // such data exists. The returned vector is indexed by block ID, and its
32   // values are the number of times each block was executed while profiling.
33   static const ProfileDataFromFile* TryRead(const char* name);
34 
35  protected:
36   int hash_ = 0;
37 
38   // How many times each block was executed, indexed by block ID. This vector
39   // may be shorter than the total number of blocks; any omitted block should be
40   // treated as a zero.
41   std::vector<uint32_t> block_counts_by_id_;
42 };
43 
44 // The following strings can't be static members of ProfileDataFromFile until
45 // C++ 17; see https://stackoverflow.com/q/8016780/839379 . So for now we use a
46 // namespace.
47 namespace ProfileDataFromFileConstants {
48 
49 // Any line in a v8.log beginning with this string represents a basic block
50 // counter.
51 static constexpr char kBlockCounterMarker[] = "block";
52 
53 // Any line in a v8.log beginning with this string represents the hash of the
54 // function Graph for a builtin.
55 static constexpr char kBuiltinHashMarker[] = "builtin_hash";
56 
57 }  // namespace ProfileDataFromFileConstants
58 
59 }  // namespace internal
60 }  // namespace v8
61 
62 #endif  // V8_BUILTINS_PROFILE_DATA_READER_H_
63