[clang] [Driver][MSVC] Don't assume default linker is link.exe (PR #199167)
Petr Hosek via cfe-commits
cfe-commits at lists.llvm.org
Thu May 21 23:14:13 PDT 2026
https://github.com/petrhosek updated https://github.com/llvm/llvm-project/pull/199167
>From cbea0cb3254abed7f5c2683fe225e8f511642fe5 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Fri, 22 May 2026 05:28:09 +0000
Subject: [PATCH 1/2] [Driver][MSVC] Don't assume default linker is link.exe
The default linker can be overriden with CLANG_DEFAULT_LINKER=lld
so the test shouldn't assume the default linker is link.exe.
---
clang/test/Driver/msvc-link.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index e3c3f980f8b51..97b9249722353 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -52,11 +52,9 @@
// RUN: FileCheck --check-prefix=HYBRID-WARN %s
// HYBRID-WARN: warning: argument unused during compilation: '-marm64x' [-Wunused-command-line-argument]
-// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld= -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LINK %s
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LINK %s
// DEBUG-LINK: link.exe"
// DEBUG-LINK-SAME: "-debug"
-// DEBUG-LINK-NOT: lld
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=lld -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LLD %s
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=lld-link -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LLD %s
>From e3f6a0a48ad83190c7304af5e51f596b25cbc4f4 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Fri, 22 May 2026 06:13:36 +0000
Subject: [PATCH 2/2] Rework the implementation to correctly handle -fuse-ld=
case
---
clang/lib/Driver/ToolChains/MSVC.cpp | 14 ++++++--------
clang/test/Driver/msvc-link.c | 2 ++
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp
index 23585ba45a0dd..15c1123f386b2 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -332,8 +332,10 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
}
- StringRef PreferredLinker = TC.getDriver().getPreferredLinker();
- if (PreferredLinker.empty()) {
+ const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
+ StringRef Linker = A ? A->getValue() : TC.getDriver().getPreferredLinker();
+
+ if (Linker.empty()) {
// If DWARF is requested, use LLD, because MSVC's link.exe will silently
// truncate the .debug_* sections to eight characters. PE/COFF doesn't allow
// section names longer than eight bytes in executables - LLD uses the same
@@ -341,15 +343,11 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (Args.hasArg(options::OPT_gdwarf, options::OPT_gdwarf_2,
options::OPT_gdwarf_3, options::OPT_gdwarf_4,
options::OPT_gdwarf_5, options::OPT_gdwarf_6))
- PreferredLinker = "lld-link";
+ Linker = "lld-link";
else
- PreferredLinker = "link";
+ Linker = "link";
}
- StringRef Linker =
- Args.getLastArgValue(options::OPT_fuse_ld_EQ, PreferredLinker);
- if (Linker.empty())
- Linker = PreferredLinker;
// We need to translate 'lld' into 'lld-link'.
if (Linker.equals_insensitive("lld"))
Linker = "lld-link";
diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index 97b9249722353..e3c3f980f8b51 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -52,9 +52,11 @@
// RUN: FileCheck --check-prefix=HYBRID-WARN %s
// HYBRID-WARN: warning: argument unused during compilation: '-marm64x' [-Wunused-command-line-argument]
+// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld= -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LINK %s
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LINK %s
// DEBUG-LINK: link.exe"
// DEBUG-LINK-SAME: "-debug"
+// DEBUG-LINK-NOT: lld
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=lld -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LLD %s
// RUN: %clang --target=i686-pc-windows-msvc -g -fuse-ld=lld-link -### %s 2>&1 | FileCheck --check-prefix=DEBUG-LLD %s
More information about the cfe-commits
mailing list