[clang] [clang]: baremetal `multilib.yaml` discovery (PR #227965)

via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 1 01:48:21 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Mythreya Kuricheti (MythreyaK)

<details>
<summary>Changes</summary>

Clang does not auto-detect `multilib.yaml` in the triple dirs correctly because baremetal targets use `SYSROOT` as a fallback dir, unlike the linux `multilib.yaml` discovery, which correctly searches the triple-specific dirs first (`FallbackDir` dir is unset).

`findMultilibsYAML` treats `FallbackDir` and `getStdlibPath()` as mutually-exclusive settings. Because baremetal uses a fallback path `SYSROOT/multilib.yaml`, `getStdlibPath()` is never searched (`SYSROOT/usr/lib/<triple>/multilib.yaml`).

With this change to shared `Toolchain.cpp`, baremetal targets look for a `multilib.yaml` in the triple-specific dirs first, before attempting to locate it in SYSROOT. Attempt triple-specific dirs first if present, `FallbackDir` otherwise.

Follow-up to llvm/llvm-project#<!-- -->183453

---
Full diff: https://github.com/llvm/llvm-project/pull/227965.diff


2 Files Affected:

- (modified) clang/lib/Driver/ToolChain.cpp (+3-3) 
- (added) clang/test/Driver/baremetal-multilib-autodiscovery.yaml (+64) 


``````````diff
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 4b194b5b70534..838dbadb482af 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -202,10 +202,10 @@ ToolChain::findMultilibsYAML(const llvm::opt::ArgList &Args, const Driver &D,
   }
 
   SmallString<128> MultilibPath;
-  if (!FallbackDir.empty())
-    MultilibPath = FallbackDir;
-  else if (std::optional<std::string> StdlibDir = getStdlibPath())
+  if (std::optional<std::string> StdlibDir = getStdlibPath())
     MultilibPath = *StdlibDir;
+  else if (!FallbackDir.empty())
+    MultilibPath = FallbackDir;
   else
     return std::nullopt;
   llvm::sys::path::append(MultilibPath, "multilib.yaml");
diff --git a/clang/test/Driver/baremetal-multilib-autodiscovery.yaml b/clang/test/Driver/baremetal-multilib-autodiscovery.yaml
new file mode 100644
index 0000000000000..5472a3ef215d7
--- /dev/null
+++ b/clang/test/Driver/baremetal-multilib-autodiscovery.yaml
@@ -0,0 +1,64 @@
+# UNSUPPORTED: system-windows
+
+# Test that baremetal toolchain discovers multilib.yaml in per-triple dirs
+# when no sysroot-level multilib.yaml exists. This tests the fallthrough
+# from FallbackDir to getStdlibPath() in findMultilibsYAML.
+
+## Test 1: per-triple autodiscovery (no sysroot-level YAML)
+#
+# getStdlibPath() = D.Dir/../lib/<triple> = %t/a/sysroot/usr/lib/riscv64-unknown-none-elf
+# FallbackDir     = D.SysRoot             = %t/a/sysroot (no multilib.yaml here)
+#
+# RUN: mkdir -p %t/a/sysroot/usr/bin
+# RUN: mkdir -p %t/a/sysroot/usr/lib/riscv64-unknown-none-elf/rv64gc/lib
+# RUN: cp %s %t/a/sysroot/usr/lib/riscv64-unknown-none-elf/multilib.yaml
+# RUN: %clang -no-canonical-prefixes -print-multi-lib 2>&1 \
+# RUN:     --target=riscv64-unknown-none-elf -march=rv64gc \
+# RUN:     --sysroot=%t/a/sysroot \
+# RUN:     -ccc-install-dir %t/a/sysroot/usr/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-FOUND %s
+# CHECK-FOUND: rv64gc/lib;@-target=riscv64-unknown-none-elf at mabi=lp64d at march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0_zca1p0_zcd1p0
+
+# RUN: %clang -no-canonical-prefixes -print-multi-directory 2>&1 \
+# RUN:     --target=riscv64-unknown-none-elf -march=rv64gc \
+# RUN:     --sysroot=%t/a/sysroot \
+# RUN:     -ccc-install-dir %t/a/sysroot/usr/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-DIR %s
+# CHECK-DIR: rv64gc/lib
+
+## Test 2: sysroot-level YAML still works via FallbackDir
+#
+# Place YAML at sysroot root only, no per-triple YAML.
+#
+# RUN: mkdir -p %t/b/sysroot/usr/bin
+# RUN: cp %s %t/b/sysroot/multilib.yaml
+# RUN: %clang -no-canonical-prefixes -print-multi-lib 2>&1 \
+# RUN:     --target=riscv64-unknown-none-elf -march=rv64gc \
+# RUN:     --sysroot=%t/b/sysroot \
+# RUN:     -ccc-install-dir %t/b/sysroot/usr/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-SYSROOT %s
+# CHECK-SYSROOT: rv64gc/lib;@-target=riscv64-unknown-none-elf at mabi=lp64d at march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0_zca1p0_zcd1p0
+
+## Test 3: per-triple takes priority over sysroot-level
+#
+# Both exist: per-triple has real YAML, sysroot root has empty YAML.
+# getStdlibPath() is tried before FallbackDir, so per-triple wins.
+#
+# RUN: mkdir -p %t/c/sysroot/usr/bin
+# RUN: mkdir -p %t/c/sysroot/usr/lib/riscv64-unknown-none-elf/rv64gc/lib
+# RUN: cp %s %t/c/sysroot/usr/lib/riscv64-unknown-none-elf/multilib.yaml
+# RUN: cp %S/Inputs/multilib/empty.yaml %t/c/sysroot/multilib.yaml
+# RUN: %clang -no-canonical-prefixes -print-multi-lib 2>&1 \
+# RUN:     --target=riscv64-unknown-none-elf -march=rv64gc \
+# RUN:     --sysroot=%t/c/sysroot \
+# RUN:     -ccc-install-dir %t/c/sysroot/usr/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-PRIORITY %s
+# CHECK-PRIORITY: rv64gc/lib;@-target=riscv64-unknown-none-elf at mabi=lp64d at march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0_zca1p0_zcd1p0
+
+---
+MultilibVersion: 1.0
+
+Variants:
+- Dir: rv64gc/lib
+  Flags: [--target=riscv64-unknown-none-elf, -mabi=lp64d,
+          -march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0_zca1p0_zcd1p0]

``````````

</details>


https://github.com/llvm/llvm-project/pull/227965


More information about the cfe-commits mailing list