blob: 18490141d16f58ef4a142f6a6fbdefd8bbf4d38a [file] [log] [blame]
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_BUILTINS_PROFILE_DATA_READER_H_
#define V8_BUILTINS_PROFILE_DATA_READER_H_
#include <cstddef>
#include <cstdint>
#include <vector>
namespace v8 {
namespace internal {
class ProfileDataFromFile {
public:
// A hash of the function's Graph before scheduling. Allows us to avoid using
// profiling data if the function has been changed.
int hash() const { return hash_; }
// Returns how many times the block with the given ID was executed during
// profiling.
uint32_t GetCounter(size_t block_id) const {
// The profile data is allowed to omit blocks which were never hit, so be
// careful to avoid out-of-bounds access.
return block_id < block_counts_by_id_.size() ? block_counts_by_id_[block_id]
: 0;
}
// Load basic block profiling data for the builtin with the given name, if
// such data exists. The returned vector is indexed by block ID, and its
// values are the number of times each block was executed while profiling.
static const ProfileDataFromFile* TryRead(const char* name);
protected:
int hash_ = 0;
// How many times each block was executed, indexed by block ID. This vector
// may be shorter than the total number of blocks; any omitted block should be
// treated as a zero.
std::vector<uint32_t> block_counts_by_id_;
};
// The following strings can't be static members of ProfileDataFromFile until
// C++ 17; see https://stackoverflow.com/q/8016780/839379 . So for now we use a
// namespace.
namespace ProfileDataFromFileConstants {
// Any line in a v8.log beginning with this string represents a basic block
// counter.
static constexpr char kBlockCounterMarker[] = "block";
// Any line in a v8.log beginning with this string represents the hash of the
// function Graph for a builtin.
static constexpr char kBuiltinHashMarker[] = "builtin_hash";
} // namespace ProfileDataFromFileConstants
} // namespace internal
} // namespace v8
#endif // V8_BUILTINS_PROFILE_DATA_READER_H_