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/4] [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/4] 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/4] 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; } >From dfa273b862d238908214779cdf45fc0d5f839db1 Mon Sep 17 00:00:00 2001 From: Djordje Todorovic <[email protected]> Date: Mon, 22 Dec 2025 12:50:42 +0100 Subject: [PATCH 4/4] Disable the test on windows as we did for LE --- clang/test/Driver/riscv-be.c | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/test/Driver/riscv-be.c b/clang/test/Driver/riscv-be.c index 1fcb4a197d941..3344d2eaecbc2 100644 --- a/clang/test/Driver/riscv-be.c +++ b/clang/test/Driver/riscv-be.c @@ -1,3 +1,4 @@ +// UNSUPPORTED: system-windows // REQUIRES: riscv-registered-target // RUN: %clang -target riscv64be-unknown-elf -### %s 2>&1 \ // RUN: | FileCheck %s _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
