Add `BuildInfo` translator target to `cc_toolchain`.

PiperOrigin-RevId: 567596098
Change-Id: Ia24f9275e2320093223e7d7f427a0b3553726ac6
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 3b4d59d..1bac79f 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -38,6 +38,10 @@
         '*tools/build_defs/build_info/BUILD.tools',
         lambda x: 'tools/build_defs/build_info/BUILD',
     ),
+    (
+        '*tools/build_defs/build_info/templates/BUILD.tools',
+        lambda x: 'tools/build_defs/build_info/templates/BUILD',
+    ),
     ('*tools/j2objc/BUILD.tools', lambda x: 'tools/j2objc/BUILD'),
     ('*tools/platforms/*', lambda x: 'platforms/' + os.path.basename(x)),
     ('*tools/cpp/BUILD.tools', lambda x: 'tools/cpp/BUILD'),
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
index b8b4e8c..c42c4e4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
@@ -116,7 +116,8 @@
       PRIVATE_BUILDINFO_API_ALLOWLIST =
           ImmutableSet.of(
               BuiltinRestriction.allowlistEntry("", "test"), // for tests
-              BuiltinRestriction.allowlistEntry("", "tools/build_defs/build_info"));
+              BuiltinRestriction.allowlistEntry("", "tools/build_defs/build_info"),
+              BuiltinRestriction.allowlistEntry("bazel_tools", "tools/build_defs/build_info"));
 
   public StarlarkActionFactory(StarlarkActionContext context) {
     this.context = context;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkInternal.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkInternal.java
index 58c3ba0..1fd8066 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkInternal.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkInternal.java
@@ -272,7 +272,8 @@
         /* stripExecutable= */ stripExecutable,
         /* ldExecutable= */ ldExecutable,
         /* gcovExecutable= */ gcovExecutable,
-        /* ccToolchainBuildVariablesFunc */ attributes.getCcToolchainBuildVariablesFunc());
+        /* ccToolchainBuildVariablesFunc */ attributes.getCcToolchainBuildVariablesFunc(),
+        /* ccBuildInfoTranslator */ attributes.getCcBuildInfoTranslator());
   }
 
   @StarlarkMethod(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
index c275bf2..f91a38e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.analysis.LicensesProvider;
 import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense;
 import com.google.devtools.build.lib.analysis.LicensesProviderImpl;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
 import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
@@ -105,6 +106,7 @@
   private final StarlarkFunction ccToolchainBuildVariablesFunc;
   private final String lateBoundLibc;
   private final String lateBoundTargetLibc;
+  private final OutputGroupInfo ccBuildInfoTranslator;
 
   public CcToolchainAttributesProvider(
       RuleContext ruleContext,
@@ -230,6 +232,8 @@
         Allowlist.fetchPackageSpecificationProvider(
             ruleContext, CcToolchainRule.LOOSE_HEADER_CHECK_ALLOWLIST);
     this.ccToolchainBuildVariablesFunc = ccToolchainBuildVariablesFunc;
+    this.ccBuildInfoTranslator =
+        OutputGroupInfo.get(ruleContext.getPrerequisite("$build_info_translator"));
   }
 
   // This is to avoid Starlark limitation of not being able to have complex logic in configuration
@@ -574,6 +578,10 @@
     return allowlistForLooseHeaderCheck;
   }
 
+  public OutputGroupInfo getCcBuildInfoTranslator() {
+    return ccBuildInfoTranslator;
+  }
+
   private static NestedSet<Artifact> getFiles(RuleContext context, String attribute) {
     TransitiveInfoCollection dep = context.getPrerequisite(attribute);
     return dep.getProvider(FileProvider.class).getFilesToBuild();
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 a6ea7a5..89ad7db 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
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.LicensesProvider;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
 import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
@@ -62,7 +63,8 @@
             StarlarkRuleContext,
             InvalidConfigurationException,
             CppConfiguration,
-            CcToolchainVariables>,
+            CcToolchainVariables,
+            OutputGroupInfo>,
         HasCcToolchainLabel {
 
   public static final BuiltinProvider<CcToolchainProvider> PROVIDER =
@@ -139,6 +141,7 @@
   private final String ldExecutable;
   private final String gcovExecutable;
   private final StarlarkFunction ccToolchainBuildVariablesFunc;
+  private final OutputGroupInfo ccBuildInfoTranslator;
 
   public CcToolchainProvider(
       @Nullable CppConfiguration cppConfiguration,
@@ -202,7 +205,8 @@
       String stripExecutable,
       String ldExecutable,
       String gcovExecutable,
-      StarlarkFunction ccToolchainBuildVariablesFunc) {
+      StarlarkFunction ccToolchainBuildVariablesFunc,
+      OutputGroupInfo ccBuildInfoTranslator) {
     super();
     this.cppConfiguration = cppConfiguration;
     this.crosstoolTopPathFragment = crosstoolTopPathFragment;
@@ -270,6 +274,7 @@
     this.gcovExecutable = gcovExecutable;
     this.grepIncludes = grepIncludes;
     this.ccToolchainBuildVariablesFunc = ccToolchainBuildVariablesFunc;
+    this.ccBuildInfoTranslator = ccBuildInfoTranslator;
   }
 
   @Override
@@ -1064,4 +1069,15 @@
   public PackageSpecificationProvider getAllowlistForLooseHeaderCheck() {
     return allowListForLooseHeaderCheck;
   }
+
+  public OutputGroupInfo getCcBuildInfoTranslator() {
+    return ccBuildInfoTranslator;
+  }
+
+  @Override
+  public OutputGroupInfo getCcBuildInfoTranslatorForStarlark(StarlarkThread thread)
+      throws EvalException {
+    CcModule.checkPrivateStarlarkificationAllowlist(thread);
+    return getCcBuildInfoTranslator();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index e407595..0e62486 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -41,7 +41,8 @@
                     StarlarkRuleContextT,
                     ?,
                     ? extends CppConfigurationApi<?>,
-                    CcToolchainVariablesT>,
+                    CcToolchainVariablesT,
+                    ?>,
         FeatureConfigurationT extends FeatureConfigurationApi,
         CompilationContextT extends CcCompilationContextApi<FileT, CppModuleMapT>,
         CompilationOutputsT extends CcCompilationOutputsApi<FileT>,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
index aa8a59f..7d74818 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
@@ -54,6 +54,7 @@
                       ? extends StarlarkRuleContextApi<? extends ConstraintValueInfoApi>,
                       ?,
                       ? extends CppConfigurationApi<?>,
+                      ?,
                       ?>,
               ? extends FeatureConfigurationApi,
               ? extends
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
index c6d1842..f9eac7c 100755
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
@@ -55,7 +55,8 @@
                     StarlarkRuleContextT,
                     ?,
                     ? extends CppConfigurationApi<?>,
-                    CcToolchainVariablesT>,
+                    CcToolchainVariablesT,
+                    ?>,
         FeatureConfigurationT extends FeatureConfigurationApi,
         CompilationContextT extends CcCompilationContextApi<FileT, CppModuleMapT>,
         LtoBackendArtifactsT extends LtoBackendArtifactsApi<FileT>,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
index d2743f57..3d915c6 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -17,6 +17,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.docgen.annot.DocCategory;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.starlarkbuildapi.OutputGroupInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
@@ -41,7 +42,8 @@
         StarlarkRuleContextT extends StarlarkRuleContextApi<ConstraintValueT>,
         InvalidConfigurationExceptionT extends Exception,
         CppConfigurationT extends CppConfigurationApi<InvalidConfigurationExceptionT>,
-        CcToolchainVariablesT extends CcToolchainVariablesApi>
+        CcToolchainVariablesT extends CcToolchainVariablesApi,
+        OutputGroupInfoT extends OutputGroupInfoApi>
     extends StructApi {
 
   @StarlarkMethod(
@@ -307,4 +309,7 @@
       CppConfigurationT cppConfiguration,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
+
+  @StarlarkMethod(name = "build_info_files", documented = false, useStarlarkThread = true)
+  OutputGroupInfoT getCcBuildInfoTranslatorForStarlark(StarlarkThread thread) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
index 6e43499..85b952f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
@@ -49,6 +49,7 @@
                     starlarkRuleContextT,
                     ?,
                     ? extends CppConfigurationApi<?>,
+                    ?,
                     ?>,
         CompilationInfoT extends CompilationInfoApi<FileT>,
         FileT extends FileApi,
diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_toolchain_attrs.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_toolchain_attrs.bzl
index 78ab88f..99ddb18 100644
--- a/src/main/starlark/builtins_bzl/common/cc/cc_toolchain_attrs.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/cc_toolchain_attrs.bzl
@@ -191,6 +191,10 @@
         providers = [PackageSpecificationInfo],
         cfg = "exec",
     ),
+    "_build_info_translator": attr.label(
+        default = semantics.BUILD_INFO_TRANLATOR_LABEL,
+        providers = [OutputGroupInfo],
+    ),
     "_is_apple": attr.bool(
         default = False,
     ),
diff --git a/src/main/starlark/builtins_bzl/common/cc/semantics.bzl b/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
index 5238ad1..c2a4723 100644
--- a/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
@@ -199,4 +199,5 @@
     get_nocopts_attr = _get_nocopts_attr,
     get_experimental_link_static_libraries_once = _get_experimental_link_static_libraries_once,
     check_cc_shared_library_tags = _check_cc_shared_library_tags,
+    BUILD_INFO_TRANLATOR_LABEL = "@bazel_tools//tools/build_defs/build_info:cc_build_info",
 )
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 65d8fcf..740ac5f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -627,6 +627,22 @@
     config.create("embedded_tools/MODULE.bazel", "module(name='bazel_tools')");
     config.create("embedded_tools/tools/build_defs/repo/BUILD");
     config.create(
+        "embedded_tools/tools/build_defs/build_info/bazel_cc_build_info.bzl",
+        "def _impl(ctx):",
+        "  output_groups = {",
+        "    'non_redacted_build_info_files': depset([ctx.info_file, ctx.version_file]),",
+        "    'redacted_build_info_files': depset([ctx.version_file]),",
+        "  }",
+        "  return OutputGroupInfo(**output_groups)",
+        "bazel_cc_build_info = rule(implementation = _impl)");
+    config.create(
+        "embedded_tools/tools/build_defs/build_info/BUILD",
+        "load('//tools/build_defs/build_info:bazel_cc_build_info.bzl'," + " 'bazel_cc_build_info')",
+        "bazel_cc_build_info(",
+        "    name = 'cc_build_info',",
+        "    visibility = ['//visibility:public'],",
+        ")");
+    config.create(
         "embedded_tools/tools/build_defs/repo/utils.bzl",
         "def maybe(repo_rule, name, **kwargs):",
         "  if name not in native.existing_rules():",