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