34 const std::unordered_map<uint32_t, FunctionTypeFeedback>&
35 feedback_for_function =
module_->type_feedback.feedback_for_function;
39 std::vector<uint32_t> ordered_function_indexes;
40 ordered_function_indexes.reserve(feedback_for_function.size());
41 for (
const auto& entry : feedback_for_function) {
43 if (entry.second.feedback_vector.empty())
continue;
44 ordered_function_indexes.push_back(entry.first);
46 std::sort(ordered_function_indexes.begin(), ordered_function_indexes.end());
48 buffer.
write_u32v(
static_cast<uint32_t
>(ordered_function_indexes.size()));
49 for (
const uint32_t func_index : ordered_function_indexes) {
53 feedback_for_function.at(func_index);
54 buffer.
write_u32v(
static_cast<uint32_t
>(feedback.feedback_vector.size()));
56 feedback.feedback_vector) {
57 int cases = call_site_feedback.
num_cases();
59 for (
int i = 0;
i < cases; ++
i) {
65 buffer.
write_u32v(
static_cast<uint32_t
>(feedback.call_targets.size()));
66 for (uint32_t call_target : feedback.call_targets) {
73 const std::unordered_map<uint32_t, FunctionTypeFeedback>&
74 feedback_for_function =
module_->type_feedback.feedback_for_function;
75 const uint32_t initial_budget =
v8_flags.wasm_tiering_budget;
76 for (uint32_t declared_index = 0;
77 declared_index <
module_->num_declared_functions; ++declared_index) {
78 uint32_t func_index = declared_index +
module_->num_imported_functions;
79 auto feedback_it = feedback_for_function.find(func_index);
80 int prio = feedback_it == feedback_for_function.end()
82 : feedback_it->second.tierup_priority;
84 uint32_t remaining_budget =
86 DCHECK_GE(initial_budget, remaining_budget);
88 bool was_tiered_up = prio > 0;
89 bool was_executed = was_tiered_up || remaining_budget != initial_budget;
107 std::unordered_map<uint32_t, FunctionTypeFeedback>& feedback_for_function =
108 module->type_feedback.feedback_for_function;
109 uint32_t num_entries = decoder.
consume_u32v(
"num function entries");
111 for (uint32_t missing_entries = num_entries; missing_entries > 0;
114 uint32_t function_index = decoder.
consume_u32v(
"function index");
116 uint32_t feedback_vector_size =
120 feedback_vector_size);
123 if (num_cases == 0)
continue;
124 if (num_cases == 1) {
125 int called_function_index = decoder.
consume_i32v(
"function index");
130 for (
int i = 0;
i < num_cases; ++
i) {
131 polymorphic[
i].function_index =
133 polymorphic[
i].absolute_call_frequency =
140 uint32_t num_call_targets = decoder.
consume_u32v(
"num call targets");
143 for (uint32_t& call_target : function_feedback.
call_targets) {
149 auto [feedback_it, is_new] = feedback_for_function.emplace(
150 function_index, std::move(function_feedback));
165 std::vector<uint32_t> executed_functions;
166 std::vector<uint32_t> tiered_up_functions;
167 uint32_t
start =
module->num_imported_functions;
169 for (uint32_t func_index =
start; func_index <
end; ++func_index) {
170 uint8_t tiering_info = decoder.
consume_u8(
"tiering info");
174 if (was_tiered_up) tiered_up_functions.push_back(func_index);
175 if (was_executed) executed_functions.push_back(func_index);
178 return std::make_unique<ProfileInformation>(std::move(executed_functions),
179 std::move(tiered_up_functions));
187 std::unique_ptr<ProfileInformation> pgo_info =
205 SNPrintF(
filename,
"profile-wasm-%08x", hash);
211 "Dumping Wasm PGO data to file '%s' (module size %zu, %u declared "
212 "functions, %zu bytes PGO data)\n",
214 profile_data.
size());
216 size_t written = fwrite(profile_data.
begin(), 1, profile_data.
size(), file);
230 SNPrintF(
filename,
"profile-wasm-%08x", hash);
234 PrintF(
"No Wasm PGO data found: Cannot open file '%s'\n",
filename.begin());
238 fseek(file, 0, SEEK_END);
239 size_t size = ftell(file);
242 PrintF(
"Loading Wasm PGO data from file '%s' (%zu bytes)\n",
filename.begin(),
246 for (
size_t read = 0; read <
size;) {
247 read += fread(profile_data.
begin() + read, 1, size - read, file);
248 CHECK(!ferror(file));
static FILE * FOpen(const char *path, const char *mode)
constexpr T * begin() const
constexpr size_t size() const
Vector< T > as_vector() const
static OwnedVector< T > NewForOverwrite(size_t size)
constexpr bool empty() const
constexpr size_t size() const
constexpr T * begin() const
constexpr T * end() const
int call_count(int i) const
int function_index(int i) const
int32_t consume_i32v(const char *name="var_int32")
const uint8_t * pc() const
uint32_t consume_u32v(const char *name="var_uint32")
uint8_t consume_u8(const char *name="uint8_t")
const uint8_t * end() const
void SerializeTypeFeedback(ZoneBuffer &buffer)
ProfileGenerator(const WasmModule *module, const std::atomic< uint32_t > *tiering_budget_array)
const std::atomic< uint32_t > *const tiering_budget_array_
base::OwnedVector< uint8_t > GetProfileData()
const WasmModule * module_
AccountingAllocator allocator_
void SerializeTieringInfo(ZoneBuffer &buffer)
base::MutexGuard type_feedback_mutex_guard_
void write_i32v(int32_t val)
void write_u32v(uint32_t val)
OwnedVector< T > OwnedCopyOf(const T *data, size_t size)
void DeserializeTypeFeedback(Decoder &decoder, const WasmModule *module)
constexpr uint8_t kFunctionExecutedBit
constexpr uint8_t kFunctionTieredUpBit
size_t GetWireBytesHash(base::Vector< const uint8_t > wire_bytes)
std::unique_ptr< ProfileInformation > DeserializeTieringInformation(Decoder &decoder, const WasmModule *module)
std::unique_ptr< ProfileInformation > RestoreProfileData(const WasmModule *module, base::Vector< uint8_t > profile_data)
void DumpProfileToFile(const WasmModule *module, base::Vector< const uint8_t > wire_bytes, std::atomic< uint32_t > *tiering_budget_array)
std::unique_ptr< ProfileInformation > LoadProfileFromFile(const WasmModule *module, base::Vector< const uint8_t > wire_bytes)
void PrintF(const char *format,...)
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset tiering_budget_array
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_LE(v1, v2)
#define CHECK_LE(lhs, rhs)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
base::OwnedVector< uint32_t > call_targets
base::OwnedVector< CallSiteFeedback > feedback_vector
uint32_t num_declared_functions