Start slimming down ToolchainResolutionKey: get rid of BuildConfiguration. The real blocker is PlatformInfo, which is coming.
PiperOrigin-RevId: 185742130
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index a5e1214..9d3f49c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -357,7 +357,8 @@
aspect.getDescriptor().getDescription(),
associatedConfiguredTargetAndTarget.getTarget().toString()),
requiredToolchains,
- aspectConfiguration);
+ aspectConfiguration,
+ key.getAspectConfigurationKey());
} catch (ToolchainContextException e) {
// TODO(katre): better error handling
throw new AspectCreationException(e.getMessage());
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index ca24fdf..963a8be 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -246,7 +246,11 @@
rule.getRuleClassObject().getRequiredToolchains();
toolchainContext =
ToolchainUtil.createToolchainContext(
- env, rule.toString(), requiredToolchains, configuration);
+ env,
+ rule.toString(),
+ requiredToolchains,
+ configuration,
+ configuredTargetKey.getConfigurationKey());
if (env.valuesMissing()) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
index 7a2c948..d6a8bfe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
@@ -43,7 +43,13 @@
public SkyValue compute(SkyKey skyKey, Environment env)
throws SkyFunctionException, InterruptedException {
- BuildConfiguration configuration = (BuildConfiguration) skyKey.argument();
+ BuildConfigurationValue buildConfigurationValue =
+ (BuildConfigurationValue)
+ env.getValue(((RegisteredToolchainsValue.Key) skyKey).getConfigurationKey());
+ if (env.valuesMissing()) {
+ return null;
+ }
+ BuildConfiguration configuration = buildConfigurationValue.getConfiguration();
ImmutableList.Builder<Label> registeredToolchainLabels = new ImmutableList.Builder<>();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
index 23d30a0..1fb6d11 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
@@ -16,11 +16,14 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.common.collect.Interner;
import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
-import com.google.devtools.build.skyframe.LegacySkyKey;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import java.util.Objects;
/**
* A value which represents every toolchain known to Bazel and available for toolchain resolution.
@@ -29,8 +32,47 @@
public abstract class RegisteredToolchainsValue implements SkyValue {
/** Returns the {@link SkyKey} for {@link RegisteredToolchainsValue}s. */
- public static SkyKey key(BuildConfiguration configuration) {
- return LegacySkyKey.create(SkyFunctions.REGISTERED_TOOLCHAINS, configuration);
+ public static Key key(BuildConfigurationValue.Key configurationKey) {
+ return Key.of(configurationKey);
+ }
+
+ @AutoCodec
+ static class Key implements SkyKey {
+ private static final Interner<Key> interners = BlazeInterners.newWeakInterner();
+ private final BuildConfigurationValue.Key configurationKey;
+
+ private Key(BuildConfigurationValue.Key configurationKey) {
+ this.configurationKey = configurationKey;
+ }
+
+ @AutoCodec.Instantiator
+ @AutoCodec.VisibleForSerialization
+ static Key of(BuildConfigurationValue.Key configurationKey) {
+ return interners.intern(new Key(configurationKey));
+ }
+
+ @Override
+ public SkyFunctionName functionName() {
+ return SkyFunctions.REGISTERED_TOOLCHAINS;
+ }
+
+ BuildConfigurationValue.Key getConfigurationKey() {
+ return configurationKey;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Key)) {
+ return false;
+ }
+ Key that = (Key) obj;
+ return Objects.equals(this.configurationKey, that.configurationKey);
+ }
+
+ @Override
+ public int hashCode() {
+ return configurationKey.hashCode();
+ }
}
public static RegisteredToolchainsValue create(
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 a0245b7..df71799 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
@@ -895,7 +895,14 @@
throws ToolchainContextException, InterruptedException {
SkyFunctionEnvironmentForTesting env =
new SkyFunctionEnvironmentForTesting(buildDriver, eventHandler, this);
- return ToolchainUtil.createToolchainContext(env, "", requiredToolchains, config);
+ return ToolchainUtil.createToolchainContext(
+ env,
+ "",
+ requiredToolchains,
+ config,
+ config == null
+ ? null
+ : BuildConfigurationValue.key(config.fragmentClasses(), config.getOptions()));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
index d415ef0..6a8dcca 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
@@ -49,7 +49,13 @@
throws SkyFunctionException, InterruptedException {
ToolchainResolutionKey key = (ToolchainResolutionKey) skyKey.argument();
- BuildConfiguration configuration = key.configuration();
+ // This call could be combined with the call below, but this SkyFunction is evaluated so rarely
+ // it's not worth optimizing.
+ BuildConfigurationValue value = (BuildConfigurationValue) env.getValue(key.configurationKey());
+ if (env.valuesMissing()) {
+ return null;
+ }
+ BuildConfiguration configuration = value.getConfiguration();
// Get all toolchains.
RegisteredToolchainsValue toolchains;
@@ -57,7 +63,7 @@
toolchains =
(RegisteredToolchainsValue)
env.getValueOrThrow(
- RegisteredToolchainsValue.key(configuration),
+ RegisteredToolchainsValue.key(key.configurationKey()),
InvalidToolchainLabelException.class,
EvalException.class);
if (toolchains == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
index 1f39059..f71c3bd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
@@ -17,7 +17,6 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -36,12 +35,12 @@
// A key representing the input data.
public static SkyKey key(
- BuildConfiguration configuration,
+ BuildConfigurationValue.Key configurationKey,
Label toolchainType,
PlatformInfo targetPlatform,
List<PlatformInfo> availableExecutionPlatforms) {
return ToolchainResolutionKey.create(
- configuration, toolchainType, targetPlatform, availableExecutionPlatforms);
+ configurationKey, toolchainType, targetPlatform, availableExecutionPlatforms);
}
/** {@link SkyKey} implementation used for {@link ToolchainResolutionFunction}. */
@@ -52,16 +51,16 @@
return SkyFunctions.TOOLCHAIN_RESOLUTION;
}
- public abstract BuildConfiguration configuration();
+ abstract BuildConfigurationValue.Key configurationKey();
public abstract Label toolchainType();
public abstract PlatformInfo targetPlatform();
- public abstract ImmutableList<PlatformInfo> availableExecutionPlatforms();
+ abstract ImmutableList<PlatformInfo> availableExecutionPlatforms();
- public static ToolchainResolutionKey create(
- BuildConfiguration configuration,
+ static ToolchainResolutionKey create(
+ BuildConfigurationValue.Key configuration,
Label toolchainType,
PlatformInfo targetPlatform,
List<PlatformInfo> availableExecutionPlatforms) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
index de14ac6..28d5d9a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
@@ -55,11 +55,12 @@
Environment env,
String targetDescription,
Set<Label> requiredToolchains,
- @Nullable BuildConfiguration configuration)
+ @Nullable BuildConfiguration configuration,
+ BuildConfigurationValue.Key configurationKey)
throws ToolchainContextException, InterruptedException {
// In some cases this is called with a missing configuration, so we skip toolchain context.
- if (configuration == null) {
+ if (configurationKey == null) {
return null;
}
@@ -78,7 +79,7 @@
ImmutableBiMap<Label, Label> resolvedLabels =
resolveToolchainLabels(
- env, requiredToolchains, configuration, executionPlatform, targetPlatform);
+ env, requiredToolchains, executionPlatform, targetPlatform, configurationKey);
if (resolvedLabels == null) {
return null;
}
@@ -173,9 +174,9 @@
private static ImmutableBiMap<Label, Label> resolveToolchainLabels(
Environment env,
Set<Label> requiredToolchains,
- BuildConfiguration configuration,
PlatformInfo executionPlatform,
- PlatformInfo targetPlatform)
+ PlatformInfo targetPlatform,
+ BuildConfigurationValue.Key configurationKey)
throws InterruptedException, ToolchainContextException {
// If there are no required toolchains, bail out early.
@@ -188,7 +189,10 @@
for (Label toolchainType : requiredToolchains) {
registeredToolchainKeys.add(
ToolchainResolutionValue.key(
- configuration, toolchainType, targetPlatform, ImmutableList.of(executionPlatform)));
+ configurationKey,
+ toolchainType,
+ targetPlatform,
+ ImmutableList.of(executionPlatform)));
}
Map<
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 6dda4a7..4d6f66e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -124,6 +124,7 @@
import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
import com.google.devtools.build.lib.skyframe.AspectValue;
import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
import com.google.devtools.build.lib.skyframe.DiffAwareness;
@@ -202,6 +203,7 @@
private MutableActionGraph mutableActionGraph;
private LoadingOptions customLoadingOptions = null;
+ protected BuildConfigurationValue.Key targetConfigKey;
@Before
public final void initializeSkyframeExecutor() throws Exception {
@@ -465,6 +467,8 @@
+ configsMode.toString().toLowerCase();
masterConfig = createConfigurations(actualArgs);
targetConfig = getTargetConfiguration();
+ targetConfigKey =
+ BuildConfigurationValue.key(targetConfig.fragmentClasses(), targetConfig.getOptions());
configurationArgs = Arrays.asList(actualArgs);
createBuildView();
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/DefaultToolchainTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/DefaultToolchainTest.java
index bd6c8cc..324ec10 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/DefaultToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/DefaultToolchainTest.java
@@ -32,7 +32,7 @@
public class DefaultToolchainTest extends ToolchainTestCase {
@Test
public void testDefaultCcToolchainIsPresent() throws Exception {
- SkyKey toolchainKey = RegisteredToolchainsValue.key(targetConfig);
+ SkyKey toolchainKey = RegisteredToolchainsValue.key(targetConfigKey);
EvaluationResult<RegisteredToolchainsValue> result =
requestToolchainsFromSkyframe(toolchainKey);
ImmutableList<DeclaredToolchainInfo> declaredToolchains =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
index 01d216e..e45680d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
@@ -34,7 +34,7 @@
@Test
public void testRegisteredToolchains() throws Exception {
// Request the toolchains.
- SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfig);
+ SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfigKey);
EvaluationResult<RegisteredToolchainsValue> result =
requestToolchainsFromSkyframe(toolchainsKey);
assertThatEvaluationResult(result).hasNoError();
@@ -93,7 +93,7 @@
rewriteWorkspace("register_toolchains('//toolchain:toolchain_1')");
useConfiguration("--extra_toolchains=//extra:extra_toolchain");
- SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfig);
+ SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfigKey);
EvaluationResult<RegisteredToolchainsValue> result =
requestToolchainsFromSkyframe(toolchainsKey);
assertThatEvaluationResult(result).hasNoError();
@@ -111,7 +111,7 @@
scratch.file("error/BUILD", "filegroup(name = 'not_a_toolchain')");
// Request the toolchains.
- SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfig);
+ SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfigKey);
EvaluationResult<RegisteredToolchainsValue> result =
requestToolchainsFromSkyframe(toolchainsKey);
assertThatEvaluationResult(result)
@@ -127,7 +127,7 @@
public void testRegisteredToolchains_reload() throws Exception {
rewriteWorkspace("register_toolchains('//toolchain:toolchain_1')");
- SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfig);
+ SkyKey toolchainsKey = RegisteredToolchainsValue.key(targetConfigKey);
EvaluationResult<RegisteredToolchainsValue> result =
requestToolchainsFromSkyframe(toolchainsKey);
assertThatEvaluationResult(result).hasNoError();
@@ -137,7 +137,7 @@
// Re-write the WORKSPACE.
rewriteWorkspace("register_toolchains('//toolchain:toolchain_2')");
- toolchainsKey = RegisteredToolchainsValue.key(targetConfig);
+ toolchainsKey = RegisteredToolchainsValue.key(targetConfigKey);
result = requestToolchainsFromSkyframe(toolchainsKey);
assertThatEvaluationResult(result).hasNoError();
assertToolchainLabels(result.get(toolchainsKey))
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
index 92f24ed..35d0705 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
@@ -50,7 +50,7 @@
public void testResolution_singleExecutionPlatform() throws Exception {
SkyKey key =
ToolchainResolutionValue.key(
- targetConfig, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
+ targetConfigKey, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
assertThatEvaluationResult(result).hasNoError();
@@ -76,7 +76,7 @@
SkyKey key =
ToolchainResolutionValue.key(
- targetConfig,
+ targetConfigKey,
testToolchainType,
linuxPlatform,
ImmutableList.of(linuxPlatform, macPlatform));
@@ -100,7 +100,7 @@
SkyKey key =
ToolchainResolutionValue.key(
- targetConfig, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
+ targetConfigKey, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
assertThatEvaluationResult(result)
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java
index 4477942..442f5de 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java
@@ -212,7 +212,14 @@
try {
toolchainContext =
ToolchainUtil.createToolchainContext(
- env, key.targetDescription(), key.requiredToolchains(), key.configuration());
+ env,
+ key.targetDescription(),
+ key.requiredToolchains(),
+ key.configuration(),
+ key.configuration() == null
+ ? null
+ : BuildConfigurationValue.key(
+ key.configuration().fragmentClasses(), key.configuration().getOptions()));
if (toolchainContext == null) {
return null;
}