https://github.com/djtodoro updated 
https://github.com/llvm/llvm-project/pull/165599

>From 74d5881f30fba894539a08039a974d94c4b79c77 Mon Sep 17 00:00:00 2001
From: Djordje Todorovic <[email protected]>
Date: Mon, 9 Jun 2025 14:39:10 +0200
Subject: [PATCH 1/3] [clang][RISCV] Add big-endian RISC-V target support

Several things addressed:
  - Define riscv32be/riscv64be target triples
  - Set correct data layout for BE targets
  - Handle BE-specific ABI details
  - Emit warning for BE case since it is still experimental
---
 clang/include/clang/Basic/Attr.td             |  2 +-
 .../clang/Basic/DiagnosticDriverKinds.td      |  2 +
 clang/include/clang/Basic/ObjCRuntime.h       |  1 +
 clang/lib/Basic/Targets.cpp                   |  2 +
 clang/lib/Basic/Targets/OSTargets.h           |  4 ++
 clang/lib/CodeGen/CGBuiltin.cpp               |  2 +
 clang/lib/CodeGen/CodeGenFunction.cpp         |  2 +
 clang/lib/CodeGen/CodeGenModule.cpp           |  4 +-
 clang/lib/Driver/Driver.cpp                   | 26 ++++++++++--
 clang/lib/Driver/ToolChain.cpp                |  2 +
 clang/lib/Driver/ToolChains/BareMetal.cpp     |  3 +-
 clang/lib/Driver/ToolChains/Clang.cpp         |  9 ++++-
 clang/lib/Driver/ToolChains/CommonArgs.cpp    | 10 +++++
 clang/lib/Driver/ToolChains/FreeBSD.cpp       |  8 ++++
 clang/lib/Driver/ToolChains/Gnu.cpp           | 40 ++++++++++++++++---
 clang/lib/Driver/ToolChains/Linux.cpp         | 18 ++++++++-
 clang/lib/Sema/SemaChecking.cpp               |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp               |  2 +
 clang/test/CodeGen/riscv-be-data-layout.c     | 12 ++++++
 clang/test/Driver/riscv-be.c                  | 10 +++++
 clang/test/Misc/warning-flags.c               |  3 +-
 21 files changed, 148 insertions(+), 16 deletions(-)
 create mode 100644 clang/test/CodeGen/riscv-be-data-layout.c
 create mode 100644 clang/test/Driver/riscv-be.c

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index f85d2da21eab9..bd4a655532bb1 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -476,7 +476,7 @@ def TargetMips32 : TargetArch<["mips", "mipsel"]>;
 def TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>;
 def TargetMSP430 : TargetArch<["msp430"]>;
 def TargetM68k : TargetArch<["m68k"]>;
-def TargetRISCV : TargetArch<["riscv32", "riscv64"]>;
+def TargetRISCV : TargetArch<["riscv32", "riscv64", "riscv32be", "riscv64be"]>;
 def TargetX86 : TargetArch<["x86"]>;
 def TargetX86_64 : TargetArch<["x86_64"]>;
 def TargetAnyX86 : TargetArch<["x86", "x86_64"]>;
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 5cae8fb86347f..82d569ffbbd9a 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -443,6 +443,8 @@ def warn_ignored_clang_option : Warning<"the flag '%0' has 
been deprecated and w
 def warn_drv_unsupported_opt_for_target : Warning<
   "optimization flag '%0' is not supported for target '%1'">,
   InGroup<IgnoredOptimizationArgument>;
+def warn_drv_riscv_be_experimental : Warning<
+  "big-endian RISC-V target support is experimental">;
 def warn_drv_unsupported_debug_info_opt_for_target : Warning<
   "debug information option '%0' is not supported for target '%1'">,
   InGroup<UnsupportedTargetOpt>;
diff --git a/clang/include/clang/Basic/ObjCRuntime.h 
b/clang/include/clang/Basic/ObjCRuntime.h
index df42b43898611..efb7c6692bfcf 100644
--- a/clang/include/clang/Basic/ObjCRuntime.h
+++ b/clang/include/clang/Basic/ObjCRuntime.h
@@ -110,6 +110,7 @@ class ObjCRuntime {
       case llvm::Triple::mips64:
         return !(getVersion() >= VersionTuple(1, 9));
       case llvm::Triple::riscv64:
+      case llvm::Triple::riscv64be:
         return !(getVersion() >= VersionTuple(2, 2));
       default:
         return true;
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 38eb1edd4bfb7..093f4559e67cd 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -432,6 +432,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const 
llvm::Triple &Triple,
     return std::make_unique<AMDGPUTargetInfo>(Triple, Opts);
 
   case llvm::Triple::riscv32:
+  case llvm::Triple::riscv32be:
     switch (os) {
     case llvm::Triple::NetBSD:
       return std::make_unique<NetBSDTargetInfo<RISCV32TargetInfo>>(Triple,
@@ -443,6 +444,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const 
llvm::Triple &Triple,
     }
 
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv64be:
     switch (os) {
     case llvm::Triple::FreeBSD:
       return std::make_unique<FreeBSDTargetInfo<RISCV64TargetInfo>>(Triple,
diff --git a/clang/lib/Basic/Targets/OSTargets.h 
b/clang/lib/Basic/Targets/OSTargets.h
index 34e6b2a465092..a4e221971e988 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -255,6 +255,8 @@ class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public 
OSTargetInfo<Target> {
       break;
     case llvm::Triple::loongarch64:
     case llvm::Triple::riscv64:
+    case llvm::Triple::riscv32be:
+    case llvm::Triple::riscv64be:
       break;
     }
   }
@@ -519,6 +521,8 @@ class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public 
OSTargetInfo<Target> {
       break;
     case llvm::Triple::loongarch64:
     case llvm::Triple::riscv64:
+    case llvm::Triple::riscv32be:
+    case llvm::Triple::riscv64be:
       break;
     }
   }
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index d3abf6d2a1f2d..c65aa2ea57219 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -121,6 +121,8 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction 
*CGF,
     return CGF->EmitHexagonBuiltinExpr(BuiltinID, E);
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue);
   case llvm::Triple::spirv32:
   case llvm::Triple::spirv64:
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp 
b/clang/lib/CodeGen/CodeGenFunction.cpp
index ac25bd95f0463..d88eb12571aa5 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -3006,6 +3006,8 @@ void CodeGenFunction::EmitMultiVersionResolver(
     return;
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     EmitRISCVMultiVersionResolver(Resolver, Options);
     return;
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 51954de3bc949..47abc58c20ab6 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -223,7 +223,9 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
     return createMSP430TargetCodeGenInfo(CGM);
 
   case llvm::Triple::riscv32:
-  case llvm::Triple::riscv64: {
+  case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be: {
     StringRef ABIStr = Target.getABI();
     unsigned XLen = Target.getPointerWidth(LangAS::Default);
     unsigned ABIFLen = 0;
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 6a2ee1794b7d7..7676dc8120050 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -801,14 +801,30 @@ static llvm::Triple computeTargetTriple(const Driver &D,
           ArchName, /*EnableExperimentalExtensions=*/true);
       if (!llvm::errorToBool(ISAInfo.takeError())) {
         unsigned XLen = (*ISAInfo)->getXLen();
-        if (XLen == 32)
-          Target.setArch(llvm::Triple::riscv32);
-        else if (XLen == 64)
-          Target.setArch(llvm::Triple::riscv64);
+        if (XLen == 32) {
+          if (Target.isLittleEndian())
+            Target.setArch(llvm::Triple::riscv32);
+          else
+            Target.setArch(llvm::Triple::riscv32be);
+        } else if (XLen == 64) {
+          if (Target.isLittleEndian())
+            Target.setArch(llvm::Triple::riscv64);
+          else
+            Target.setArch(llvm::Triple::riscv64be);
+        }
       }
     }
   }
 
+  if (Target.getArch() == llvm::Triple::riscv32be ||
+      Target.getArch() == llvm::Triple::riscv64be) {
+    static bool WarnedRISCVBE = false;
+    if (!WarnedRISCVBE) {
+      D.Diag(diag::warn_drv_riscv_be_experimental);
+      WarnedRISCVBE = true;
+    }
+  }
+
   return Target;
 }
 
@@ -6972,6 +6988,8 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
         break;
       case llvm::Triple::riscv32:
       case llvm::Triple::riscv64:
+      case llvm::Triple::riscv32be:
+      case llvm::Triple::riscv64be:
         TC = std::make_unique<toolchains::BareMetal>(*this, Target, Args);
         break;
       case llvm::Triple::ve:
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 77a2c73f0d446..0eee7f917d2b8 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -370,6 +370,8 @@ ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) 
const {
     break;
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     getRISCVMultilibFlags(D, Triple, Args, Result);
     break;
   default:
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 6574651b72a3e..d34e1bcb362c9 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -733,7 +733,8 @@ SanitizerMask BareMetal::getSupportedSanitizers() const {
   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
                          getTriple().getArch() == llvm::Triple::aarch64_be;
-  const bool IsRISCV64 = getTriple().getArch() == llvm::Triple::riscv64;
+  const bool IsRISCV64 = getTriple().getArch() == llvm::Triple::riscv64 ||
+                         getTriple().getArch() == llvm::Triple::riscv64be;
   SanitizerMask Res = ToolChain::getSupportedSanitizers();
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::KernelAddress;
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 310f3b58a211e..925fc924c0ef5 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1196,6 +1196,8 @@ static bool isSignedCharDefault(const llvm::Triple 
&Triple) {
   case llvm::Triple::ppc64le:
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
   case llvm::Triple::systemz:
   case llvm::Triple::xcore:
   case llvm::Triple::xtensa:
@@ -1542,6 +1544,8 @@ void Clang::RenderTargetOptions(const llvm::Triple 
&EffectiveTriple,
 
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     AddRISCVTargetArgs(Args, CmdArgs);
     break;
 
@@ -5613,7 +5617,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
     } else if (Name == "SLEEF" || Name == "ArmPL") {
       if (Triple.getArch() != llvm::Triple::aarch64 &&
           Triple.getArch() != llvm::Triple::aarch64_be &&
-          Triple.getArch() != llvm::Triple::riscv64)
+          Triple.getArch() != llvm::Triple::riscv64 &&
+          Triple.getArch() != llvm::Triple::riscv64be)
         D.Diag(diag::err_drv_unsupported_opt_for_target)
             << Name << Triple.getArchName();
     }
@@ -8748,6 +8753,8 @@ void ClangAs::ConstructJob(Compilation &C, const 
JobAction &JA,
 
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     AddRISCVTargetArgs(Args, CmdArgs);
     break;
 
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 882283a99d4f1..8a944d6923cec 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -90,6 +90,8 @@ static bool useFramePointerForTargetByDefault(const 
llvm::opt::ArgList &Args,
   case llvm::Triple::ppc64le:
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
   case llvm::Triple::sparcv9:
@@ -608,6 +610,10 @@ const char *tools::getLDMOption(const llvm::Triple &T, 
const ArgList &Args) {
     return "elf32lriscv";
   case llvm::Triple::riscv64:
     return "elf64lriscv";
+  case llvm::Triple::riscv32be:
+    return "elf32briscv";
+  case llvm::Triple::riscv64be:
+    return "elf64briscv";
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
     return "elf32_sparc";
@@ -785,6 +791,8 @@ std::string tools::getCPUName(const Driver &D, const 
ArgList &Args,
       return "ck810";
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     return riscv::getRISCVTargetCPU(Args, T);
 
   case llvm::Triple::bpfel:
@@ -866,6 +874,8 @@ void tools::getTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
     break;
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     riscv::getRISCVTargetFeatures(D, Triple, Args, Features);
     break;
   case llvm::Triple::systemz:
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp 
b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index 70e66a2f5c3e7..cf6ad385d949a 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -212,6 +212,14 @@ void freebsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
     CmdArgs.push_back("-m");
     CmdArgs.push_back("elf64lriscv");
     break;
+  case llvm::Triple::riscv32be:
+    CmdArgs.push_back("-m");
+    CmdArgs.push_back("elf32briscv");
+    break;
+  case llvm::Triple::riscv64be:
+    CmdArgs.push_back("-m");
+    CmdArgs.push_back("elf64briscv");
+    break;
   case llvm::Triple::loongarch64:
     CmdArgs.push_back("-m");
     CmdArgs.push_back("elf64loongarch");
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index 1bfcd1f4f3a7c..91a4fa0808c3f 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -672,7 +672,9 @@ void tools::gnutools::Assembler::ConstructJob(Compilation 
&C,
     break;
   }
   case llvm::Triple::riscv32:
-  case llvm::Triple::riscv64: {
+  case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be: {
     StringRef ABIName = riscv::getRISCVABI(Args, getToolChain().getTriple());
     CmdArgs.push_back("-mabi");
     CmdArgs.push_back(ABIName.data());
@@ -1732,16 +1734,20 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
             .flag(Twine("-march=", Element.march).str())
             .flag(Twine("-mabi=", Element.mabi).str()));
   }
+
+  std::string EndiannessSuffix = TargetTriple.isLittleEndian() ? "" : "be";
   MultilibSet RISCVMultilibs =
       MultilibSetBuilder()
           .Either(Ms)
           .makeMultilibSet()
           .FilterOut(NonExistent)
-          .setFilePathsCallback([](const Multilib &M) {
+          .setFilePathsCallback([EndiannessSuffix](const Multilib &M) {
             return std::vector<std::string>(
                 {M.gccSuffix(),
-                 "/../../../../riscv64-unknown-elf/lib" + M.gccSuffix(),
-                 "/../../../../riscv32-unknown-elf/lib" + M.gccSuffix()});
+                 "/../../../../riscv64" + EndiannessSuffix +
+                     "-unknown-elf/lib" + M.gccSuffix(),
+                 "/../../../../riscv32" + EndiannessSuffix +
+                     "-unknown-elf/lib" + M.gccSuffix()});
           });
 
   Multilib::flags_list Flags;
@@ -1789,7 +1795,8 @@ static void findRISCVMultilibs(const Driver &D,
           .FilterOut(NonExistent);
 
   Multilib::flags_list Flags;
-  bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
+  bool IsRV64 = (TargetTriple.getArch() == llvm::Triple::riscv64 ||
+                 TargetTriple.getArch() == llvm::Triple::riscv64be);
   StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
 
   addMultilibFlag(!IsRV64, "-m32", Flags);
@@ -2429,6 +2436,15 @@ void 
Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
   static const char *const RISCV64Triples[] = {"riscv64-unknown-linux-gnu",
                                                "riscv64-unknown-elf"};
 
+  static const char *const RISCV32beLibDirs[] = {"/lib32", "/lib"};
+  static const char *const RISCV32beTriples[] = {"riscv32be-unknown-linux-gnu",
+                                                 "riscv32be-linux-gnu",
+                                                 "riscv32be-unknown-elf"};
+  static const char *const RISCV64beLibDirs[] = {"/lib64", "/lib"};
+  static const char *const RISCV64beTriples[] = {"riscv64be-unknown-linux-gnu",
+                                                 "riscv64be-linux-gnu",
+                                                 "riscv64be-unknown-elf"};
+
   static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
   static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
                                                "sparcv8-linux-gnu"};
@@ -2721,6 +2737,18 @@ void 
Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
     BiarchLibDirs.append(begin(RISCV32LibDirs), end(RISCV32LibDirs));
     BiarchTripleAliases.append(begin(RISCV32Triples), end(RISCV32Triples));
     break;
+  case llvm::Triple::riscv32be:
+    LibDirs.append(begin(RISCV32beLibDirs), end(RISCV32beLibDirs));
+    TripleAliases.append(begin(RISCV32beTriples), end(RISCV32beTriples));
+    BiarchLibDirs.append(begin(RISCV64beLibDirs), end(RISCV64beLibDirs));
+    BiarchTripleAliases.append(begin(RISCV64beTriples), end(RISCV64beTriples));
+    break;
+  case llvm::Triple::riscv64be:
+    LibDirs.append(begin(RISCV64beLibDirs), end(RISCV64beLibDirs));
+    TripleAliases.append(begin(RISCV64beTriples), end(RISCV64beTriples));
+    BiarchLibDirs.append(begin(RISCV32beLibDirs), end(RISCV32beLibDirs));
+    BiarchTripleAliases.append(begin(RISCV32beTriples), end(RISCV32beTriples));
+    break;
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
     LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
@@ -3036,6 +3064,8 @@ Generic_GCC::getDefaultUnwindTableLevel(const ArgList 
&Args) const {
   case llvm::Triple::ppc64le:
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
   case llvm::Triple::x86:
   case llvm::Triple::x86_64:
     return UnwindTableLevel::Asynchronous;
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index cdbf21fb90263..9f8edbf583d6b 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -203,7 +203,8 @@ static StringRef getOSLibDir(const llvm::Triple &Triple, 
const ArgList &Args) {
   if (Triple.getArch() == llvm::Triple::x86_64 && Triple.isX32())
     return "libx32";
 
-  if (Triple.getArch() == llvm::Triple::riscv32)
+  if (Triple.getArch() == llvm::Triple::riscv32 ||
+      Triple.getArch() == llvm::Triple::riscv32be)
     return "lib32";
 
   return Triple.isArch32Bit() ? "lib" : "lib64";
@@ -686,6 +687,18 @@ std::string Linux::getDynamicLinker(const ArgList &Args) 
const {
     Loader = ("ld-linux-" + ArchName + "-" + ABIName + ".so.1").str();
     break;
   }
+  case llvm::Triple::riscv32be: {
+    StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
+    LibDir = "lib";
+    Loader = ("ld-linux-riscv32be-" + ABIName + ".so.1").str();
+    break;
+  }
+  case llvm::Triple::riscv64be: {
+    StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
+    LibDir = "lib";
+    Loader = ("ld-linux-riscv64be-" + ABIName + ".so.1").str();
+    break;
+  }
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
     LibDir = "lib";
@@ -900,7 +913,8 @@ SanitizerMask Linux::getSupportedSanitizers() const {
                          getTriple().getArch() == llvm::Triple::armeb ||
                          getTriple().getArch() == llvm::Triple::thumbeb;
   const bool IsLoongArch64 = getTriple().getArch() == 
llvm::Triple::loongarch64;
-  const bool IsRISCV64 = getTriple().getArch() == llvm::Triple::riscv64;
+  const bool IsRISCV64 = (getTriple().getArch() == llvm::Triple::riscv64 ||
+                          getTriple().getArch() == llvm::Triple::riscv64be);
   const bool IsSystemZ = getTriple().getArch() == llvm::Triple::systemz;
   const bool IsHexagon = getTriple().getArch() == llvm::Triple::hexagon;
   const bool IsAndroid = getTriple().isAndroid();
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 2ba5dc37eb8a4..ce57683c86828 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2117,6 +2117,8 @@ bool Sema::CheckTSBuiltinFunctionCall(const TargetInfo 
&TI, unsigned BuiltinID,
     return AMDGPU().CheckAMDGCNBuiltinFunctionCall(BuiltinID, TheCall);
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     return RISCV().CheckBuiltinFunctionCall(TI, BuiltinID, TheCall);
   case llvm::Triple::loongarch32:
   case llvm::Triple::loongarch64:
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 1679573d34d1f..42af15d1538d0 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -6279,6 +6279,8 @@ static void handleInterruptAttr(Sema &S, Decl *D, const 
ParsedAttr &AL) {
     break;
   case llvm::Triple::riscv32:
   case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be:
     S.RISCV().handleInterruptAttr(D, AL);
     break;
   default:
diff --git a/clang/test/CodeGen/riscv-be-data-layout.c 
b/clang/test/CodeGen/riscv-be-data-layout.c
new file mode 100644
index 0000000000000..9f88464da7587
--- /dev/null
+++ b/clang/test/CodeGen/riscv-be-data-layout.c
@@ -0,0 +1,12 @@
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64be-unknown-elf -emit-llvm %s -o - \
+// RUN:   | FileCheck %s --check-prefix=RV64
+// RUN: %clang_cc1 -triple riscv32be-unknown-elf -emit-llvm %s -o - \
+// RUN:   | FileCheck %s --check-prefix=RV32
+
+// RV64: target datalayout = "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
+// RV32: target datalayout = "E-m:e-p:32:32-i64:64-n32-S128"
+
+int foo(void) {
+  return 0;
+}
diff --git a/clang/test/Driver/riscv-be.c b/clang/test/Driver/riscv-be.c
new file mode 100644
index 0000000000000..9a5deaa5b9157
--- /dev/null
+++ b/clang/test/Driver/riscv-be.c
@@ -0,0 +1,10 @@
+// REQUIRES: riscv-registered-target
+// RUN: %clang -target riscv64be-unknown-elf -### %s 2>&1 \
+// RUN:   | FileCheck %s
+
+// CHECK: warning: big-endian RISC-V target support is experimental
+// CHECK: "-triple" "riscv64be-unknown-unknown-elf"
+
+int foo(void) {
+  return 0;
+}
diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c
index 3dc4bb55aa69c..bb7b1c7ea67f5 100644
--- a/clang/test/Misc/warning-flags.c
+++ b/clang/test/Misc/warning-flags.c
@@ -18,7 +18,7 @@ This test serves two purposes:
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (56):
+CHECK: Warnings without flags (57):
 
 CHECK-NEXT:   ext_expected_semi_decl_list
 CHECK-NEXT:   ext_missing_whitespace_after_macro_name
@@ -43,6 +43,7 @@ CHECK-NEXT:   warn_double_const_requires_fp64
 CHECK-NEXT:   warn_drv_assuming_mfloat_abi_is
 CHECK-NEXT:   warn_drv_clang_unsupported
 CHECK-NEXT:   warn_drv_pch_not_first_include
+CHECK-NEXT:   warn_drv_riscv_be_experimental
 CHECK-NEXT:   warn_expected_qualified_after_typename
 CHECK-NEXT:   warn_fe_backend_unsupported
 CHECK-NEXT:   warn_fe_cc_log_diagnostics_failure

>From 2cdd7062f6200523ce9f23c0add6a0216c75f83c Mon Sep 17 00:00:00 2001
From: Djordje Todorovic <[email protected]>
Date: Fri, 31 Oct 2025 15:28:58 +0100
Subject: [PATCH 2/3] Address comments

---
 clang/include/clang/Basic/DiagnosticDriverKinds.td | 3 ++-
 clang/include/clang/Basic/DiagnosticGroups.td      | 1 +
 clang/lib/Basic/Targets/OSTargets.h                | 2 --
 clang/lib/Driver/ToolChains/Gnu.cpp                | 9 ++++-----
 clang/test/Driver/riscv-be.c                       | 4 ++++
 clang/test/Misc/warning-flags.c                    | 3 +--
 6 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 82d569ffbbd9a..12681b39cba3f 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -444,7 +444,8 @@ def warn_drv_unsupported_opt_for_target : Warning<
   "optimization flag '%0' is not supported for target '%1'">,
   InGroup<IgnoredOptimizationArgument>;
 def warn_drv_riscv_be_experimental : Warning<
-  "big-endian RISC-V target support is experimental">;
+  "big-endian RISC-V target support is experimental">,
+  InGroup<RISCVBEExperimental>;
 def warn_drv_unsupported_debug_info_opt_for_target : Warning<
   "debug information option '%0' is not supported for target '%1'">,
   InGroup<UnsupportedTargetOpt>;
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index 2f3c32e841145..c5979ce6becf5 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -148,6 +148,7 @@ def UnsupportedFPOpt : 
DiagGroup<"unsupported-floating-point-opt">;
 def UnsupportedCB : DiagGroup<"unsupported-cb">;
 def UnsupportedGPOpt : DiagGroup<"unsupported-gpopt">;
 def UnsupportedTargetOpt : DiagGroup<"unsupported-target-opt">;
+def RISCVBEExperimental : DiagGroup<"riscv-be-experimental">;
 def NonLiteralNullConversion : DiagGroup<"non-literal-null-conversion">;
 def NullConversion : DiagGroup<"null-conversion">;
 def ImplicitConversionFloatingPointToBool :
diff --git a/clang/lib/Basic/Targets/OSTargets.h 
b/clang/lib/Basic/Targets/OSTargets.h
index a4e221971e988..a975926e29cfd 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -255,7 +255,6 @@ class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public 
OSTargetInfo<Target> {
       break;
     case llvm::Triple::loongarch64:
     case llvm::Triple::riscv64:
-    case llvm::Triple::riscv32be:
     case llvm::Triple::riscv64be:
       break;
     }
@@ -521,7 +520,6 @@ class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public 
OSTargetInfo<Target> {
       break;
     case llvm::Triple::loongarch64:
     case llvm::Triple::riscv64:
-    case llvm::Triple::riscv32be:
     case llvm::Triple::riscv64be:
       break;
     }
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index 91a4fa0808c3f..b59500d058bca 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -1735,7 +1735,7 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
             .flag(Twine("-mabi=", Element.mabi).str()));
   }
 
-  std::string EndiannessSuffix = TargetTriple.isLittleEndian() ? "" : "be";
+  StringRef EndiannessSuffix = TargetTriple.isLittleEndian() ? "" : "be";
   MultilibSet RISCVMultilibs =
       MultilibSetBuilder()
           .Either(Ms)
@@ -1744,9 +1744,9 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
           .setFilePathsCallback([EndiannessSuffix](const Multilib &M) {
             return std::vector<std::string>(
                 {M.gccSuffix(),
-                 "/../../../../riscv64" + EndiannessSuffix +
+                 "/../../../../riscv64" + EndiannessSuffix.str() +
                      "-unknown-elf/lib" + M.gccSuffix(),
-                 "/../../../../riscv32" + EndiannessSuffix +
+                 "/../../../../riscv32" + EndiannessSuffix.str() +
                      "-unknown-elf/lib" + M.gccSuffix()});
           });
 
@@ -1795,8 +1795,7 @@ static void findRISCVMultilibs(const Driver &D,
           .FilterOut(NonExistent);
 
   Multilib::flags_list Flags;
-  bool IsRV64 = (TargetTriple.getArch() == llvm::Triple::riscv64 ||
-                 TargetTriple.getArch() == llvm::Triple::riscv64be);
+  bool IsRV64 = TargetTriple.isRISCV64();
   StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
 
   addMultilibFlag(!IsRV64, "-m32", Flags);
diff --git a/clang/test/Driver/riscv-be.c b/clang/test/Driver/riscv-be.c
index 9a5deaa5b9157..a343cb4e09d7f 100644
--- a/clang/test/Driver/riscv-be.c
+++ b/clang/test/Driver/riscv-be.c
@@ -1,9 +1,13 @@
 // REQUIRES: riscv-registered-target
 // RUN: %clang -target riscv64be-unknown-elf -### %s 2>&1 \
 // RUN:   | FileCheck %s
+// RUN: %clang -target riscv64be-unknown-elf -Wno-riscv-be-experimental -### 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=NOWARN
 
 // CHECK: warning: big-endian RISC-V target support is experimental
 // CHECK: "-triple" "riscv64be-unknown-unknown-elf"
+// NOWARN-NOT: warning: big-endian RISC-V target support is experimental
+// NOWARN: "-triple" "riscv64be-unknown-unknown-elf"
 
 int foo(void) {
   return 0;
diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c
index bb7b1c7ea67f5..3dc4bb55aa69c 100644
--- a/clang/test/Misc/warning-flags.c
+++ b/clang/test/Misc/warning-flags.c
@@ -18,7 +18,7 @@ This test serves two purposes:
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (57):
+CHECK: Warnings without flags (56):
 
 CHECK-NEXT:   ext_expected_semi_decl_list
 CHECK-NEXT:   ext_missing_whitespace_after_macro_name
@@ -43,7 +43,6 @@ CHECK-NEXT:   warn_double_const_requires_fp64
 CHECK-NEXT:   warn_drv_assuming_mfloat_abi_is
 CHECK-NEXT:   warn_drv_clang_unsupported
 CHECK-NEXT:   warn_drv_pch_not_first_include
-CHECK-NEXT:   warn_drv_riscv_be_experimental
 CHECK-NEXT:   warn_expected_qualified_after_typename
 CHECK-NEXT:   warn_fe_backend_unsupported
 CHECK-NEXT:   warn_fe_cc_log_diagnostics_failure

>From dd8f2aee44f4f36f3fe9460078ef2cadf3769a0b Mon Sep 17 00:00:00 2001
From: Djordje Todorovic <[email protected]>
Date: Mon, 22 Dec 2025 12:15:01 +0100
Subject: [PATCH 3/3] Add tests be sdk and address latest comments

---
 clang/lib/Driver/ToolChains/BareMetal.cpp     |  3 +-
 clang/lib/Driver/ToolChains/Clang.cpp         |  4 +-
 clang/lib/Driver/ToolChains/Linux.cpp         | 22 ++---
 .../7.2.0/crtbegin.o                          |  0
 .../7.2.0/lib32/ilp32/crtbegin.o              |  0
 .../7.2.0/lib32/ilp32d/crtbegin.o             |  0
 .../7.2.0/lib64/lp64/crtbegin.o               |  0
 .../7.2.0/lib64/lp64d/crtbegin.o              |  0
 .../riscv64be-unknown-linux-gnu/bin/ld        |  1 +
 .../sysroot/lib/.keep                         |  0
 .../sysroot/lib32/ilp32/.keep                 |  0
 .../sysroot/lib32/ilp32d/.keep                |  0
 .../sysroot/lib64/lp64/.keep                  |  0
 .../sysroot/lib64/lp64d/.keep                 |  0
 .../sysroot/usr/lib32/ilp32/.keep             |  0
 .../sysroot/usr/lib32/ilp32d/.keep            |  0
 .../sysroot/usr/lib64/lp64/.keep              |  0
 .../sysroot/usr/lib64/lp64d/.keep             |  0
 clang/test/Driver/riscv-be.c                  | 80 +++++++++++++++++++
 19 files changed, 88 insertions(+), 22 deletions(-)
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/crtbegin.o
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32/crtbegin.o
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32d/crtbegin.o
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64/crtbegin.o
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64d/crtbegin.o
 create mode 100755 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/riscv64be-unknown-linux-gnu/bin/ld
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32d/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64d/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32d/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64d/.keep

diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index d34e1bcb362c9..0602a8a19f943 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -733,8 +733,7 @@ SanitizerMask BareMetal::getSupportedSanitizers() const {
   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
                          getTriple().getArch() == llvm::Triple::aarch64_be;
-  const bool IsRISCV64 = getTriple().getArch() == llvm::Triple::riscv64 ||
-                         getTriple().getArch() == llvm::Triple::riscv64be;
+  const bool IsRISCV64 = getTriple().isRISCV64();
   SanitizerMask Res = ToolChain::getSupportedSanitizers();
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::KernelAddress;
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 925fc924c0ef5..199e6f0c982dd 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5616,9 +5616,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
             << Name << Triple.getArchName();
     } else if (Name == "SLEEF" || Name == "ArmPL") {
       if (Triple.getArch() != llvm::Triple::aarch64 &&
-          Triple.getArch() != llvm::Triple::aarch64_be &&
-          Triple.getArch() != llvm::Triple::riscv64 &&
-          Triple.getArch() != llvm::Triple::riscv64be)
+          Triple.getArch() != llvm::Triple::aarch64_be && !Triple.isRISCV64())
         D.Diag(diag::err_drv_unsupported_opt_for_target)
             << Name << Triple.getArchName();
     }
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 9f8edbf583d6b..86833e058a819 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -203,8 +203,7 @@ static StringRef getOSLibDir(const llvm::Triple &Triple, 
const ArgList &Args) {
   if (Triple.getArch() == llvm::Triple::x86_64 && Triple.isX32())
     return "libx32";
 
-  if (Triple.getArch() == llvm::Triple::riscv32 ||
-      Triple.getArch() == llvm::Triple::riscv32be)
+  if (Triple.isRISCV32())
     return "lib32";
 
   return Triple.isArch32Bit() ? "lib" : "lib64";
@@ -680,25 +679,15 @@ std::string Linux::getDynamicLinker(const ArgList &Args) 
const {
         (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
     break;
   case llvm::Triple::riscv32:
-  case llvm::Triple::riscv64: {
+  case llvm::Triple::riscv64:
+  case llvm::Triple::riscv32be:
+  case llvm::Triple::riscv64be: {
     StringRef ArchName = llvm::Triple::getArchTypeName(Arch);
     StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
     LibDir = "lib";
     Loader = ("ld-linux-" + ArchName + "-" + ABIName + ".so.1").str();
     break;
   }
-  case llvm::Triple::riscv32be: {
-    StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
-    LibDir = "lib";
-    Loader = ("ld-linux-riscv32be-" + ABIName + ".so.1").str();
-    break;
-  }
-  case llvm::Triple::riscv64be: {
-    StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
-    LibDir = "lib";
-    Loader = ("ld-linux-riscv64be-" + ABIName + ".so.1").str();
-    break;
-  }
   case llvm::Triple::sparc:
   case llvm::Triple::sparcel:
     LibDir = "lib";
@@ -913,8 +902,7 @@ SanitizerMask Linux::getSupportedSanitizers() const {
                          getTriple().getArch() == llvm::Triple::armeb ||
                          getTriple().getArch() == llvm::Triple::thumbeb;
   const bool IsLoongArch64 = getTriple().getArch() == 
llvm::Triple::loongarch64;
-  const bool IsRISCV64 = (getTriple().getArch() == llvm::Triple::riscv64 ||
-                          getTriple().getArch() == llvm::Triple::riscv64be);
+  const bool IsRISCV64 = getTriple().isRISCV64();
   const bool IsSystemZ = getTriple().getArch() == llvm::Triple::systemz;
   const bool IsHexagon = getTriple().getArch() == llvm::Triple::hexagon;
   const bool IsAndroid = getTriple().isAndroid();
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/crtbegin.o
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32/crtbegin.o
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32d/crtbegin.o
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib32/ilp32d/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64/crtbegin.o
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64d/crtbegin.o
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64d/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/riscv64be-unknown-linux-gnu/bin/ld
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/riscv64be-unknown-linux-gnu/bin/ld
new file mode 100755
index 0000000000000..25b914c0f79f3
--- /dev/null
+++ 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/riscv64be-unknown-linux-gnu/bin/ld
@@ -0,0 +1 @@
+#\!/bin/true
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib/.keep 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32d/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32d/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64/.keep 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64d/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64d/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32d/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32d/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64d/.keep
 
b/clang/test/Driver/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64d/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/riscv-be.c b/clang/test/Driver/riscv-be.c
index a343cb4e09d7f..1fcb4a197d941 100644
--- a/clang/test/Driver/riscv-be.c
+++ b/clang/test/Driver/riscv-be.c
@@ -9,6 +9,86 @@
 // NOWARN-NOT: warning: big-endian RISC-V target support is experimental
 // NOWARN: "-triple" "riscv64be-unknown-unknown-elf"
 
+/// Test dynamic linker for big-endian RISC-V Linux targets
+// RUN: %clang -### %s --target=riscv64be-unknown-linux-gnu \
+// RUN:   -Wno-riscv-be-experimental --rtlib=platform -mabi=lp64d 2>&1 \
+// RUN:   | FileCheck -check-prefix=RV64BE-LINUX-LP64D %s
+// RV64BE-LINUX-LP64D: "-dynamic-linker" "/lib/ld-linux-riscv64be-lp64d.so.1"
+
+// RUN: %clang -### %s --target=riscv64be-unknown-linux-gnu \
+// RUN:   -Wno-riscv-be-experimental --rtlib=platform -mabi=lp64 2>&1 \
+// RUN:   | FileCheck -check-prefix=RV64BE-LINUX-LP64 %s
+// RV64BE-LINUX-LP64: "-dynamic-linker" "/lib/ld-linux-riscv64be-lp64.so.1"
+
+// RUN: %clang -### %s --target=riscv32be-unknown-linux-gnu \
+// RUN:   -Wno-riscv-be-experimental --rtlib=platform -mabi=ilp32d 2>&1 \
+// RUN:   | FileCheck -check-prefix=RV32BE-LINUX-ILP32D %s
+// RV32BE-LINUX-ILP32D: "-dynamic-linker" "/lib/ld-linux-riscv32be-ilp32d.so.1"
+
+// RUN: %clang -### %s --target=riscv32be-unknown-linux-gnu \
+// RUN:   -Wno-riscv-be-experimental --rtlib=platform -mabi=ilp32 2>&1 \
+// RUN:   | FileCheck -check-prefix=RV32BE-LINUX-ILP32 %s
+// RV32BE-LINUX-ILP32: "-dynamic-linker" "/lib/ld-linux-riscv32be-ilp32.so.1"
+
+/// Test big-endian RISC-V GCC multilib directory layout
+// RUN: env "PATH=" %clang -### %s -fuse-ld= -no-pie \
+// RUN:   --target=riscv64be-unknown-linux-gnu --rtlib=platform 
--unwindlib=platform -mabi=lp64 \
+// RUN:   -Wno-riscv-be-experimental \
+// RUN:   --gcc-toolchain=%S/Inputs/multilib_riscv_linux_sdk_be \
+// RUN:   --sysroot=%S/Inputs/multilib_riscv_linux_sdk_be/sysroot 2>&1 \
+// RUN:   | FileCheck -check-prefix=C-RV64BE-LINUX-MULTI-LP64 %s
+
+// C-RV64BE-LINUX-MULTI-LP64: 
"{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/../../../../riscv64be-unknown-linux-gnu/bin/ld"
+// C-RV64BE-LINUX-MULTI-LP64: 
"--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot"
+// C-RV64BE-LINUX-MULTI-LP64: "-m" "elf64briscv" "-X"
+// C-RV64BE-LINUX-MULTI-LP64: "-dynamic-linker" 
"/lib/ld-linux-riscv64be-lp64.so.1"
+// C-RV64BE-LINUX-MULTI-LP64: 
"{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64/crtbegin.o"
+// C-RV64BE-LINUX-MULTI-LP64: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64"
+// C-RV64BE-LINUX-MULTI-LP64: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64"
+// C-RV64BE-LINUX-MULTI-LP64: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64"
+
+// RUN: env "PATH=" %clang -### %s -fuse-ld= -no-pie \
+// RUN:   --target=riscv64be-unknown-linux-gnu --rtlib=platform 
--unwindlib=platform -march=rv64imafd \
+// RUN:   -Wno-riscv-be-experimental \
+// RUN:   --gcc-toolchain=%S/Inputs/multilib_riscv_linux_sdk_be \
+// RUN:   --sysroot=%S/Inputs/multilib_riscv_linux_sdk_be/sysroot 2>&1 \
+// RUN:   | FileCheck -check-prefix=C-RV64BE-LINUX-MULTI-LP64D %s
+
+// C-RV64BE-LINUX-MULTI-LP64D: 
"{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/../../../../riscv64be-unknown-linux-gnu/bin/ld"
+// C-RV64BE-LINUX-MULTI-LP64D: 
"--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot"
+// C-RV64BE-LINUX-MULTI-LP64D: "-m" "elf64briscv"
+// C-RV64BE-LINUX-MULTI-LP64D: "-dynamic-linker" 
"/lib/ld-linux-riscv64be-lp64d.so.1"
+// C-RV64BE-LINUX-MULTI-LP64D: 
"{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64d/crtbegin.o"
+// C-RV64BE-LINUX-MULTI-LP64D: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/lib/gcc/riscv64be-unknown-linux-gnu/7.2.0/lib64/lp64d"
+// C-RV64BE-LINUX-MULTI-LP64D: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib64/lp64d"
+// C-RV64BE-LINUX-MULTI-LP64D: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib64/lp64d"
+
+// RUN: env "PATH=" %clang -### %s -fuse-ld= -no-pie \
+// RUN:   --target=riscv32be-unknown-linux-gnu --rtlib=platform 
--unwindlib=platform -mabi=ilp32 \
+// RUN:   -Wno-riscv-be-experimental \
+// RUN:   --gcc-toolchain=%S/Inputs/multilib_riscv_linux_sdk_be \
+// RUN:   --sysroot=%S/Inputs/multilib_riscv_linux_sdk_be/sysroot 2>&1 \
+// RUN:   | FileCheck -check-prefix=C-RV32BE-LINUX-MULTI-ILP32 %s
+
+// C-RV32BE-LINUX-MULTI-ILP32: 
"--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot"
+// C-RV32BE-LINUX-MULTI-ILP32: "-m" "elf32briscv" "-X"
+// C-RV32BE-LINUX-MULTI-ILP32: "-dynamic-linker" 
"/lib/ld-linux-riscv32be-ilp32.so.1"
+// C-RV32BE-LINUX-MULTI-ILP32: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32"
+// C-RV32BE-LINUX-MULTI-ILP32: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32"
+
+// RUN: env "PATH=" %clang -### %s -fuse-ld= -no-pie \
+// RUN:   --target=riscv32be-unknown-linux-gnu --rtlib=platform 
--unwindlib=platform -march=rv32imafd \
+// RUN:   -Wno-riscv-be-experimental \
+// RUN:   --gcc-toolchain=%S/Inputs/multilib_riscv_linux_sdk_be \
+// RUN:   --sysroot=%S/Inputs/multilib_riscv_linux_sdk_be/sysroot 2>&1 \
+// RUN:   | FileCheck -check-prefix=C-RV32BE-LINUX-MULTI-ILP32D %s
+
+// C-RV32BE-LINUX-MULTI-ILP32D: 
"--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot"
+// C-RV32BE-LINUX-MULTI-ILP32D: "-m" "elf32briscv"
+// C-RV32BE-LINUX-MULTI-ILP32D: "-dynamic-linker" 
"/lib/ld-linux-riscv32be-ilp32d.so.1"
+// C-RV32BE-LINUX-MULTI-ILP32D: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/lib32/ilp32d"
+// C-RV32BE-LINUX-MULTI-ILP32D: 
"-L{{.*}}/Inputs/multilib_riscv_linux_sdk_be/sysroot/usr/lib32/ilp32d"
+
 int foo(void) {
   return 0;
 }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to