[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