diff --git a/cc/private/cc_common.bzl b/cc/private/cc_common.bzl index aead6c53..9d496ecb 100644 --- a/cc/private/cc_common.bzl +++ b/cc/private/cc_common.bzl @@ -35,7 +35,7 @@ load("//cc/private/link:create_linking_context_from_compilation_outputs.bzl", "c load("//cc/private/link:create_linkstamp.bzl", "create_linkstamp") load("//cc/private/link:link.bzl", "link") load("//cc/private/link:link_build_variables.bzl", "create_link_variables") -load("//cc/private/link:lto_backends.bzl", "create_lto_backend_artifacts") +load("//cc/private/link:lto_backends.bzl", "create_lto_backend_artifacts", "setup_common_lto_variables") load("//cc/private/rules_impl:cc_toolchain_info.bzl", "CcToolchainInfo") load("//cc/private/rules_impl:native.bzl", _cc_common_internal = "native_cc_common") load("//cc/private/toolchain_config:cc_toolchain_config_info.bzl", "create_cc_toolchain_config_info") @@ -589,6 +589,9 @@ def _create_lto_backend_artifacts( should_create_per_object_debug_info, argv): _cc_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST) + + build_variables, additional_inputs = setup_common_lto_variables(cc_toolchain, feature_configuration) + return create_lto_backend_artifacts( actions = actions or ctx.actions, bitcode_file = bitcode_file, @@ -598,6 +601,8 @@ def _create_lto_backend_artifacts( cc_toolchain = cc_toolchain, use_pic = use_pic, should_create_per_object_debug_info = should_create_per_object_debug_info, + build_variables = build_variables, + additional_inputs = additional_inputs, argv = argv, ) diff --git a/cc/private/link/lto_backends.bzl b/cc/private/link/lto_backends.bzl index b3e33e1d..526b913b 100644 --- a/cc/private/link/lto_backends.bzl +++ b/cc/private/link/lto_backends.bzl @@ -125,6 +125,8 @@ def create_lto_backends( if file.is_directory: fail("Thinlto with tree artifacts requires feature use_lto_native_object_directory.") + build_variables, additional_inputs = setup_common_lto_variables(cc_toolchain, feature_configuration) + # Make this a NestedSet to return from LtoBackendAction.getAllowedDerivedInputs. For M binaries # and N .o files, this is O(M*N). If we had nested sets of bitcode files, it would be O(M + N). all_bitcode_depset = depset(all_bitcode) @@ -153,6 +155,8 @@ def create_lto_backends( cc_toolchain = cc_toolchain, use_pic = use_pic, should_create_per_object_debug_info = debug, + build_variables = build_variables, + additional_inputs = additional_inputs, argv = backend_user_compile_flags, )) else: @@ -181,6 +185,8 @@ def create_lto_backends( cc_toolchain = cc_toolchain, use_pic = use_pic, should_create_per_object_debug_info = debug, + build_variables = build_variables, + additional_inputs = additional_inputs, argv = backend_user_compile_flags, )) return lto_outputs @@ -228,6 +234,8 @@ def create_shared_non_lto_artifacts( cpp_config = cc_toolchain._cpp_configuration debug = should_create_per_object_debug_info(feature_configuration, cpp_config) + build_variables, additional_inputs = setup_common_lto_variables(cc_toolchain, feature_configuration) + shared_non_lto_backends = {} for obj in object_file_inputs: if obj not in lto_compilation_context.lto_bitcode_inputs: @@ -244,10 +252,47 @@ def create_shared_non_lto_artifacts( cc_toolchain = cc_toolchain, use_pic = use_pic, should_create_per_object_debug_info = debug, + build_variables = build_variables, + additional_inputs = additional_inputs, argv = backend_user_compile_flags, ) return shared_non_lto_backends +def setup_common_lto_variables( + cc_toolchain, + feature_configuration): + """ + Populates build_variables and additional_inputs with data that is independent of what file is the input to the action. + + Args: + cc_toolchain: (CcToolchainInfo) The C++ toolchain. + feature_configuration: (feature_configuration) The feature configuration. + + Returns: + A CcToolchainVariables provider and a list[File] of additional inputs. + """ + + build_variables = {} + additional_inputs = [] + + _add_profile_for_lto_backend( + additional_inputs, + cc_toolchain._fdo_context, + feature_configuration, + build_variables, + ) + + # Add the context sensitive instrument path to the backend. + if feature_configuration.is_enabled("cs_fdo_instrument"): + build_variables["cs_fdo_instrument_path"] = cc_toolchain._cpp_configuration.cs_fdo_instrument() + + build_variables = _cc_internal.combine_cc_toolchain_variables( + cc_toolchain._build_variables, + _cc_internal.cc_toolchain_variables(vars = build_variables), + ) + + return build_variables, additional_inputs + def create_lto_backend_artifacts( *, actions, @@ -259,6 +304,8 @@ def create_lto_backend_artifacts( cc_toolchain, use_pic, should_create_per_object_debug_info, + build_variables, + additional_inputs, argv): """Create an LTO backend. @@ -281,26 +328,26 @@ def create_lto_backend_artifacts( cc_toolchain: (CcToolchainInfo) The C++ toolchain. use_pic: (bool) Whether to use PIC. should_create_per_object_debug_info: (bool) Whether to create per-object debug info. + build_variables (CcToolchainVariables): + additional_inputs: list[File]: argv: (list[str]) The command line arguments to pass to the LTO backend. Returns: An LtoBackendArtifactsInfo provider. """ + if not _cc_common_internal.action_is_enabled(feature_configuration = feature_configuration, action_name = "lto-backend"): + fail("Thinlto build is requested, but the C++ toolchain doesn't define an action_config for 'lto-backend' action.") + create_shared_non_lto = all_bitcode_files == None - build_variables = {} - additional_inputs = [] - _initialize_build_variables( + build_variables = _cc_internal.combine_cc_toolchain_variables( build_variables, - additional_inputs, - cc_toolchain, - feature_configuration, - argv, + _cc_internal.cc_toolchain_variables(vars = { + "user_compile_flags": _cc_internal.intern_string_sequence_variable_value(argv), + }), ) - build_variables = _cc_internal.cc_toolchain_variables(vars = build_variables) - build_variables = _cc_internal.combine_cc_toolchain_variables(cc_toolchain._build_variables, build_variables) env = _cc_common_internal.get_environment_variables( feature_configuration = feature_configuration, action_name = "lto-backend", @@ -372,26 +419,6 @@ def create_lto_backend_artifacts( _dwo_file = dwo_file, ) -def _initialize_build_variables(build_variables, additional_inputs, cc_toolchain, feature_configuration, user_compile_flags): - """ - Populates build_variables and additional_inputs with data that is independent of what file is the input to the action. - """ - _add_profile_for_lto_backend( - additional_inputs, - cc_toolchain._fdo_context, - feature_configuration, - build_variables, - ) - - # Add the context sensitive instrument path to the backend. - if feature_configuration.is_enabled("cs_fdo_instrument"): - build_variables["cs_fdo_instrument_path"] = cc_toolchain._cpp_configuration.cs_fdo_instrument() - - build_variables["user_compile_flags"] = _cc_internal.intern_string_sequence_variable_value(user_compile_flags) - - if not _cc_common_internal.action_is_enabled(feature_configuration = feature_configuration, action_name = "lto-backend"): - fail("Thinlto build is requested, but the C++ toolchain doesn't define an action_config for 'lto-backend' action.") - def _add_profile_for_lto_backend(additional_inputs, fdo_context, feature_configuration, build_variables): prefetch = getattr(fdo_context, "prefetch_hints_artifact", None) if prefetch != None: