[PATCH] D68407: [WIP][RISCV] Use compiler-rt if no GCC installation detected
Edward Jones via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 3 10:12:41 PDT 2019
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());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68407.223051.patch
Type: text/x-patch
Size: 3316 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191003/2b0b92b5/attachment-0001.bin>
More information about the cfe-commits
mailing list