old_contents: # pylint: disable=g-bad-file-header
  # Copyright 2016 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.
  
  """Finds the c++ toolchain if it is enabled.
  
  Otherwise, falls back to a toolchain constructed from the CppConfiguration.
  """
  
  def _get_cpp_toolchain_attr(ctx, attr):
    if hasattr(ctx.attr._cc_toolchain[cc_common.CcToolchainInfo], attr):
      return getattr(ctx.attr._cc_toolchain[cc_common.CcToolchainInfo], attr)
    else:
      return getattr(ctx.fragments.cpp, attr)
  
  def _make_legacy_toolchain(ctx):
      return struct(
          objcopy_executable = _get_cpp_toolchain_attr(ctx, "objcopy_executable"),
          compiler_executable = _get_cpp_toolchain_attr(ctx, "compiler_executable"),
          preprocessor_executable = _get_cpp_toolchain_attr(ctx, "preprocessor_executable"),
          nm_executable = _get_cpp_toolchain_attr(ctx, "nm_executable"),
          objdump_executable = _get_cpp_toolchain_attr(ctx, "objdump_executable"),
          ar_executable = _get_cpp_toolchain_attr(ctx, "ar_executable"),
          strip_executable = _get_cpp_toolchain_attr(ctx, "strip_executable"),
          ld_executable = _get_cpp_toolchain_attr(ctx, "ld_executable"),
          compiler = _get_cpp_toolchain_attr(ctx, "compiler"),
      )
  
  def find_cpp_toolchain(ctx):
    """If the c++ toolchain is in use, returns it.
  
    Otherwise, returns a c++ toolchain derived from legacy toolchain selection.
  
    Args:
      ctx: The rule context for which to find a toolchain.
  
    Returns:
      A CcToolchainProvider.
    """
  
    if Label("@bazel_tools//tools/cpp:toolchain_type") in ctx.fragments.platform.enabled_toolchain_types:
      return ctx.toolchains["@bazel_tools//tools/cpp:toolchain_type"]
    else:
      return _make_legacy_toolchain(ctx)
  
new_contents: # pylint: disable=g-bad-file-header
  # Copyright 2016 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.
  
  """
  Finds the c++ toolchain.
  
  Returns the toolchain if enabled, and falls back to a toolchain constructed from
  the CppConfiguration.
  """
  
  def find_cpp_toolchain(ctx):
    """
    Finds the c++ toolchain.
  
    If the c++ toolchain is in use, returns it.  Otherwise, returns a c++
    toolchain derived from legacy toolchain selection.
  
    Args:
      ctx: The rule context for which to find a toolchain.
  
    Returns:
      A CcToolchainProvider.
    """
  
    if Label("@bazel_tools//tools/cpp:toolchain_type") in ctx.fragments.platform.enabled_toolchain_types:
      return ctx.toolchains["@bazel_tools//tools/cpp:toolchain_type"]
    else:
      return ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]
  
subject: Update tools/cpp/toolchain_utils.bzl to return the proper C++ toolchain