Move CppToolchainInfo.toolchainFeatures to CcToolchainProvider.toolchainFeatures

RELNOTES: None.
PiperOrigin-RevId: 252798611
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index e1492f9..8a66c74 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -53,6 +53,7 @@
           /* values= */ ImmutableMap.of(),
           /* cppConfiguration= */ null,
           /* toolchainInfo= */ null,
+          /* toolchainFeatures= */ null,
           /* crosstoolTopPathFragment= */ null,
           /* allFiles= */ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
           /* allFilesMiddleman= */ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
@@ -124,6 +125,7 @@
   private final PathFragment targetSysroot;
   private final boolean isHostConfiguration;
   private final ImmutableMap<String, PathFragment> toolPaths;
+  private final CcToolchainFeatures toolchainFeatures;
   /**
    * WARNING: We don't like {@link FdoContext}. Its {@link FdoContext#fdoProfilePath} is pure path
    * and that is horrible as it breaks many Bazel assumptions! Don't do bad stuff with it, don't
@@ -137,6 +139,7 @@
       ImmutableMap<String, Object> values,
       @Nullable CppConfiguration cppConfiguration,
       CppToolchainInfo toolchainInfo,
+      CcToolchainFeatures toolchainFeatures,
       PathFragment crosstoolTopPathFragment,
       NestedSet<Artifact> allFiles,
       NestedSet<Artifact> allFilesMiddleman,
@@ -214,6 +217,7 @@
     this.isHostConfiguration = isHostConfiguration;
     this.licensesProvider = licensesProvider;
     this.toolPaths = toolPaths;
+    this.toolchainFeatures = toolchainFeatures;
   }
 
   /**
@@ -578,7 +582,7 @@
    */
   @Nullable
   public CcToolchainFeatures getFeatures() {
-    return toolchainInfo.getFeatures();
+    return toolchainFeatures;
   }
 
   public Label getCcToolchainLabel() {
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 019a949..d9071f9 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
@@ -69,13 +69,14 @@
 
     CppToolchainInfo toolchainInfo;
     ImmutableMap<String, PathFragment> toolPaths;
+    CcToolchainFeatures toolchainFeatures;
+    PathFragment toolsDirectory = getToolsDirectory(ruleContext.getLabel());
     try {
       toolchainInfo =
           CppToolchainInfo.create(ruleContext.getLabel(), attributes.getCcToolchainConfigInfo());
-      toolPaths =
-          computeToolPaths(
-              attributes.getCcToolchainConfigInfo(),
-              CppToolchainInfo.getToolsDirectory(ruleContext.getLabel()));
+      toolPaths = computeToolPaths(attributes.getCcToolchainConfigInfo(), toolsDirectory);
+      toolchainFeatures =
+          new CcToolchainFeatures(attributes.getCcToolchainConfigInfo(), toolsDirectory);
     } catch (EvalException e) {
       throw ruleContext.throwWithRuleError(e.getMessage());
     }
@@ -181,8 +182,7 @@
     ImmutableList.Builder<PathFragment> builtInIncludeDirectoriesBuilder = ImmutableList.builder();
     for (String s : toolchainInfo.getRawBuiltInIncludeDirectories()) {
       try {
-        builtInIncludeDirectoriesBuilder.add(
-            resolveIncludeDir(s, sysroot, toolchainInfo.getToolsDirectory()));
+        builtInIncludeDirectoriesBuilder.add(resolveIncludeDir(s, sysroot, toolsDirectory));
       } catch (InvalidConfigurationException e) {
         ruleContext.ruleError(e.getMessage());
       }
@@ -194,7 +194,8 @@
         getToolchainForSkylark(toolPaths),
         cppConfiguration,
         toolchainInfo,
-        toolchainInfo.getToolsDirectory(),
+        toolchainFeatures,
+        toolsDirectory,
         attributes.getAllFiles(),
         attributes.getFullInputsForCrosstool(),
         attributes.getCompilerFiles(),
@@ -445,4 +446,8 @@
   static PathFragment getToolPathFragment(ImmutableMap<String, PathFragment> toolPaths, Tool tool) {
     return toolPaths.get(tool.getNamePart());
   }
+
+  static PathFragment getToolsDirectory(Label ccToolchainLabel) {
+    return ccToolchainLabel.getPackageIdentifier().getPathUnderExecRoot();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
index 50e05dfd..b230010 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
@@ -39,7 +39,6 @@
 @Immutable
 public final class CppToolchainInfo {
   private final String toolchainIdentifier;
-  private final CcToolchainFeatures toolchainFeatures;
 
   private final String compiler;
   private final String abiGlibcVersion;
@@ -73,7 +72,6 @@
 
     return new CppToolchainInfo(
         ccToolchainConfigInfo.getToolchainIdentifier(),
-        new CcToolchainFeatures(ccToolchainConfigInfo, getToolsDirectory(toolchainLabel)),
         ccToolchainConfigInfo.getCompiler(),
         ccToolchainConfigInfo.getAbiLibcVersion(),
         ccToolchainConfigInfo.getTargetCpu(),
@@ -98,7 +96,6 @@
   @AutoCodec.Instantiator
   CppToolchainInfo(
       String toolchainIdentifier,
-      CcToolchainFeatures toolchainFeatures,
       String compiler,
       String abiGlibcVersion,
       String targetCpu,
@@ -116,8 +113,6 @@
       String legacyCcFlagsMakeVariable)
       throws EvalException {
     this.toolchainIdentifier = toolchainIdentifier;
-    // Since this field can be derived from `crosstoolInfo`, it is re-derived instead of serialized.
-    this.toolchainFeatures = toolchainFeatures;
     this.compiler = compiler;
     this.abiGlibcVersion = abiGlibcVersion;
     this.targetCpu = targetCpu;
@@ -209,14 +204,6 @@
   }
 
   /**
-   * Returns the configured features of the toolchain. Rules should not call this directly, but
-   * instead use {@code CcToolchainProvider.getFeatures}.
-   */
-  public CcToolchainFeatures getFeatures() {
-    return toolchainFeatures;
-  }
-
-  /**
    * Returns the run time sysroot, which is where the dynamic linker and system libraries are found
    * at runtime. This is usually an absolute path. If the toolchain compiler does not support
    * sysroots, then this method returns <code>null</code>.
@@ -315,12 +302,4 @@
 
     return legacyCcFlags;
   }
-
-  public PathFragment getToolsDirectory() {
-    return getToolsDirectory(ccToolchainLabel);
-  }
-
-  static PathFragment getToolsDirectory(Label ccToolchainLabel) {
-    return ccToolchainLabel.getPackageIdentifier().getPathUnderExecRoot();
-  }
 }