Add support for LLD in unix_cc_configure
Unix cc autoconfiguration would only enable LTO support with the `gold` linker.
This commit enables `thin_lto` when using LLD - it's a drop-in replacement for GNU linkers.
Closes #12890.
PiperOrigin-RevId: 355601031
diff --git a/tools/cpp/unix_cc_configure.bzl b/tools/cpp/unix_cc_configure.bzl
index be4d579..fb567a1 100644
--- a/tools/cpp/unix_cc_configure.bzl
+++ b/tools/cpp/unix_cc_configure.bzl
@@ -171,15 +171,16 @@
])
return result.stderr.find(pattern) == -1
-def _find_gold_linker_path(repository_ctx, cc):
- """Checks if `gold` is supported by the C compiler.
+def _find_linker_path(repository_ctx, cc, linker):
+ """Checks if a given linker is supported by the C compiler.
Args:
repository_ctx: repository_ctx.
cc: path to the C compiler.
+ linker: linker to find
Returns:
- String to put as value to -fuse-ld= flag, or None if gold couldn't be found.
+ String to put as value to -fuse-ld= flag, or None if linker couldn't be found.
"""
result = repository_ctx.execute([
cc,
@@ -191,19 +192,19 @@
# gold when only a very old (year 2010 and older) is present.
"-Wl,--start-lib",
"-Wl,--end-lib",
- "-fuse-ld=gold",
+ "-fuse-ld=" + linker,
"-v",
])
if result.return_code != 0:
return None
for line in result.stderr.splitlines():
- if line.find("gold") == -1:
+ if line.find(linker) == -1:
continue
for flag in line.split(" "):
- if flag.find("gold") == -1:
+ if flag.find(linker) == -1:
continue
- if flag.find("--enable-gold") > -1 or flag.find("--with-plugin-ld") > -1:
+ if flag.find("--enable-" + linker) > -1 or flag.find("--with-plugin-ld") > -1:
# skip build configuration options of gcc itself
# TODO(hlopko): Add redhat-like worker on the CI (#9392)
continue
@@ -216,8 +217,8 @@
flag = flag.replace("-fuse-ld=", "")
return flag
auto_configure_warning(
- "CC with -fuse-ld=gold returned 0, but its -v output " +
- "didn't contain 'gold', falling back to the default linker.",
+ "CC with -fuse-ld=" + linker + " returned 0, but its -v output " +
+ "didn't contain '" + linker + "', falling back to the default linker.",
)
return None
@@ -413,7 +414,10 @@
bazel_linklibs,
False,
), ":")
- gold_linker_path = _find_gold_linker_path(repository_ctx, cc)
+ gold_or_lld_linker_path = (
+ _find_linker_path(repository_ctx, cc, "lld") or
+ _find_linker_path(repository_ctx, cc, "gold")
+ )
cc_path = repository_ctx.path(cc)
if not str(cc_path).startswith(str(repository_ctx.path(".")) + "/"):
# cc is outside the repository, set -B
@@ -531,7 +535,7 @@
),
"%{cxx_flags}": get_starlark_list(cxx_opts + _escaped_cplus_include_paths(repository_ctx)),
"%{link_flags}": get_starlark_list((
- ["-fuse-ld=" + gold_linker_path] if gold_linker_path else []
+ ["-fuse-ld=" + gold_or_lld_linker_path] if gold_or_lld_linker_path else []
) + _add_linker_option_if_supported(
repository_ctx,
cc,
@@ -606,6 +610,6 @@
"%{dbg_compile_flags}": get_starlark_list(["-g"]),
"%{coverage_compile_flags}": coverage_compile_flags,
"%{coverage_link_flags}": coverage_link_flags,
- "%{supports_start_end_lib}": "True" if gold_linker_path else "False",
+ "%{supports_start_end_lib}": "True" if gold_or_lld_linker_path else "False",
},
)