Read the CROSSTOOL from the package of the current cc_toolchain, not from --crosstool_top

This will make the behavior work properly when using platforms, and it will fix
recurring issues when cc_toolchain_suite and cc_toolchain are built as a top
level targets, without setting --crosstool_top (that resulted in trying to
associate cc_toolchain with an unrelated CROSSTOOL file and fail the build).
This could also happen when using `bazel cquery` or `bazel aquery`.

RELNOTES: CROSSTOOL file is now read from the package of cc_toolchain, not from
the package of cc_toolchain_suite. This is not expected to break anybody since
cc_toolchain_suite and cc_toolchain are commonly in the same package.
PiperOrigin-RevId: 218516709
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
index 6334d1e..85ef28c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
@@ -67,10 +67,10 @@
     }
 
     CrosstoolRelease crosstoolRelease = null;
-    if (key.getCcToolchainSuiteLabel() != null) {
+    if (key.getPackageWithCrosstoolInIt() != null) {
       try {
         // 1. Lookup the package to handle multiple package roots (PackageLookupValue)
-        PackageIdentifier packageIdentifier = key.getCcToolchainSuiteLabel().getPackageIdentifier();
+        PackageIdentifier packageIdentifier = key.getPackageWithCrosstoolInIt();
         PackageLookupValue crosstoolPackageValue =
             (PackageLookupValue) env.getValue(PackageLookupValue.key(packageIdentifier));
         if (env.valuesMissing()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
index d097230..d5ece4b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.rules.cpp;
 
 import com.google.common.collect.Interner;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -49,22 +49,22 @@
     private static final Interner<Key> interner = BlazeInterners.newWeakInterner();
 
     @Nullable private final PathFragment fdoZipPath;
-    @Nullable private final Label ccToolchainSuiteLabel;
+    @Nullable private final PackageIdentifier packageWithCrosstoolInIt;
 
-    private Key(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
+    private Key(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
       this.fdoZipPath = fdoZipPath;
-      this.ccToolchainSuiteLabel = ccToolchainSuiteLabel;
+      this.packageWithCrosstoolInIt = packageWithCrosstoolInIt;
     }
 
     @AutoCodec.Instantiator
     @AutoCodec.VisibleForSerialization
-    static Key of(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
-      return interner.intern(new Key(fdoZipPath, ccToolchainSuiteLabel));
+    static Key of(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
+      return interner.intern(new Key(fdoZipPath, packageWithCrosstoolInIt));
     }
 
     @Nullable
-    public Label getCcToolchainSuiteLabel() {
-      return ccToolchainSuiteLabel;
+    public PackageIdentifier getPackageWithCrosstoolInIt() {
+      return packageWithCrosstoolInIt;
     }
 
     @Nullable
@@ -82,13 +82,13 @@
       }
       Key key = (Key) o;
       return Objects.equals(fdoZipPath, key.fdoZipPath)
-          && Objects.equals(ccToolchainSuiteLabel, key.ccToolchainSuiteLabel);
+          && Objects.equals(packageWithCrosstoolInIt, key.packageWithCrosstoolInIt);
     }
 
     @Override
     public int hashCode() {
 
-      return Objects.hash(fdoZipPath, ccToolchainSuiteLabel);
+      return Objects.hash(fdoZipPath, packageWithCrosstoolInIt);
     }
 
     @Override
@@ -118,7 +118,7 @@
     return crosstoolRelease;
   }
 
-  public static SkyKey key(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
-    return Key.of(fdoZipPath, ccToolchainSuiteLabel);
+  public static SkyKey key(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
+    return Key.of(fdoZipPath, packageWithCrosstoolInIt);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index 748166d..d8059ad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -404,12 +404,12 @@
 
     // Is there a toolchain proto available on the target directly?
     CToolchain toolchain = parseToolchainFromAttributes(ruleContext, attributes);
-    Label ccToolchainSuiteLabelIfNeeded = null;
+    PackageIdentifier packageWithCrosstoolInIt = null;
     if (toolchain == null && cppConfiguration.getCrosstoolFromCcToolchainProtoAttribute() == null) {
-      ccToolchainSuiteLabelIfNeeded = cppConfiguration.getCrosstoolTop();
+      packageWithCrosstoolInIt = ruleContext.getLabel().getPackageIdentifier();
     }
 
-    SkyKey ccSupportKey = CcSkyframeSupportValue.key(fdoZip, ccToolchainSuiteLabelIfNeeded);
+    SkyKey ccSupportKey = CcSkyframeSupportValue.key(fdoZip, packageWithCrosstoolInIt);
 
     SkyFunction.Environment skyframeEnv = ruleContext.getAnalysisEnvironment().getSkyframeEnv();
     CcSkyframeSupportValue ccSkyframeSupportValue;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
index c555efb..f397f04 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
@@ -468,6 +468,7 @@
         "    all_files = ':every-file',",
         "    dynamic_runtime_libs = ['dynamic-runtime-libs-cherry'],",
         "    static_runtime_libs = ['static-runtime-libs-cherry'])");
+    scratch.file("c/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
 
     ConfiguredTarget target = getConfiguredTarget("//c:c");
     Map<Label, License> expected = licenses("//c:c", "notice");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
index 7b2e675..de24239 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
@@ -42,9 +42,8 @@
 
   @Test
   public void testThatHostCrosstoolTopCommandLineArgumentWorks() throws Exception {
-
     scratch.file(
-        "t/BUILD",
+        "b/BUILD",
         "cc_toolchain_suite(",
         "  name = 'my_custom_toolchain_suite',",
         "  toolchains = {",
@@ -52,13 +51,7 @@
         "    'k8|compiler': '//b:toolchain_b',",
         "    'x64_windows|windows_msys64': '//b:toolchain_b',",
         "    'darwin|compiler': '//b:toolchain_b',",
-
-        "})");
-
-    scratch.file("t/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
-
-    scratch.file(
-        "b/BUILD",
+        "})",
         "cc_toolchain(",
         "    name = 'toolchain_b',",
         "    cpu = 'ED-E',",
@@ -72,9 +65,11 @@
         "    objcopy_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'],",
         "    static_runtime_libs = [':empty'])");
+    scratch.file("b/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+
     scratch.file("a/BUILD", "cc_host_toolchain_alias(name='current_cc_host_toolchain')");
 
-    useConfiguration("--host_crosstool_top=//t:my_custom_toolchain_suite");
+    useConfiguration("--host_crosstool_top=//b:my_custom_toolchain_suite");
     ConfiguredTarget target = getConfiguredTarget("//a:current_cc_host_toolchain");
 
     assertThat(target.getLabel()).isEqualTo(Label.parseAbsoluteUnchecked("//b:toolchain_b"));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
index 74bb8f5..662a04d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.packages.util.ResourceLoader;
@@ -341,6 +342,7 @@
         "    objcopy_files = ':empty',",
         "    dynamic_runtime_libs = [':empty'],",
         "    static_runtime_libs = [':empty'])");
+    scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
 
     // Check defaults.
     useConfiguration();
@@ -682,6 +684,7 @@
         "fdo/BUILD",
         "exports_files(['my_profile.afdo'])",
         "fdo_profile(name = 'fdo', profile = ':my_profile.profdata')");
+    scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
 
     useConfiguration();
     assertThat(getPrerequisites(getConfiguredTarget("//a:b"), ":zipper")).isEmpty();
@@ -768,6 +771,7 @@
         "    dynamic_runtime_libs = [':empty'],",
         "    static_runtime_libs = [':empty'],",
         "    toolchain_config = ':toolchain_config')");
+    scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
 
     scratch.file(
         "a/crosstool_rule.bzl",