[clang] [FatLTO] Detect LLD linker more reliably (PR #128285)
Vincent Lee via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 22 23:19:20 PST 2025
https://github.com/thevinster updated https://github.com/llvm/llvm-project/pull/128285
>From b8d961acfa2bf17486d63de9481ff46445d6b38f Mon Sep 17 00:00:00 2001
From: Vincent Lee <leevince at fb.com>
Date: Fri, 21 Feb 2025 20:33:25 -0800
Subject: [PATCH 1/3] [FatLTO] Detect LLD linker more reliably
---
clang/lib/Driver/ToolChains/CommonArgs.cpp | 5 ++---
.../usr/x86_64-unknown-linux-gnu/bin/lld-wrapper | 0
clang/test/Driver/fat-lto-objects.c | 3 +++
3 files changed, 5 insertions(+), 3 deletions(-)
create mode 100755 clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 360754bdb3161..4f60287a1142b 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -862,13 +862,12 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
const llvm::Triple &Triple = ToolChain.getTriple();
const bool IsOSAIX = Triple.isOSAIX();
const bool IsAMDGCN = Triple.isAMDGCN();
- const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
+ StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
const Driver &D = ToolChain.getDriver();
const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
options::OPT_fno_fat_lto_objects, false);
const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
- if (llvm::sys::path::filename(Linker) != "ld.lld" &&
- llvm::sys::path::stem(Linker) != "ld.lld" && !Triple.isOSOpenBSD()) {
+ if (Linker != "lld" && Linker != "lld-link" && !Triple.isOSOpenBSD()) {
// Tell the linker to load the plugin. This has to come before
// AddLinkerInputs as gold requires -plugin and AIX ld requires -bplugin to
// come before any -plugin-opt/-bplugin_opt that -Wl might forward.
diff --git a/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper b/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
new file mode 100755
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/fat-lto-objects.c b/clang/test/Driver/fat-lto-objects.c
index fae64ea7fd1a1..7b87e2b468886 100644
--- a/clang/test/Driver/fat-lto-objects.c
+++ b/clang/test/Driver/fat-lto-objects.c
@@ -49,5 +49,8 @@
// RUN: -fuse-ld=lld -flto -ffat-lto-objects -### 2>&1 | FileCheck --check-prefix=LTO %s
// RUN: %clang --target=x86_64-unknown-linux-gnu --sysroot=%S/Inputs/basic_cross_linux_tree %s \
// RUN: -fuse-ld=lld -fno-lto -ffat-lto-objects -### 2>&1 | FileCheck --check-prefix=NOLTO %s
+// RUN: %clang --target=x86_64-unknown-linux-gnu --sysroot=%S/Inputs/basic_cross_linux_tree %s \
+// RUN: -fuse-ld=lld --ld-path=%S/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper \
+// RUN: -flto -ffat-lto-objects -### 2>&1 | FileCheck --check-prefix=LTO %s
// LTO: "--fat-lto-objects"
// NOLTO-NOT: "--fat-lto-objects"
>From da36ced7d82588da99d6348cde24062a7efa3c54 Mon Sep 17 00:00:00 2001
From: Vincent Lee <leevince at fb.com>
Date: Fri, 21 Feb 2025 20:50:05 -0800
Subject: [PATCH 2/3] Make lld-wrapper a symlink to ld.lld
---
.../usr/x86_64-unknown-linux-gnu/bin/lld-wrapper | 1 +
1 file changed, 1 insertion(+)
mode change 100755 => 120000 clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
diff --git a/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper b/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
deleted file mode 100755
index e69de29bb2d1d..0000000000000
diff --git a/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper b/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
new file mode 120000
index 0000000000000..9b032ee3b3f1d
--- /dev/null
+++ b/clang/test/Driver/Inputs/basic_cross_linux_tree/usr/x86_64-unknown-linux-gnu/bin/lld-wrapper
@@ -0,0 +1 @@
+ld.lld
\ No newline at end of file
>From b03056a9b7737557e4e5fac6333a93d9c4ff67ec Mon Sep 17 00:00:00 2001
From: Vincent Lee <leevince at fb.com>
Date: Sat, 22 Feb 2025 23:18:20 -0800
Subject: [PATCH 3/3] Recover original lld check
---
clang/lib/Driver/ToolChains/CommonArgs.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 4f60287a1142b..b43472a52038b 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -863,11 +863,14 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
const bool IsOSAIX = Triple.isOSAIX();
const bool IsAMDGCN = Triple.isAMDGCN();
StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
+ const char *LinkerPath = Args.MakeArgString(ToolChain.GetLinkerPath());
const Driver &D = ToolChain.getDriver();
const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
options::OPT_fno_fat_lto_objects, false);
const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
- if (Linker != "lld" && Linker != "lld-link" && !Triple.isOSOpenBSD()) {
+ if (Linker != "lld" && Linker != "lld-link" &&
+ llvm::sys::path::filename(LinkerPath) != "ld.lld" &&
+ llvm::sys::path::stem(LinkerPath) != "ld.lld" && !Triple.isOSOpenBSD()) {
// Tell the linker to load the plugin. This has to come before
// AddLinkerInputs as gold requires -plugin and AIX ld requires -bplugin to
// come before any -plugin-opt/-bplugin_opt that -Wl might forward.
More information about the cfe-commits
mailing list