[lld] [lld][COFF] Add per-target runtime directories to library search path (PR #227744)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 30 07:53:20 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
Author: David Truby (DavidTruby)
<details>
<summary>Changes</summary>
Currently when -DLLVM_PER_TARGET_RUNTIME_DIR=On, lld can't find clang_rt or flang_rt. This patch fixes this issue by adding the per-target runtime directories to the search path.
---
Full diff: https://github.com/llvm/llvm-project/pull/227744.diff
4 Files Affected:
- (modified) lld/COFF/Driver.cpp (+31)
- (modified) lld/COFF/Driver.h (+2)
- (modified) lld/test/COFF/print-search-paths-arm64.s (+4-2)
- (modified) lld/test/COFF/print-search-paths.s (+2)
``````````diff
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index ecbb5e9fff4e1..c50b4df672f7a 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -204,6 +204,23 @@ static bool compatibleMachineType(COFFLinkerContext &ctx, MachineTypes mt) {
}
}
+static std::optional<std::string>
+perTargetRuntimeDirForMachineType(MachineTypes mt) {
+ switch (mt) {
+ case ARM64:
+ case ARM64X:
+ return {"aarch64-pc-windows-msvc"};
+ case ARM64EC:
+ return {"arm64ec-pc-windows-msvc"};
+ case AMD64:
+ return {"x86_64-pc-windows-msvc"};
+ case I386:
+ return {"i686-pc-windows-msvc"};
+ default:
+ return std::nullopt;
+ }
+}
+
void LinkerDriver::addFile(InputFile *file) {
Log(ctx) << "Reading " << toString(file);
if (file->lazy) {
@@ -783,6 +800,9 @@ void LinkerDriver::setMachine(MachineTypes machine) {
ctx.hybridSymtab.emplace(ctx, ARM64);
}
+ if (!ctx.config.mingw)
+ addClangPerTargetRuntimeDirSearchPaths();
+
addWinSysRootLibSearchPaths();
}
@@ -867,6 +887,7 @@ void LinkerDriver::addClangLibSearchPaths(const std::string &argv0) {
SmallString<128> runtimeLibDir(rootDir);
sys::path::append(runtimeLibDir, "lib", "clang",
std::to_string(LLVM_VERSION_MAJOR), "lib");
+ clangRuntimeLibDir = runtimeLibDir.str();
// Resource dir + osname, which is hardcoded to windows since we are in the
// COFF driver.
SmallString<128> runtimeLibDirWithOS(runtimeLibDir);
@@ -877,6 +898,16 @@ void LinkerDriver::addClangLibSearchPaths(const std::string &argv0) {
searchPaths.push_back(saver().save(libDir.str()));
}
+void LinkerDriver::addClangPerTargetRuntimeDirSearchPaths() {
+ // Add per-target resource dir library path
+ if (std::optional<std::string> machineDir =
+ perTargetRuntimeDirForMachineType(ctx.config.machine)) {
+ SmallString<128> targetRuntimeDir(clangRuntimeLibDir);
+ sys::path::append(targetRuntimeDir, *machineDir);
+ searchPaths.push_back(saver().save(targetRuntimeDir.str()));
+ }
+}
+
void LinkerDriver::addWinSysRootLibSearchPaths() {
if (!diaPath.empty()) {
// The DIA SDK always uses the legacy vc arch, even in new MSVC versions.
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
index 9f4f181379d2b..b3ebaf8481685 100644
--- a/lld/COFF/Driver.h
+++ b/lld/COFF/Driver.h
@@ -83,6 +83,7 @@ class LinkerDriver {
void addFile(InputFile *file);
void addClangLibSearchPaths(const std::string &argv0);
+ void addClangPerTargetRuntimeDirSearchPaths();
// Used by ArchiveFile to enqueue members.
void enqueueArchiveMember(const Archive::Child &c, const Archive::Symbol &sym,
@@ -204,6 +205,7 @@ class LinkerDriver {
llvm::SmallString<128> universalCRTLibPath;
int sdkMajor = 0;
llvm::SmallString<128> windowsSdkLibPath;
+ std::string clangRuntimeLibDir;
// For linkreprofullpathrsp
std::unique_ptr<llvm::raw_fd_ostream> reproFile;
diff --git a/lld/test/COFF/print-search-paths-arm64.s b/lld/test/COFF/print-search-paths-arm64.s
index fb5c8897a165d..ecfeda7a10159 100644
--- a/lld/test/COFF/print-search-paths-arm64.s
+++ b/lld/test/COFF/print-search-paths-arm64.s
@@ -2,11 +2,11 @@
# RUN: llvm-mc -triple aarch64-windows-msvc %s -filetype=obj -o %t.aarch64.obj
# RUN: lld-link -dll -noentry -winsysroot:%t.dir/sysroot -vctoolsversion:1.1.1.1 -winsdkversion:10.0.1 -libpath:custom-dir \
-# RUN: %t.aarch64.obj -print-search-paths | FileCheck -DSYSROOT=%t.dir %s
+# RUN: %t.aarch64.obj -print-search-paths | FileCheck -DSYSROOT=%t.dir %s --check-prefixes=CHECK,AARCH64
# RUN: llvm-mc -triple arm64ec-windows-msvc %s -filetype=obj -o %t.arm64ec.obj
# RUN: lld-link -dll -noentry -winsysroot:%t.dir/sysroot -vctoolsversion:1.1.1.1 -winsdkversion:10.0.1 -libpath:custom-dir \
-# RUN: %t.arm64ec.obj -print-search-paths -machine:arm64ec | FileCheck -DSYSROOT=%t.dir %s
+# RUN: %t.arm64ec.obj -print-search-paths -machine:arm64ec | FileCheck -DSYSROOT=%t.dir %s --check-prefixes=CHECK,ARM64EC
# CHECK: Library search paths:
# CHECK-NEXT: (cwd)
@@ -14,6 +14,8 @@
# CHECK-NEXT: [[CPATH:.*]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}windows
# CHECK-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib
# CHECK-NEXT: [[CPATH]]lib
+# AARCH64-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}aarch64-pc-windows-msvc
+# ARM64EC-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}arm64ec-pc-windows-msvc
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}DIA SDK{{[/\\]}}lib{{[/\\]}}arm64
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}lib{{[/\\]}}arm64
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}atlmfc{{[/\\]}}lib{{[/\\]}}arm64
diff --git a/lld/test/COFF/print-search-paths.s b/lld/test/COFF/print-search-paths.s
index 8c4df16092419..75536c4c60a59 100644
--- a/lld/test/COFF/print-search-paths.s
+++ b/lld/test/COFF/print-search-paths.s
@@ -9,6 +9,7 @@
# CHECK-NEXT: [[CPATH:.*]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}windows
# CHECK-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib
# CHECK-NEXT: [[CPATH]]lib
+# CHECK-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}x86_64-pc-windows-msvc
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}DIA SDK{{[/\\]}}lib{{[/\\]}}amd64
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}lib{{[/\\]}}x64
# CHECK-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}atlmfc{{[/\\]}}lib{{[/\\]}}x64
@@ -19,6 +20,7 @@
# X86-NEXT: [[CPATH:.*]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}windows
# X86-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib
# X86-NEXT: [[CPATH]]lib
+# X86-NEXT: [[CPATH]]lib{{[/\\]}}clang{{[/\\]}}{{[0-9]+}}{{[/\\]}}lib{{[/\\]}}i686-pc-windows-msvc
# X86-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}DIA SDK{{[/\\]}}lib
# X86-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}lib{{[/\\]}}x86
# X86-NEXT: [[SYSROOT]]{{[/\\]}}sysroot{{[/\\]}}VC{{[/\\]}}Tools{{[/\\]}}MSVC{{[/\\]}}1.1.1.1{{[/\\]}}atlmfc{{[/\\]}}lib{{[/\\]}}x86
``````````
</details>
https://github.com/llvm/llvm-project/pull/227744
More information about the llvm-commits
mailing list