[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