[clang] [Driver][RISCV] Fix and print appropriate compiler-rt path when GCCInstallation is valid (PR #146849)
Garvit Gupta via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 3 03:34:45 PDT 2025
https://github.com/quic-garvgupt created https://github.com/llvm/llvm-project/pull/146849
Baremetal and RISCVToolchain used different paths for clangrt builtins
relative to resource-dir before RISCVToolChain got removed in commit f8cb798
This created a discrepancy in behavior for riscv target when GCCInstallation is
valid. This patch fixes this difference in behavior.
After this fix -
With valid GCCInstallation
<resource-dir>/<llvm-rel-ver>/lib/<target-triple>libclang_rt.builtins.a
Without valid GCCInstallation
<resource-dir>/<llvm-rel-ver>/lib/baremetal/libclang_rt.builtins-<target>.a
>From f46d7cce35748114997de7264291f6dc004d1dc9 Mon Sep 17 00:00:00 2001
From: Garvit Gupta <quic_garvgupt at quicinc.com>
Date: Thu, 3 Jul 2025 02:56:01 -0700
Subject: [PATCH] [Driver][RISCV] Fix and print appropriate compiler-rt path
when GCCInstallation is valid
RISCVToolChain which recently got removed in commit f8cb798, used a
different compiler-rt path relative to resource-dir. However,
this behavior got override when it was merged in BareMetal toolchain.
This patch fixes that.
Without valid GCCInstallation:
<resource-dir>/<llvm-rel-ver>/lib/baremetal/libclang_rt.builtins-<target>.a
With valid GCCInstalltion:
<resource-dir>/<llvm-rel-ver>/lib/<target-triple>libclang_rt.builtins.a
Change-Id: I37670b24019e3d473139ad6df8c3e6b92196fa6d
---
clang/lib/Driver/ToolChains/BareMetal.cpp | 9 +++++++++
clang/lib/Driver/ToolChains/BareMetal.h | 1 +
clang/test/Driver/print-libgcc-file-name-clangrt.c | 9 +++++++++
3 files changed, 19 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 981395deb9dbc..cd4c3104b6deb 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -206,6 +206,15 @@ std::string BareMetal::computeSysRoot() const {
return computeClangRuntimesSysRoot(D, /*IncludeTriple*/ true);
}
+std::string BareMetal::getCompilerRTPath() const {
+ if (IsGCCInstallationValid || detectGCCToolchainAdjacent(getDriver())) {
+ SmallString<128> Path(getDriver().ResourceDir);
+ llvm::sys::path::append(Path, "lib");
+ return std::string(Path.str());
+ }
+ return ToolChain::getCompilerRTPath();
+}
+
static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
const Multilib &Multilib,
StringRef InstallPath,
diff --git a/clang/lib/Driver/ToolChains/BareMetal.h b/clang/lib/Driver/ToolChains/BareMetal.h
index cc57fa21867a2..d3d415b337a0b 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.h
+++ b/clang/lib/Driver/ToolChains/BareMetal.h
@@ -76,6 +76,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const override;
std::string computeSysRoot() const override;
+ std::string getCompilerRTPath() const override;
SanitizerMask getSupportedSanitizers() const override;
SmallVector<std::string>
diff --git a/clang/test/Driver/print-libgcc-file-name-clangrt.c b/clang/test/Driver/print-libgcc-file-name-clangrt.c
index a902eedc85209..e376d469cad6b 100644
--- a/clang/test/Driver/print-libgcc-file-name-clangrt.c
+++ b/clang/test/Driver/print-libgcc-file-name-clangrt.c
@@ -63,3 +63,12 @@
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CLANGRT-ARM-BAREMETAL-PER-TARGET %s
// CHECK-CLANGRT-ARM-BAREMETAL-PER-TARGET: libclang_rt.builtins.a
+
+// RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name \
+// RUN: --target=riscv32-unknown-elf \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN: --gcc-toolchain=%S/Inputs/basic_riscv32_tree 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-RISCV-BAREMETALTOOLCHAIN %s
+// CHECK-RISCV-BAREMETALTOOLCHAIN-NOT: baremetal{{/|\\}}libclang_rt.builtins-riscv32.a
+// CHECK-RISCV-BAREMETALTOOLCHAIN: libclang_rt.builtins.a
More information about the cfe-commits
mailing list