https://github.com/quic-garvgupt updated
https://github.com/llvm/llvm-project/pull/134442
>From 43f577397566b022866c4acbb409b860473649b8 Mon Sep 17 00:00:00 2001
From: Garvit Gupta
Date: Fri, 4 Apr 2025 12:51:19 -0700
Subject: [PATCH] [RISCV][Driver] Add support for `-m` flag to linker job of
Baremetal toolchain.
Change-Id: Ifce8a3a7f1df9c12561d35ca3c923595e3619428
---
clang/include/clang/Driver/CommonArgs.h| 2 +
clang/lib/Driver/ToolChains/BareMetal.cpp | 15 -
clang/lib/Driver/ToolChains/CommonArgs.cpp | 70 ++
clang/lib/Driver/ToolChains/Gnu.cpp| 70 --
clang/test/Driver/aarch64-toolchain.c | 14 ++---
clang/test/Driver/arm-toolchain.c | 14 ++---
clang/test/Driver/baremetal.cpp| 51
7 files changed, 125 insertions(+), 111 deletions(-)
diff --git a/clang/include/clang/Driver/CommonArgs.h
b/clang/include/clang/Driver/CommonArgs.h
index ddb21c1e8a8b8..26aa3ccf84786 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -31,6 +31,8 @@ void AddLinkerInputs(const ToolChain &TC, const InputInfoList
&Inputs,
const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs, const JobAction &JA);
+const char *getLDMOption(const llvm::Triple &T, const llvm::opt::ArgList
&Args);
+
void addLinkerCompressDebugSectionsOption(const ToolChain &TC,
const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 84d9747488060..fd36a5e7f0af0 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -573,8 +573,19 @@ void baremetal::Linker::ConstructJob(Compilation &C, const
JobAction &JA,
CmdArgs.push_back("-Bstatic");
- if (TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
-CmdArgs.push_back("--no-relax");
+ if (const char *LDMOption = getLDMOption(TC.getTriple(), Args)) {
+CmdArgs.push_back("-m");
+CmdArgs.push_back(LDMOption);
+ } else {
+D.Diag(diag::err_target_unknown_triple) << Triple.str();
+return;
+ }
+
+ if (Triple.isRISCV()) {
+CmdArgs.push_back("-X");
+if (Args.hasArg(options::OPT_mno_relax))
+ CmdArgs.push_back("--no-relax");
+ }
if (Triple.isARM() || Triple.isThumb()) {
bool IsBigEndian = arm::isARMBigEndian(Triple, Args);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index d5b2c5c1e199e..b1415ba6523dd 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -527,6 +527,76 @@ void tools::AddLinkerInputs(const ToolChain &TC, const
InputInfoList &Inputs,
}
}
+const char *tools::getLDMOption(const llvm::Triple &T, const ArgList &Args) {
+ switch (T.getArch()) {
+ case llvm::Triple::x86:
+if (T.isOSIAMCU())
+ return "elf_iamcu";
+return "elf_i386";
+ case llvm::Triple::aarch64:
+return "aarch64linux";
+ case llvm::Triple::aarch64_be:
+return "aarch64linuxb";
+ case llvm::Triple::arm:
+ case llvm::Triple::thumb:
+ case llvm::Triple::armeb:
+ case llvm::Triple::thumbeb:
+return tools::arm::isARMBigEndian(T, Args) ? "armelfb_linux_eabi"
+ : "armelf_linux_eabi";
+ case llvm::Triple::m68k:
+return "m68kelf";
+ case llvm::Triple::ppc:
+if (T.isOSLinux())
+ return "elf32ppclinux";
+return "elf32ppc";
+ case llvm::Triple::ppcle:
+if (T.isOSLinux())
+ return "elf32lppclinux";
+return "elf32lppc";
+ case llvm::Triple::ppc64:
+return "elf64ppc";
+ case llvm::Triple::ppc64le:
+return "elf64lppc";
+ case llvm::Triple::riscv32:
+return "elf32lriscv";
+ case llvm::Triple::riscv64:
+return "elf64lriscv";
+ case llvm::Triple::sparc:
+ case llvm::Triple::sparcel:
+return "elf32_sparc";
+ case llvm::Triple::sparcv9:
+return "elf64_sparc";
+ case llvm::Triple::loongarch32:
+return "elf32loongarch";
+ case llvm::Triple::loongarch64:
+return "elf64loongarch";
+ case llvm::Triple::mips:
+return "elf32btsmip";
+ case llvm::Triple::mipsel:
+return "elf32ltsmip";
+ case llvm::Triple::mips64:
+if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
+ return "elf32btsmipn32";
+return "elf64btsmip";
+ case llvm::Triple::mips64el:
+if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
+ return "elf32ltsmipn32";
+return "elf64ltsmip";
+ case llvm::Triple::systemz:
+return "elf64_s390";
+ case llvm::Triple::x86_64:
+if (T.isX32())
+ return "elf32_x86_64";
+return "elf_x86_64";
+ case llvm::Triple::ve:
+return "elf64ve";
+ case llvm::Triple::csky:
+return "cskyelf_linux";
+ default:
+re