[clang] [Driver][RISCV] Fix musl dynamic linker path for RISC-V sf/sp ABI (PR #202513)
Jim Lin via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 9 00:08:52 PDT 2026
https://github.com/tclin914 updated https://github.com/llvm/llvm-project/pull/202513
>From cc14a6989d77943e6eec62d8f08db49b442931ce Mon Sep 17 00:00:00 2001
From: Chih-Mao Chen <cmchen at andestech.com>
Date: Sat, 2 May 2026 18:45:27 +0800
Subject: [PATCH 1/2] [Driver][RISCV] Fix musl dynamic linker path for RISC-V
sf/sp ABI
Musl adds -sf or -sp suffixes to the path of dynamic linker (e.g., ld-musl-riscv64-sf.so.1):
https://git.musl-libc.org/cgit/musl/tree/configure?h=v1.2.6&id=9fa28ece75d8a2191de7c5bb53bed224c5947417#n732
---
clang/lib/Driver/ToolChains/Linux.cpp | 8 ++++++++
clang/test/Driver/linux-ld.c | 24 ++++++++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
index d3c94c8addffa..48f8a4a3f4776 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -607,6 +607,14 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
if (Arch == llvm::Triple::ppc &&
Triple.getSubArch() == llvm::Triple::PPCSubArch_spe)
ArchName = "powerpc-sf";
+ if (Triple.isRISCV()) {
+ StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
+ if (ABIName == "ilp32" || ABIName == "lp64") {
+ ArchName += "-sf";
+ } else if (ABIName == "ilp32f" || ABIName == "lp64f") {
+ ArchName += "-sp";
+ }
+ }
return "/lib/ld-musl-" + ArchName + ".so.1";
}
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
index 8de1988d606cf..b918457d916dc 100644
--- a/clang/test/Driver/linux-ld.c
+++ b/clang/test/Driver/linux-ld.c
@@ -1702,6 +1702,24 @@
// RUN: %clang -### %s -no-pie 2>&1 \
// RUN: --target=aarch64_be-pc-linux-musl \
// RUN: | FileCheck --check-prefix=CHECK-MUSL-AARCH64_BE %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv32-pc-linux-musl -march=rv32im -mabi=ilp32 \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32-SF %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv32-pc-linux-musl -march=rv32imf -mabi=ilp32f \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32-SP %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv32-pc-linux-musl -march=rv32imfd -mabi=ilp32d \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32 %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv64-pc-linux-musl -march=rv64im -mabi=lp64 \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64-SF %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv64-pc-linux-musl -march=rv64imf -mabi=lp64f \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64-SP %s
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN: --target=riscv64-pc-linux-musl -march=rv64imfd -mabi=lp64d \
+// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64 %s
// CHECK-MUSL-X86: "-dynamic-linker" "/lib/ld-musl-i386.so.1"
// CHECK-MUSL-X86_64: "-dynamic-linker" "/lib/ld-musl-x86_64.so.1"
// CHECK-MUSL-MIPS: "-dynamic-linker" "/lib/ld-musl-mips.so.1"
@@ -1717,6 +1735,12 @@
// CHECK-MUSL-ARMEBHF: "-dynamic-linker" "/lib/ld-musl-armebhf.so.1"
// CHECK-MUSL-AARCH64: "-dynamic-linker" "/lib/ld-musl-aarch64.so.1"
// CHECK-MUSL-AARCH64_BE: "-dynamic-linker" "/lib/ld-musl-aarch64_be.so.1"
+// CHECK-MUSL-RISCV32-SF: "-dynamic-linker" "/lib/ld-musl-riscv32-sf.so.1"
+// CHECK-MUSL-RISCV32-SP: "-dynamic-linker" "/lib/ld-musl-riscv32-sp.so.1"
+// CHECK-MUSL-RISCV32: "-dynamic-linker" "/lib/ld-musl-riscv32.so.1"
+// CHECK-MUSL-RISCV64-SF: "-dynamic-linker" "/lib/ld-musl-riscv64-sf.so.1"
+// CHECK-MUSL-RISCV64-SP: "-dynamic-linker" "/lib/ld-musl-riscv64-sp.so.1"
+// CHECK-MUSL-RISCV64: "-dynamic-linker" "/lib/ld-musl-riscv64.so.1"
// Check whether multilib gcc install works fine on Gentoo with gcc-config
// RUN: %clang -### %s -Werror -no-pie 2>&1 \
>From 38a639e27cdf00bf1551448699da776b6df6222d Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Tue, 9 Jun 2026 14:43:54 +0800
Subject: [PATCH 2/2] [Driver][test] Simplify RISC-V musl dynamic linker RUN
lines
Drop the unnecessary -no-pie flag and fold each RUN invocation onto two
lines in the RISC-V musl checks of linux-ld.c.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply at anthropic.com>
---
clang/test/Driver/linux-ld.c | 30 ++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
index b918457d916dc..8380d93dfe974 100644
--- a/clang/test/Driver/linux-ld.c
+++ b/clang/test/Driver/linux-ld.c
@@ -1702,24 +1702,18 @@
// RUN: %clang -### %s -no-pie 2>&1 \
// RUN: --target=aarch64_be-pc-linux-musl \
// RUN: | FileCheck --check-prefix=CHECK-MUSL-AARCH64_BE %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv32-pc-linux-musl -march=rv32im -mabi=ilp32 \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32-SF %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv32-pc-linux-musl -march=rv32imf -mabi=ilp32f \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32-SP %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv32-pc-linux-musl -march=rv32imfd -mabi=ilp32d \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV32 %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv64-pc-linux-musl -march=rv64im -mabi=lp64 \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64-SF %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv64-pc-linux-musl -march=rv64imf -mabi=lp64f \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64-SP %s
-// RUN: %clang -### %s -no-pie 2>&1 \
-// RUN: --target=riscv64-pc-linux-musl -march=rv64imfd -mabi=lp64d \
-// RUN: | FileCheck --check-prefix=CHECK-MUSL-RISCV64 %s
+// RUN: %clang -### %s --target=riscv32-pc-linux-musl -march=rv32im -mabi=ilp32 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV32-SF %s
+// RUN: %clang -### %s --target=riscv32-pc-linux-musl -march=rv32imf -mabi=ilp32f 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV32-SP %s
+// RUN: %clang -### %s --target=riscv32-pc-linux-musl -march=rv32imfd -mabi=ilp32d 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV32 %s
+// RUN: %clang -### %s --target=riscv64-pc-linux-musl -march=rv64im -mabi=lp64 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV64-SF %s
+// RUN: %clang -### %s --target=riscv64-pc-linux-musl -march=rv64imf -mabi=lp64f 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV64-SP %s
+// RUN: %clang -### %s --target=riscv64-pc-linux-musl -march=rv64imfd -mabi=lp64d 2>&1 | \
+// RUN: FileCheck --check-prefix=CHECK-MUSL-RISCV64 %s
// CHECK-MUSL-X86: "-dynamic-linker" "/lib/ld-musl-i386.so.1"
// CHECK-MUSL-X86_64: "-dynamic-linker" "/lib/ld-musl-x86_64.so.1"
// CHECK-MUSL-MIPS: "-dynamic-linker" "/lib/ld-musl-mips.so.1"
More information about the cfe-commits
mailing list