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;
         }