Fix https://github.com/bazelbuild/bazel/commit/9aa7583e97bffb17d2a6f48aecefa932e8064daa performance regression.
PiperOrigin-RevId: 791090368
Change-Id: I8b96eeac3a267fe2fc01751219eed787e8720173
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformFunction.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformFunction.java
index 0a2bd18..05c63c8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformFunction.java
@@ -17,7 +17,6 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
import com.google.devtools.build.lib.analysis.config.CommonOptions;
-import com.google.devtools.build.lib.analysis.platform.PlatformValue.PlatformKeyParams;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.Label.PackageContext;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
@@ -57,7 +56,7 @@
@Override
public PlatformValue compute(SkyKey skyKey, Environment env)
throws PlatformFunctionException, InterruptedException {
- PlatformKeyParams params = (PlatformKeyParams) skyKey.argument();
+ PlatformValue.Key params = (PlatformValue.Key) skyKey.argument();
var platformLabel = params.label();
var pkgId = platformLabel.getPackageIdentifier();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformValue.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformValue.java
index a1ba13a..8d1c8e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformValue.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformValue.java
@@ -16,14 +16,15 @@
import static java.util.Objects.requireNonNull;
-import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.SkyFunctions;
import com.google.devtools.build.lib.skyframe.config.ParsedFlagsValue;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.skyframe.AbstractSkyKey;
import com.google.devtools.build.skyframe.SkyFunctionName;
+import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import java.util.List;
+import java.util.Map;
import java.util.Optional;
/**
@@ -47,31 +48,24 @@
return new PlatformValue(platformInfo, Optional.of(parsedFlags));
}
- public static PlatformKey key(
- Label platformLabel, ImmutableMap<String, String> flagAliasMappings) {
- return PlatformKey.intern(
- new PlatformKey(new PlatformKeyParams(platformLabel, flagAliasMappings)));
+ public static Key key(Label platformLabel, List<Map.Entry<String, String>> flagAliasMappings) {
+ return Key.create(platformLabel, flagAliasMappings);
}
/**
- * Key parameters.
+ * Key definition.
*
* @param label The platform label.
* @param flagAliasMappings {@code --flag_alias} maps that apply to this build.
*/
@AutoCodec
- public record PlatformKeyParams(Label label, ImmutableMap<String, String> flagAliasMappings) {}
+ public record Key(Label label, List<Map.Entry<String, String>> flagAliasMappings)
+ implements SkyKey {
+ private static final SkyKeyInterner<Key> interner = new SkyKeyInterner<>();
- private static final class PlatformKey extends AbstractSkyKey<PlatformKeyParams> {
- private static final SkyKeyInterner<PlatformKey> interner = new SkyKeyInterner<>();
-
- @AutoCodec.Interner
- static PlatformKey intern(PlatformKey key) {
- return interner.intern(key);
- }
-
- private PlatformKey(PlatformKeyParams arg) {
- super(arg);
+ @AutoCodec.Instantiator
+ static Key create(Label label, List<Map.Entry<String, String>> flagAliasMappings) {
+ return interner.intern(new Key(label, flagAliasMappings));
}
@Override
@@ -80,7 +74,7 @@
}
@Override
- public SkyKeyInterner<PlatformKey> getSkyKeyInterner() {
+ public SkyKeyInterner<Key> getSkyKeyInterner() {
return interner;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/producers/BUILD
index 694c3e2..1492ba8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/BUILD
@@ -142,7 +142,6 @@
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
- "//third_party:guava",
"//third_party:jsr305",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
index ed241e3..ad49dde 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
@@ -15,7 +15,6 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
-import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.CoreOptions;
@@ -135,7 +134,7 @@
tasks.enqueue(
new PlatformProducer(
targetPlatforms.getFirst(),
- ImmutableMap.copyOf(options.get(CoreOptions.class).commandLineFlagAliases),
+ options.get(CoreOptions.class).commandLineFlagAliases,
this,
this::checkTargetPlatformFlags));
return runAfter;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducerWithCompatibilityCheck.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducerWithCompatibilityCheck.java
index 3dfe06c..b3534c6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducerWithCompatibilityCheck.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyContextProducerWithCompatibilityCheck.java
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.analysis.ToolchainCollection;
import com.google.devtools.build.lib.analysis.TransitiveDependencyState;
import com.google.devtools.build.lib.analysis.config.ConfigConditions;
+import com.google.devtools.build.lib.analysis.config.CoreOptions;
import com.google.devtools.build.lib.analysis.constraints.IncompatibleTargetChecker.IncompatibleTargetException;
import com.google.devtools.build.lib.analysis.constraints.IncompatibleTargetChecker.IncompatibleTargetProducer;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
@@ -99,7 +100,11 @@
// toolchains mark the target incompatible instead of failing the build.
return new PlatformProducer(
platformConfiguration.getTargetPlatform(),
- targetAndConfiguration.getConfiguration().getCommandLineFlagAliases(),
+ targetAndConfiguration
+ .getConfiguration()
+ .getOptions()
+ .get(CoreOptions.class)
+ .commandLineFlagAliases,
(PlatformProducer.ResultSink) this,
/* runAfter= */ this::computeConfigConditions);
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformProducer.java
index 078abbd..cd24aa7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformProducer.java
@@ -13,7 +13,6 @@
// limitations under the License.
package com.google.devtools.build.lib.analysis.producers;
-import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.platform.PlatformValue;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.toolchains.PlatformLookupUtil.InvalidPlatformException;
@@ -21,6 +20,8 @@
import com.google.devtools.build.skyframe.state.StateMachine;
import com.google.devtools.build.skyframe.state.StateMachine.ValueOrException2Sink;
import com.google.devtools.common.options.OptionsParsingException;
+import java.util.List;
+import java.util.Map;
import javax.annotation.Nullable;
/** Retrieves {@link PlatformValue} for a given platform. */
@@ -38,7 +39,7 @@
// -------------------- Input --------------------
private final Label platformLabel;
- private final ImmutableMap<String, String> flagAliasMappings;
+ private final List<Map.Entry<String, String>> flagAliasMappings;
// -------------------- Output --------------------
private final ResultSink sink;
@@ -48,7 +49,7 @@
PlatformProducer(
Label platformLabel,
- ImmutableMap<String, String> flagAliasMappings,
+ List<Map.Entry<String, String>> flagAliasMappings,
ResultSink sink,
StateMachine runAfter) {
this.platformLabel = platformLabel;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/RuleTransitionApplier.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/RuleTransitionApplier.java
index a5498b7..f83b674 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/RuleTransitionApplier.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/RuleTransitionApplier.java
@@ -169,12 +169,11 @@
tasks.enqueue(
new PlatformProducer(
platformConfiguration.getTargetPlatform(),
- ImmutableMap.copyOf(
- preRuleTransitionKey
- .getConfigurationKey()
- .getOptions()
- .get(CoreOptions.class)
- .commandLineFlagAliases),
+ preRuleTransitionKey
+ .getConfigurationKey()
+ .getOptions()
+ .get(CoreOptions.class)
+ .commandLineFlagAliases,
(PlatformProducer.ResultSink) this,
this::computeConfigConditions));
} else {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 0ef72ef..61b0c0e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -115,7 +115,7 @@
import com.google.devtools.build.lib.analysis.config.transitions.TransitionUtil;
import com.google.devtools.build.lib.analysis.constraints.RuleContextConstraintSemantics;
import com.google.devtools.build.lib.analysis.platform.PlatformFunction;
-import com.google.devtools.build.lib.analysis.platform.PlatformValue.PlatformKeyParams;
+import com.google.devtools.build.lib.analysis.platform.PlatformValue;
import com.google.devtools.build.lib.analysis.producers.ConfiguredTargetAndDataProducer;
import com.google.devtools.build.lib.analysis.starlark.StarlarkAttributeTransitionProvider;
import com.google.devtools.build.lib.bazel.bzlmod.BazelDepGraphValue;
@@ -1829,7 +1829,7 @@
// Parse the options.
PackageContext rootPackage = mainRepoContext.rootPackage();
ParsedFlagsValue.Key parsedFlagsKey =
- ParsedFlagsValue.Key.create(args, rootPackage, /* flagAliasMappings= */ ImmutableMap.of());
+ ParsedFlagsValue.Key.create(args, rootPackage, /* flagAliasMappings= */ ImmutableList.of());
EvaluationResult<SkyValue> result =
evaluateSkyKeys(eventHandler, ImmutableList.of(parsedFlagsKey));
if (result.hasError()) {
@@ -4077,7 +4077,7 @@
// a non-ActionLookupKey depending on an ActionLookupKey. So we can skip any other
// non-ActionLookupKeys in the traversal as an optimization.
if (dep.functionName().equals(SkyFunctions.PLATFORM)) {
- var platformLabel = ((PlatformKeyParams) dep.argument()).label();
+ var platformLabel = ((PlatformValue.Key) dep.argument()).label();
dep = PlatformFunction.configuredTargetDep(platformLabel);
}
if (!(dep instanceof ActionLookupKey depKey)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/BuildConfigurationFunction.java
index 8c1e8ab..3666acc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/BuildConfigurationFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/BuildConfigurationFunction.java
@@ -15,7 +15,6 @@
import static com.google.devtools.build.lib.analysis.constraints.ConstraintConstants.CPU_CONSTRAINT_SETTING;
-import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.PlatformOptions;
@@ -115,9 +114,7 @@
PlatformValue platformValue =
(PlatformValue)
- env.getValue(
- PlatformValue.key(
- platformLabel, ImmutableMap.copyOf(coreOptions.commandLineFlagAliases)));
+ env.getValue(PlatformValue.key(platformLabel, coreOptions.commandLineFlagAliases));
if (platformValue == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsFunction.java
index 6926b0f..8210def 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsFunction.java
@@ -17,6 +17,7 @@
import static com.google.devtools.common.options.OptionsParser.STARLARK_SKIPPED_PREFIXES;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.cmdline.Label;
@@ -56,6 +57,7 @@
ImmutableList.Builder<String> nativeFlags = ImmutableList.builder();
ImmutableList.Builder<String> starlarkFlags = ImmutableList.builder();
+ ImmutableMap<String, String> flagAliasMappings = ImmutableMap.copyOf(key.flagAliasMappings());
for (String flagSetting : key.rawFlags()) {
if (!flagSetting.startsWith("--")) {
// This is either something like "-c" or an invalid setting. Let options parsing handle it.
@@ -76,7 +78,7 @@
flagName = flagSetting.substring(2); // --<flag>
}
// If --flag_alias=foo=//bar and we see --foo=1, use the canonical setting --//bar=1.
- String actualFlag = key.flagAliasMappings().get(flagName);
+ String actualFlag = flagAliasMappings.get(flagName);
if (actualFlag != null) {
flagSetting =
"--%s%s%s"
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsValue.java
index 7903492..19318df 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/ParsedFlagsValue.java
@@ -19,7 +19,6 @@
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.cmdline.Label;
@@ -36,6 +35,7 @@
import com.google.devtools.common.options.OptionValueDescription;
import com.google.devtools.common.options.OptionsParsingException;
import com.google.devtools.common.options.OptionsParsingResult;
+import java.util.List;
import java.util.Map;
/** Stores the {@link OptionsParsingResult} from {@link ParsedFlagsFunction}. */
@@ -55,7 +55,7 @@
public static Key create(
ImmutableList<String> rawFlags,
PackageContext packageContext,
- ImmutableMap<String, String> flagAliasMappings) {
+ List<Map.Entry<String, String>> flagAliasMappings) {
return create(rawFlags, packageContext, /* includeDefaultValues= */ false, flagAliasMappings);
}
@@ -68,7 +68,7 @@
ImmutableList<String> rawFlags,
PackageContext packageContext,
boolean includeDefaultValues,
- ImmutableMap<String, String> flagAliasMappings) {
+ List<Map.Entry<String, String>> flagAliasMappings) {
return interner.intern(
new Key(rawFlags, packageContext, includeDefaultValues, flagAliasMappings));
}
@@ -77,13 +77,13 @@
private final PackageContext packageContext;
private final boolean includeDefaultValues;
- private final ImmutableMap<String, String> flagAliasMappings;
+ private final List<Map.Entry<String, String>> flagAliasMappings;
private Key(
ImmutableList<String> rawFlags,
PackageContext packageContext,
boolean includeDefaultValues,
- ImmutableMap<String, String> flagAliasMappings) {
+ List<Map.Entry<String, String>> flagAliasMappings) {
this.rawFlags = checkNotNull(rawFlags);
this.packageContext = checkNotNull(packageContext);
this.includeDefaultValues = includeDefaultValues;
@@ -102,7 +102,7 @@
return includeDefaultValues;
}
- ImmutableMap<String, String> flagAliasMappings() {
+ List<Map.Entry<String, String>> flagAliasMappings() {
return flagAliasMappings;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingFunction.java
index b04b339..ce07291 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingFunction.java
@@ -215,7 +215,7 @@
// here unless a compelling case demands it.
ParsedFlagsValue.Key parsedFlagsKey =
ParsedFlagsValue.Key.create(
- rawFlags, rootPackage, /* flagAliasMappings= */ ImmutableMap.of());
+ rawFlags, rootPackage, /* flagAliasMappings= */ ImmutableList.of());
try {
return (ParsedFlagsValue) env.getValueOrThrow(parsedFlagsKey, OptionsParsingException.class);
} catch (OptionsParsingException e) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/producers/PlatformProducerTest.java b/src/test/java/com/google/devtools/build/lib/analysis/producers/PlatformProducerTest.java
index 02d69a4..a9317ae 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/producers/PlatformProducerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/producers/PlatformProducerTest.java
@@ -16,12 +16,14 @@
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.platform.PlatformValue;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.toolchains.PlatformLookupUtil.InvalidPlatformException;
import com.google.devtools.build.skyframe.state.StateMachine;
import com.google.devtools.common.options.OptionsParsingException;
+import java.util.List;
+import java.util.Map;
import javax.annotation.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,7 +58,7 @@
""");
Label platformLabel = Label.parseCanonicalUnchecked("//lookup:basic");
- PlatformValue result = fetch(platformLabel, /* flagAliasMappings= */ ImmutableMap.of());
+ PlatformValue result = fetch(platformLabel, /* flagAliasMappings= */ ImmutableList.of());
assertThat(result).isNotNull();
assertThat(result.platformInfo().label()).isEqualTo(platformLabel);
@@ -89,7 +91,7 @@
""");
Label platformLabel = Label.parseCanonicalUnchecked("//lookup:alias");
- PlatformValue result = fetch(platformLabel, /* flagAliasMappings= */ ImmutableMap.of());
+ PlatformValue result = fetch(platformLabel, /* flagAliasMappings= */ ImmutableList.of());
assertThat(result).isNotNull();
assertThat(result.platformInfo().label())
@@ -111,7 +113,7 @@
Label platformLabel = Label.parseCanonicalUnchecked("//lookup:basic");
assertThrows(
InvalidPlatformException.class,
- () -> fetch(platformLabel, /* flagAliasMappings= */ ImmutableMap.of()));
+ () -> fetch(platformLabel, /* flagAliasMappings= */ ImmutableList.of()));
}
@Test
@@ -128,7 +130,7 @@
Label platformLabel = Label.parseCanonicalUnchecked("//lookup:basic");
assertThrows(
OptionsParsingException.class,
- () -> fetch(platformLabel, /* flagAliasMappings= */ ImmutableMap.of()));
+ () -> fetch(platformLabel, /* flagAliasMappings= */ ImmutableList.of()));
}
@Test
@@ -180,13 +182,10 @@
PlatformValue result =
fetch(
Label.parseCanonicalUnchecked("//lookup:basic"),
- /* flagAliasMappings= */ ImmutableMap.of(
- "aliasname1",
- "//starlark:actual1",
- "aliasname2",
- "//starlark:actual2",
- "aliasname3",
- "//starlark:actual3"));
+ /* flagAliasMappings= */ ImmutableList.of(
+ Map.entry("aliasname1", "//starlark:actual1"),
+ Map.entry("aliasname2", "//starlark:actual2"),
+ Map.entry("aliasname3", "//starlark:actual3")));
// Native flags:
assertThat(result.parsedFlags().get().parsingResult().canonicalize())
@@ -197,7 +196,8 @@
"//starlark:actual1", "fast", "//starlark:actual2", true, "//starlark:actual3", false);
}
- private PlatformValue fetch(Label platformLabel, ImmutableMap<String, String> flagAliasMappings)
+ private PlatformValue fetch(
+ Label platformLabel, List<Map.Entry<String, String>> flagAliasMappings)
throws InvalidPlatformException, OptionsParsingException, InterruptedException {
PlatformInfoSink sink = new PlatformInfoSink();
PlatformProducer producer =