[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/+/3218159
Reviewed-by: Marja Hölttä <marja@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#77345}
This commit is contained in:
Camillo Bruni 2021-10-12 12:47:48 +02:00 committed by V8 LUCI CQ
parent 3f31ffd019
commit 9fe53c4f0b

View File

@ -796,23 +796,16 @@ static uint32_t flag_hash = 0;
void ComputeFlagListHash() {
std::ostringstream modified_args_as_string;
if (COMPRESS_POINTERS_BOOL) {
modified_args_as_string << "ptr-compr";
}
if (DEBUG_BOOL) {
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
// causing the code cache to get invalidated by this hash.
continue;
}
if (!current->IsDefault()) {
modified_args_as_string << i;
modified_args_as_string << *current;
}
if (COMPRESS_POINTERS_BOOL) modified_args_as_string << "ptr-compr";
if (DEBUG_BOOL) modified_args_as_string << "debug";
for (const Flag& flag : flags) {
if (flag.IsDefault()) continue;
// We want to be able to flip --profile-deserialization without
// causing the code cache to get invalidated by this hash.
if (flag.PointsTo(&FLAG_profile_deserialization)) continue;
// Skip FLAG_random_seed to allow predictable code caching.
if (flag.PointsTo(&FLAG_random_seed)) continue;
modified_args_as_string << flag;
}
std::string args(modified_args_as_string.str());
flag_hash = static_cast<uint32_t>(
@ -837,6 +830,7 @@ bool TriggerImplication(bool premise, const char* premise_name,
// static
void FlagList::EnforceFlagImplications() {
flag_hash = 0;
bool changed;
do {
changed = false;
@ -844,10 +838,14 @@ void FlagList::EnforceFlagImplications() {
#include "src/flags/flag-definitions.h" // NOLINT(build/include)
#undef FLAG_MODE_DEFINE_IMPLICATIONS
} 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_DEFAULTS