diff options
| author | Edward Jones <ed.jones@embecosm.com> | 2019-11-22 19:05:39 +0000 |
|---|---|---|
| committer | Edward Jones <ed.jones@embecosm.com> | 2019-11-22 20:05:29 +0000 |
| commit | e0f22fe04a5c9eb244ff0533549743b7deb03b99 (patch) | |
| tree | c15d57541321863291ddc3aee49e7fc300a5b65f /clang/lib/Driver | |
| parent | 262b10ba1f9db4d00f43bcb1d8c1e557dced3bcd (diff) | |
| download | bcm5719-llvm-e0f22fe04a5c9eb244ff0533549743b7deb03b99.tar.gz bcm5719-llvm-e0f22fe04a5c9eb244ff0533549743b7deb03b99.zip | |
[RISCV] Use compiler-rt if no GCC installation detected
If a GCC installation is not detected, then this attempts to
use compiler-rt and the compiler-rt crtbegin/crtend
implementations as a fallback.
Differential Revision: https://reviews.llvm.org/D68407
Diffstat (limited to 'clang/lib/Driver')
| -rw-r--r-- | clang/lib/Driver/ToolChains/RISCVToolchain.cpp | 29 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains/RISCVToolchain.h | 3 |
2 files changed, 29 insertions, 3 deletions
diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index bd63873e3c6..25d912428b5 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -61,6 +61,16 @@ Tool *RISCVToolChain::buildLinker() const { return new tools::RISCV::Linker(*this); } +ToolChain::RuntimeLibType RISCVToolChain::GetDefaultRuntimeLibType() const { + return GCCInstallation.isValid() ? + ToolChain::RLT_Libgcc : ToolChain::RLT_CompilerRT; +} + +ToolChain::UnwindLibType +RISCVToolChain::GetUnwindLibType(const llvm::opt::ArgList &Args) const { + return ToolChain::UNW_None; +} + void RISCVToolChain::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, @@ -138,9 +148,22 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, bool WantCRTs = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + const char *crtbegin, *crtend; + auto RuntimeLib = ToolChain.GetRuntimeLibType(Args); + if (RuntimeLib == ToolChain::RLT_Libgcc) { + crtbegin = "crtbegin.o"; + crtend = "crtend.o"; + } else { + assert (RuntimeLib == ToolChain::RLT_CompilerRT); + crtbegin = ToolChain.getCompilerRTArgString(Args, "crtbegin", + ToolChain::FT_Object); + crtend = ToolChain.getCompilerRTArgString(Args, "crtend", + ToolChain::FT_Object); + } + 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); @@ -161,11 +184,11 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-lc"); CmdArgs.push_back("-lgloss"); CmdArgs.push_back("--end-group"); - CmdArgs.push_back("-lgcc"); + AddRunTimeLibs(ToolChain, ToolChain.getDriver(), CmdArgs, Args); } 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()); diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.h b/clang/lib/Driver/ToolChains/RISCVToolchain.h index b2b56b066ef..bb7f64849bc 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.h +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -25,6 +25,9 @@ public: void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + RuntimeLibType GetDefaultRuntimeLibType() const override; + UnwindLibType + GetUnwindLibType(const llvm::opt::ArgList &Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; |

