Automated rollback of commit 0f352c3497f480bbebc9507a1cfc2cdc9472b827.

*** Reason for rollback ***

Rollforward with fix for b/365154741

*** Original change description ***

Automated rollback of commit 0bc1ba56ef2f8e791841bc074376a02ad8608dc2.

*** Reason for rollback ***

TAP failures in Bazel/Blaze, see b/365154741 and discussion at https://chat.google.com/room/AAAAXE3XKrY/_e3TpBFJvus

*** Original change description ***

Add user-facing documentation for cc_tool_map

BEGIN_PUBLIC

Add user-facing documentation for cc_tool_map

Adds user-facing documentation for the cc_tool_map toolchain rule, including an example and higher level analogies.

END_PUBLIC

***

***

PiperOrigin-RevId: 672000172
Change-Id: If7ad64e2378a2016d389a3718944aa04bc5e9759
diff --git a/MODULE.bazel b/MODULE.bazel
index e7e5603..51a00b2 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -6,6 +6,7 @@
 
 bazel_dep(name = "bazel_skylib", version = "1.7.1")
 bazel_dep(name = "platforms", version = "0.0.7")
+bazel_dep(name = "stardoc", version = "0.7.0")
 
 cc_configure = use_extension("@bazel_tools//tools/cpp:cc_configure.bzl", "cc_configure_extension")
 use_repo(cc_configure, "local_config_cc_toolchains")
diff --git a/cc/BUILD b/cc/BUILD
index 60c4290..d0db658 100644
--- a/cc/BUILD
+++ b/cc/BUILD
@@ -97,7 +97,7 @@
 bzl_library(
     name = "cc_toolchain_config_lib_bzl",
     srcs = ["cc_toolchain_config_lib.bzl"],
-    visibility = ["//visibility:private"],
+    visibility = ["//cc/toolchains:__subpackages__"],
 )
 
 cc_toolchain_alias(name = "current_cc_toolchain")
diff --git a/cc/toolchains/BUILD b/cc/toolchains/BUILD
index 1b001cb..8ae4d97 100644
--- a/cc/toolchains/BUILD
+++ b/cc/toolchains/BUILD
@@ -14,6 +14,8 @@
 
 load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
 load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
+load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
+load("@stardoc//stardoc:stardoc.bzl", "stardoc")
 
 bool_flag(
     name = "experimental_enable_rule_based_toolchains",
@@ -27,9 +29,11 @@
     visibility = ["//visibility:public"],
     deps = [
         "//cc:action_names_bzl",
+        "//cc:cc_toolchain_config_lib_bzl",
         "//cc:find_cc_toolchain_bzl",
         "//cc/private/rules_impl:cc_flags_supplier_lib_bzl",
         "//cc/private/rules_impl:native_bzl",
+        "//cc/toolchains/impl:toolchain_impl_rules",
         "@bazel_skylib//rules/directory:glob",
     ],
 )
@@ -42,3 +46,16 @@
     ]),
     visibility = ["//visibility:public"],
 )
+
+stardoc(
+    name = "toolchain_api",
+    out = "generated_toolchain_api.md",
+    input = "//cc/toolchains/impl:documented_api.bzl",
+    deps = [":toolchain_rules"],
+)
+
+diff_test(
+    name = "toolchain_api_diff_test",
+    file1 = ":generated_toolchain_api.md",
+    file2 = ":toolchain_api.md",
+)
diff --git a/cc/toolchains/impl/BUILD b/cc/toolchains/impl/BUILD
index 8484e1c..2ad5817 100644
--- a/cc/toolchains/impl/BUILD
+++ b/cc/toolchains/impl/BUILD
@@ -4,3 +4,16 @@
 
 # I wanted to call it private / internal, but then buildifier complains about
 # referencing it from the tests directory.
+
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+
+exports_files(
+    ["documented_api.bzl"],
+    visibility = ["//cc/toolchains:__subpackages__"],
+)
+
+bzl_library(
+    name = "toolchain_impl_rules",
+    srcs = glob(["*.bzl"]),
+    visibility = ["//cc/toolchains:__subpackages__"],
+)
diff --git a/cc/toolchains/impl/documented_api.bzl b/cc/toolchains/impl/documented_api.bzl
new file mode 100644
index 0000000..d840b7e
--- /dev/null
+++ b/cc/toolchains/impl/documented_api.bzl
@@ -0,0 +1,18 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""This is a list of rules/macros that should be exported as documentation."""
+
+load("//cc/toolchains:tool_map.bzl", _cc_tool_map = "cc_tool_map")
+
+cc_tool_map = _cc_tool_map
diff --git a/cc/toolchains/tool_map.bzl b/cc/toolchains/tool_map.bzl
index 300523d..62e94e6 100644
--- a/cc/toolchains/tool_map.bzl
+++ b/cc/toolchains/tool_map.bzl
@@ -51,7 +51,7 @@
             mandatory = True,
             doc = """A list of action names to apply this action to.
 
-See @toolchain//actions:all for valid options.
+See //cc/toolchains/actions:BUILD for valid options.
 """,
         ),
         "tools": attr.label_list(
@@ -60,10 +60,7 @@
             allow_files = True,
             doc = """The tool to use for the specified actions.
 
-A tool is usually a binary, but may be a `cc_tool`.
-
-If multiple tools are specified, the first tool that has `with_features` that
-satisfy the currently enabled feature set is used.
+The tool may be a `cc_tool` or other executable rule.
 """,
         ),
     },
@@ -71,12 +68,47 @@
 )
 
 def cc_tool_map(name, tools, **kwargs):
-    """Configuration for which actions require which tools.
+    """A toolchain configuration rule that maps toolchain actions to tools.
+
+    A cc_tool_map aggregates all the tools that may be used for a given toolchain and maps them to
+    their corresponding actions. Conceptually, this is similar to the `CXX=/path/to/clang++`
+    environment variables that most build systems use to determine which tools to use for a given
+    action. To simplify usage, some actions have been grouped together (for example,
+    //cc/toolchains/actions:cpp_compile_actions) to
+    logically express "all the C++ compile actions".
+
+    In Bazel, there is a little more granularity to the mapping, so the mapping doesn't follow the
+    traditional `CXX`, `AR`, etc. naming scheme. For a comprehensive list of all the well-known
+    actions, see //cc/toolchains/actions:BUILD.
+
+    Example usage:
+    ```
+    load("//cc/toolchains:tool_map.bzl", "cc_tool_map")
+
+    cc_tool_map(
+        name = "all_tools",
+        tools = {
+            "//cc/toolchains/actions:assembly_actions": ":asm",
+            "//cc/toolchains/actions:c_compile": ":clang",
+            "//cc/toolchains/actions:cpp_compile_actions": ":clang++",
+            "//cc/toolchains/actions:link_actions": ":lld",
+            "//cc/toolchains/actions:objcopy_embed_data": ":llvm-objcopy",
+            "//cc/toolchains/actions:strip": ":llvm-strip",
+            "//cc/toolchains/actions:ar_actions": ":llvm-ar",
+        },
+    )
+    ```
+
+    Note:
+       Due to an implementation limitation, if you need to map the same tool to multiple actions,
+       you will need to create an intermediate alias for the tool for each set of actions. See
+       https://github.com/bazelbuild/rules_cc/issues/235 for more details.
 
     Args:
-        name: (str) The name of the target
-        tools: (Dict[Action target, Executable target])
-        **kwargs: kwargs to be passed to the underlying rule.
+        name: (str) The name of the target.
+        tools: (Dict[target providing ActionTypeSetInfo, Executable target]) A mapping between `cc_action_type` targets
+            and the `cc_tool` or executable target that implements that action.
+        **kwargs: [common attributes](https://bazel.build/reference/be/common-definitions#common-attributes) that should be applied to this rule.
     """
     _cc_tool_map(
         name = name,
diff --git a/cc/toolchains/toolchain_api.md b/cc/toolchains/toolchain_api.md
new file mode 100644
index 0000000..3a4a490
--- /dev/null
+++ b/cc/toolchains/toolchain_api.md
@@ -0,0 +1,59 @@
+<!-- Generated with Stardoc: http://skydoc.bazel.build -->
+
+This is a list of rules/macros that should be exported as documentation.
+
+<a id="cc_tool_map"></a>
+
+## cc_tool_map
+
+<pre>
+cc_tool_map(<a href="#cc_tool_map-name">name</a>, <a href="#cc_tool_map-tools">tools</a>, <a href="#cc_tool_map-kwargs">kwargs</a>)
+</pre>
+
+A toolchain configuration rule that maps toolchain actions to tools.
+
+A cc_tool_map aggregates all the tools that may be used for a given toolchain and maps them to
+their corresponding actions. Conceptually, this is similar to the `CXX=/path/to/clang++`
+environment variables that most build systems use to determine which tools to use for a given
+action. To simplify usage, some actions have been grouped together (for example,
+//third_party/bazel_rules/rules_cc/cc/toolchains/actions:cpp_compile_actions) to
+logically express "all the C++ compile actions".
+
+In Bazel, there is a little more granularity to the mapping, so the mapping doesn't follow the
+traditional `CXX`, `AR`, etc. naming scheme. For a comprehensive list of all the well-known
+actions, see //third_party/bazel_rules/rules_cc/cc/toolchains/actions:BUILD.
+
+Example usage:
+```
+load("//third_party/bazel_rules/rules_cc/cc/toolchains:tool_map.bzl", "cc_tool_map")
+
+cc_tool_map(
+    name = "all_tools",
+    tools = {
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:assembly_actions": ":asm",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:c_compile": ":clang",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:cpp_compile_actions": ":clang++",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:link_actions": ":lld",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:objcopy_embed_data": ":llvm-objcopy",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:strip": ":llvm-strip",
+        "//third_party/bazel_rules/rules_cc/cc/toolchains/actions:ar_actions": ":llvm-ar",
+    },
+)
+```
+
+Note:
+   Due to an implementation limitation, if you need to map the same tool to multiple actions,
+   you will need to create an intermediate alias for the tool for each set of actions. See
+   https://github.com/bazelbuild/rules_cc/issues/235 for more details.
+
+
+**PARAMETERS**
+
+
+| Name  | Description | Default Value |
+| :------------- | :------------- | :------------- |
+| <a id="cc_tool_map-name"></a>name |  (str) The name of the target.   |  none |
+| <a id="cc_tool_map-tools"></a>tools |  (Dict[target providing ActionTypeSetInfo, Executable target]) A mapping between `cc_action_type` targets and the `cc_tool` or executable target that implements that action.   |  none |
+| <a id="cc_tool_map-kwargs"></a>kwargs |  [common attributes](https://bazel.build/reference/be/common-definitions#common-attributes) that should be applied to this rule.   |  none |
+
+