From 9fe53c4f0bb66e4b2372a9e9145df9ee83b658f8 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 12 Oct 2021 12:47:48 +0200 Subject: [PATCH] [flags] Skip --random-seed in FlagList::Hash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ä Commit-Queue: Camillo Bruni Cr-Commit-Position: refs/heads/main@{#77345} --- src/flags/flags.cc | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/flags/flags.cc b/src/flags/flags.cc index 66ad2974d0..fbdd1cde36 100644 --- a/src/flags/flags.cc +++ b/src/flags/flags.cc @@ -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( @@ -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