Update cc_toolchain_config_lib.bzl for bazelbuild/bazel#10967
diff --git a/cc/cc_toolchain_config_lib.bzl b/cc/cc_toolchain_config_lib.bzl
index 2eed9b4..72645f7 100644
--- a/cc/cc_toolchain_config_lib.bzl
+++ b/cc/cc_toolchain_config_lib.bzl
@@ -14,23 +14,31 @@
 
 """ A library of functions creating structs for CcToolchainConfigInfo."""
 
+def _check_is_none(obj, parameter_name, method_name):
+    if obj != None:
+        fail("{} parameter of {} should be None, found {}."
+            .format(parameter_name, method_name, type(obj)))
+
 def _check_is_none_or_right_type(obj, obj_of_right_type, parameter_name, method_name):
     if obj != None:
-        _check_right_type(obj, obj_of_right_type, parameter_name, method_name)
+        _check_same_type(obj, obj_of_right_type, parameter_name, method_name)
 
-def _check_right_type(obj, obj_of_right_type, parameter_name, method_name):
-    if type(obj) != type(obj_of_right_type):
+def _check_right_type(obj, expected_type, parameter_name, method_name):
+    if type(obj) != expected_type:
         fail("{} parameter of {} should be a {}, found {}."
-            .format(parameter_name, method_name, type(obj_of_right_type), type(obj)))
+            .format(parameter_name, method_name, expected_type, type(obj)))
+
+def _check_same_type(obj, obj_of_right_type, parameter_name, method_name):
+    _check_right_type(obj, type(obj_of_right_type), parameter_name, method_name)
 
 def _check_is_nonempty_string(obj, parameter_name, method_name):
-    _check_right_type(obj, "", parameter_name, method_name)
+    _check_same_type(obj, "", parameter_name, method_name)
     if obj == "":
         fail("{} parameter of {} must be a nonempty string."
             .format(parameter_name, method_name))
 
 def _check_is_nonempty_list(obj, parameter_name, method_name):
-    _check_right_type(obj, [], parameter_name, method_name)
+    _check_same_type(obj, [], parameter_name, method_name)
     if len(obj) == 0:
         fail("{} parameter of {} must be a nonempty list."
             .format(parameter_name, method_name))
@@ -119,7 +127,7 @@
     Returns:
         A FeatureSetInfo provider.
     """
-    _check_right_type(features, [], "features", "feature_set")
+    _check_same_type(features, [], "features", "feature_set")
     return FeatureSetInfo(features = features, type_name = "feature_set")
 
 WithFeatureSetInfo = provider(
@@ -140,8 +148,8 @@
     Returns:
         A WithFeatureSetInfo provider.
     """
-    _check_right_type(features, [], "features", "with_feature_set")
-    _check_right_type(not_features, [], "not_features", "with_feature_set")
+    _check_same_type(features, [], "features", "with_feature_set")
+    _check_same_type(not_features, [], "not_features", "with_feature_set")
     return WithFeatureSetInfo(
         features = features,
         not_features = not_features,
@@ -175,8 +183,8 @@
         An EnvSetInfo provider.
     """
     _check_is_nonempty_list(actions, "actions", "env_set")
-    _check_right_type(env_entries, [], "env_entries", "env_set")
-    _check_right_type(with_features, [], "with_features", "env_set")
+    _check_same_type(env_entries, [], "env_entries", "env_set")
+    _check_same_type(with_features, [], "with_features", "env_set")
     return EnvSetInfo(
         actions = actions,
         env_entries = env_entries,
@@ -277,8 +285,8 @@
         A FlagGroupInfo provider.
     """
 
-    _check_right_type(flags, [], "flags", "flag_group")
-    _check_right_type(flag_groups, [], "flag_groups", "flag_group")
+    _check_same_type(flags, [], "flags", "flag_group")
+    _check_same_type(flag_groups, [], "flag_groups", "flag_group")
     if len(flags) > 0 and len(flag_groups) > 0:
         fail("flag_group must not contain both a flag and another flag_group.")
     if len(flags) == 0 and len(flag_groups) == 0:
@@ -336,9 +344,9 @@
     Returns:
         A FlagSetInfo provider.
     """
-    _check_right_type(actions, [], "actions", "flag_set")
-    _check_right_type(with_features, [], "with_features", "flag_set")
-    _check_right_type(flag_groups, [], "flag_groups", "flag_set")
+    _check_same_type(actions, [], "actions", "flag_set")
+    _check_same_type(with_features, [], "with_features", "flag_set")
+    _check_same_type(flag_groups, [], "flag_groups", "flag_set")
     return FlagSetInfo(
         actions = actions,
         with_features = with_features,
@@ -405,12 +413,12 @@
     Returns:
         A FeatureInfo provider.
     """
-    _check_right_type(enabled, True, "enabled", "feature")
-    _check_right_type(flag_sets, [], "flag_sets", "feature")
-    _check_right_type(env_sets, [], "env_sets", "feature")
-    _check_right_type(requires, [], "requires", "feature")
-    _check_right_type(provides, [], "provides", "feature")
-    _check_right_type(implies, [], "implies", "feature")
+    _check_same_type(enabled, True, "enabled", "feature")
+    _check_same_type(flag_sets, [], "flag_sets", "feature")
+    _check_same_type(env_sets, [], "env_sets", "feature")
+    _check_same_type(requires, [], "requires", "feature")
+    _check_same_type(provides, [], "provides", "feature")
+    _check_same_type(implies, [], "implies", "feature")
     return FeatureInfo(
         name = name,
         enabled = enabled,
@@ -447,16 +455,26 @@
     return ToolPathInfo(name = name, path = path, type_name = "tool_path")
 
 ToolInfo = provider(
-    "Describes a tool associated with a crosstool action config.",
-    fields = ["path", "with_features", "execution_requirements", "type_name"],
+    doc = "Tool information. This differs from ToolPathInfo as it is intended to be used\
+ in action_configs and can accept labels.",
+    fields = [
+        "path",
+        "tool",
+        "with_features",
+        "execution_requirements",
+        "type_name",
+    ],
 )
 
-def tool(path, with_features = [], execution_requirements = []):
+def tool(path = None, with_features = [], execution_requirements = [], tool = None):
     """ Describes a tool associated with a crosstool action config.
 
     Args:
         path: Location of the tool; Can be absolute path (in case of non hermetic
-            toolchain), or path relative to the cc_toolchain's package.
+            toolchain), or path relative to the cc_toolchain's package. If this
+            parameter is set, tool must not be set.
+        tool: The built-artifact that should be used as this tool. If this is
+            set, path must not be set.
         with_features: A list of feature sets defining when this tool is
             applicable. The tool will used when any one of the feature sets
             evaluate to true. (That is, when when every 'feature' is enabled,
@@ -471,11 +489,21 @@
     Returns:
         A ToolInfo provider.
     """
-    _check_is_nonempty_string(path, "path", "tool")
-    _check_right_type(with_features, [], "with_features", "tool")
-    _check_right_type(execution_requirements, [], "execution_requirements", "tool")
+    if path == None and tool == None:
+        fail("Parameter path or parameter tool of tool should not be None.")
+
+    if path != None:
+        _check_is_nonempty_string(path, "path", "tool")
+        _check_is_none(tool, "tool", "tool")
+    if tool != None:
+        _check_is_none(path, "path", "tool")
+        _check_right_type(tool, "File", "tool", "tool")
+
+    _check_same_type(with_features, [], "with_features", "tool")
+    _check_same_type(execution_requirements, [], "execution_requirements", "tool")
     return ToolInfo(
         path = path,
+        tool = tool,
         with_features = with_features,
         execution_requirements = execution_requirements,
         type_name = "tool",
@@ -529,10 +557,10 @@
         An ActionConfigInfo provider.
     """
     _check_is_nonempty_string(action_name, "name", "action_config")
-    _check_right_type(enabled, True, "enabled", "action_config")
-    _check_right_type(tools, [], "tools", "action_config")
-    _check_right_type(flag_sets, [], "flag_sets", "action_config")
-    _check_right_type(implies, [], "implies", "action_config")
+    _check_same_type(enabled, True, "enabled", "action_config")
+    _check_same_type(tools, [], "tools", "action_config")
+    _check_same_type(flag_sets, [], "flag_sets", "action_config")
+    _check_same_type(implies, [], "implies", "action_config")
     return ActionConfigInfo(
         action_name = action_name,
         enabled = enabled,