Commit 9fe53c4f authored by Camillo Bruni's avatar Camillo Bruni Committed by V8 LUCI CQ

[flags] Skip --random-seed in FlagList::Hash

Node and friends use --random-seed to temporary reset the seed for
predictable code-cache creation. To allow custom random seeds at runtime
the flag is reset for encoding the FlagList::Hash in the snapshots.

We will soon disallow changing flags via the API after V8 has been
initialized. In order to make node work we will exclude --random-seed
from the FlagList::Hash calculation.

Drive-by-fix:
* Lazily initialize flag_hash instead of calculating it after every call
  to SetFlagsFromString / EnforceFlagImplications.
* Simplify hash string source creation since out << flag now includes
  the full flag information

Bug: v8:12309
Change-Id: I1a168f4702d8c4d160ff12fdbea881731e4ea8b6
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3218159Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#77345}
parent 3f31ffd0
...@@ -796,23 +796,16 @@ static uint32_t flag_hash = 0; ...@@ -796,23 +796,16 @@ static uint32_t flag_hash = 0;
void ComputeFlagListHash() { void ComputeFlagListHash() {
std::ostringstream modified_args_as_string; std::ostringstream modified_args_as_string;
if (COMPRESS_POINTERS_BOOL) { if (COMPRESS_POINTERS_BOOL) modified_args_as_string << "ptr-compr";
modified_args_as_string << "ptr-compr"; if (DEBUG_BOOL) modified_args_as_string << "debug";
} for (const Flag& flag : flags) {
if (DEBUG_BOOL) { if (flag.IsDefault()) continue;
modified_args_as_string << "debug";
}
for (size_t i = 0; i < num_flags; ++i) {
Flag* current = &flags[i];
if (current->PointsTo(&FLAG_profile_deserialization)) {
// We want to be able to flip --profile-deserialization without // We want to be able to flip --profile-deserialization without
// causing the code cache to get invalidated by this hash. // causing the code cache to get invalidated by this hash.
continue; if (flag.PointsTo(&FLAG_profile_deserialization)) continue;
} // Skip FLAG_random_seed to allow predictable code caching.
if (!current->IsDefault()) { if (flag.PointsTo(&FLAG_random_seed)) continue;
modified_args_as_string << i; modified_args_as_string << flag;
modified_args_as_string << *current;
}
} }
std::string args(modified_args_as_string.str()); std::string args(modified_args_as_string.str());
flag_hash = static_cast<uint32_t>( flag_hash = static_cast<uint32_t>(
...@@ -837,6 +830,7 @@ bool TriggerImplication(bool premise, const char* premise_name, ...@@ -837,6 +830,7 @@ bool TriggerImplication(bool premise, const char* premise_name,
// static // static
void FlagList::EnforceFlagImplications() { void FlagList::EnforceFlagImplications() {
flag_hash = 0;
bool changed; bool changed;
do { do {
changed = false; changed = false;
...@@ -844,10 +838,14 @@ void FlagList::EnforceFlagImplications() { ...@@ -844,10 +838,14 @@ void FlagList::EnforceFlagImplications() {
#include "src/flags/flag-definitions.h" // NOLINT(build/include) #include "src/flags/flag-definitions.h" // NOLINT(build/include)
#undef FLAG_MODE_DEFINE_IMPLICATIONS #undef FLAG_MODE_DEFINE_IMPLICATIONS
} while (changed); } while (changed);
ComputeFlagListHash();
} }
uint32_t FlagList::Hash() { return flag_hash; } uint32_t FlagList::Hash() {
if (flag_hash == 0) {
ComputeFlagListHash();
}
return flag_hash;
}
#undef FLAG_MODE_DEFINE #undef FLAG_MODE_DEFINE
#undef FLAG_MODE_DEFINE_DEFAULTS #undef FLAG_MODE_DEFINE_DEFAULTS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment