edward-jones created this revision. edward-jones added a reviewer: asb. Herald added subscribers: cfe-commits, pzheng, simoncook, s.egerton, lenary, Jim, benna, psnobl, jocewei, PkmX, rkruppe, the_o, brucehoult, MartinMosbeck, rogfer01, zzheng, MaskRay, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, apazos, johnrusso, rbar, dberris. Herald added a project: clang.
If a GCC installation is not detected, they this attempts to use compiler-rt and the compiler-rt crtbegin/crtend implementations as a fallback. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D68407 Files: clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h Index: clang/lib/Driver/ToolChains/RISCVToolchain.h =================================================================== --- clang/lib/Driver/ToolChains/RISCVToolchain.h +++ clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -45,13 +45,18 @@ namespace RISCV { class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { public: - Linker(const ToolChain &TC) : GnuTool("RISCV::Linker", "ld", TC) {} + Linker(const ToolChain &TC, bool ShouldUseLibGCC) + : GnuTool("RISCV::Linker", "ld", TC), + UseLibGCC(ShouldUseLibGCC) {} bool hasIntegratedCPP() const override { return false; } bool isLinkJob() const override { return true; } void ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; + +private: + bool UseLibGCC; }; } // end namespace RISCV } // end namespace tools Index: clang/lib/Driver/ToolChains/RISCVToolchain.cpp =================================================================== --- clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -36,7 +36,8 @@ } Tool *RISCVToolChain::buildLinker() const { - return new tools::RISCV::Linker(*this); + bool useLibGCC = GCCInstallation.isValid(); + return new tools::RISCV::Linker(*this, useLibGCC); } void RISCVToolChain::addClangTargetOptions( @@ -94,7 +95,7 @@ const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { - const ToolChain &ToolChain = getToolChain(); + const auto &ToolChain = getToolChain(); const Driver &D = ToolChain.getDriver(); ArgStringList CmdArgs; @@ -106,9 +107,28 @@ bool WantCRTs = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + const char *crtbegin, *crtend, *rtlib; + if (UseLibGCC) { + crtbegin = "crtbegin.o"; + crtend = "crtend.o"; + rtlib = "-lgcc"; + } else { + auto Arch = ToolChain.getTriple().getArch(); + if (Arch == llvm::Triple::ArchType::riscv32) { + crtbegin = "clang_rt.crtbegin-riscv32.o"; + crtend = "clang_rt.crtend-riscv32.o"; + rtlib = "-lclang_rt.builtins-riscv32"; + } else { + assert(Arch == llvm::Triple::ArchType::riscv64); + crtbegin = "clang_rt.crtbegin-riscv64.o"; + crtend = "clang_rt.crtend-riscv64.o"; + rtlib = "-lclang_rt.builtins-riscv64"; + } + } + if (WantCRTs) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); - CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -129,11 +149,11 @@ CmdArgs.push_back("-lc"); CmdArgs.push_back("-lgloss"); CmdArgs.push_back("--end-group"); - CmdArgs.push_back("-lgcc"); + CmdArgs.push_back(rtlib); } if (WantCRTs) - CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename());
Index: clang/lib/Driver/ToolChains/RISCVToolchain.h =================================================================== --- clang/lib/Driver/ToolChains/RISCVToolchain.h +++ clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -45,13 +45,18 @@ namespace RISCV { class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { public: - Linker(const ToolChain &TC) : GnuTool("RISCV::Linker", "ld", TC) {} + Linker(const ToolChain &TC, bool ShouldUseLibGCC) + : GnuTool("RISCV::Linker", "ld", TC), + UseLibGCC(ShouldUseLibGCC) {} bool hasIntegratedCPP() const override { return false; } bool isLinkJob() const override { return true; } void ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; + +private: + bool UseLibGCC; }; } // end namespace RISCV } // end namespace tools Index: clang/lib/Driver/ToolChains/RISCVToolchain.cpp =================================================================== --- clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -36,7 +36,8 @@ } Tool *RISCVToolChain::buildLinker() const { - return new tools::RISCV::Linker(*this); + bool useLibGCC = GCCInstallation.isValid(); + return new tools::RISCV::Linker(*this, useLibGCC); } void RISCVToolChain::addClangTargetOptions( @@ -94,7 +95,7 @@ const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { - const ToolChain &ToolChain = getToolChain(); + const auto &ToolChain = getToolChain(); const Driver &D = ToolChain.getDriver(); ArgStringList CmdArgs; @@ -106,9 +107,28 @@ bool WantCRTs = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + const char *crtbegin, *crtend, *rtlib; + if (UseLibGCC) { + crtbegin = "crtbegin.o"; + crtend = "crtend.o"; + rtlib = "-lgcc"; + } else { + auto Arch = ToolChain.getTriple().getArch(); + if (Arch == llvm::Triple::ArchType::riscv32) { + crtbegin = "clang_rt.crtbegin-riscv32.o"; + crtend = "clang_rt.crtend-riscv32.o"; + rtlib = "-lclang_rt.builtins-riscv32"; + } else { + assert(Arch == llvm::Triple::ArchType::riscv64); + crtbegin = "clang_rt.crtbegin-riscv64.o"; + crtend = "clang_rt.crtend-riscv64.o"; + rtlib = "-lclang_rt.builtins-riscv64"; + } + } + if (WantCRTs) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); - CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -129,11 +149,11 @@ CmdArgs.push_back("-lc"); CmdArgs.push_back("-lgloss"); CmdArgs.push_back("--end-group"); - CmdArgs.push_back("-lgcc"); + CmdArgs.push_back(rtlib); } if (WantCRTs) - CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits