From 22d277f068c04770e7287f3181a6838fbdc3659c Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 5 Feb 2025 07:05:54 -0800 Subject: [PATCH] Implement flag enabling Starlark implementation of C++ linking support Most of the linking code is in Starlark, including a large chunk of LTO support. What's not in Starlark: - conversion of LibraryToLink into LegacyLinkerInputs (causes a regression) - conversion of collectLibrariesToLink (causes a regression) - compilation of LTO artifacts (needs rewrite of C++ compilation support first) PiperOrigin-RevId: 723497031 Change-Id: I9cd75a9c11de9eb82b277757267bcaeaecfd7034 --- .../build/lib/rules/cpp/CppConfiguration.java | 9 +++++++++ .../devtools/build/lib/rules/cpp/CppOptions.java | 11 +++++++++++ .../builtins_bzl/common/builtin_exec_platforms.bzl | 1 + .../starlark/builtins_bzl/common/cc/cc_common.bzl | 14 ++++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index b273d1fe2b0ec5..7d370556d27c4e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -1011,4 +1011,13 @@ public boolean getProtoProfile(StarlarkThread thread) throws EvalException { CcModule.checkPrivateStarlarkificationAllowlist(thread); return cppOptions.protoProfile; } + + @StarlarkMethod( + name = "experimental_starlark_linking", + documented = false, + useStarlarkThread = true) + public boolean experimentalStarlarkLinking(StarlarkThread thread) throws EvalException { + CcModule.checkPrivateStarlarkificationAllowlist(thread); + return cppOptions.experimentalStarlarkLinking; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java index 80c81998039729..21eb5a44584f59 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java @@ -1078,6 +1078,17 @@ public Label getMemProfProfileLabel() { + " toolchain() resolution to choose a test runner.") public boolean experimentalPlatformCcTest; + @Option( + name = "experimental_starlark_linking", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = { + OptionEffectTag.LOADING_AND_ANALYSIS, + }, + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + help = "If enabled, a Starlark version of linking is used.") + public boolean experimentalStarlarkLinking; + /** See {@link #targetLibcTopLabel} documentation. * */ @Override public FragmentOptions getNormalized() { diff --git a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl index 89819387d84bdb..66ea56a72406ec 100644 --- a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl +++ b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl @@ -326,6 +326,7 @@ bazel_fragments["CppOptions"] = fragment( "//command_line_option:experimental_platform_cc_test", "//command_line_option:experimental_save_feature_state", "//command_line_option:experimental_use_llvm_covmap", + "//command_line_option:experimental_starlark_linking", ], outputs = [ "//command_line_option:crosstool_top", diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl index f516506add9605..1157254e510256 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl @@ -21,6 +21,8 @@ load( ) load(":common/cc/cc_info.bzl", "CcInfo") load(":common/cc/cc_shared_library_hint_info.bzl", "CcSharedLibraryHintInfo") +load(":common/cc/link/create_linking_context_from_compilation_outputs.bzl", "create_linking_context_from_compilation_outputs") +load(":common/cc/link/link.bzl", "link") load(":common/cc/link/link_build_variables.bzl", "create_link_variables") cc_common_internal = _builtins.internal.cc_common @@ -126,7 +128,11 @@ def _link( if emit_interface_shared_library == _UNBOUND: emit_interface_shared_library = False - return cc_common_internal.link( + if cc_toolchain._cpp_configuration.experimental_starlark_linking(): + link_func = link + else: + link_func = cc_common_internal.link + return link_func( actions = actions, name = name, feature_configuration = feature_configuration, @@ -570,7 +576,11 @@ def _create_linking_context_from_compilation_outputs( if test_only_target == _UNBOUND: test_only_target = False - return cc_common_internal.create_linking_context_from_compilation_outputs( + if cc_toolchain._cpp_configuration.experimental_starlark_linking(): + linking_func = create_linking_context_from_compilation_outputs + else: + linking_func = cc_common_internal.create_linking_context_from_compilation_outputs + return linking_func( actions = actions, name = name, feature_configuration = feature_configuration,