edward-jones updated this revision to Diff 223209. edward-jones retitled this revision from "[WIP][RISCV] Use compiler-rt if no GCC installation detected" to "[RISCV] Use compiler-rt if no GCC installation detected". edward-jones added a comment. Herald added subscribers: arichardson, emaste. Herald added a reviewer: espindola.
Rebased, updated tests from D68391 <https://reviews.llvm.org/D68391> to check for existence of compiler-rt crtbegin/crtend and runtime library. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D68407/new/ https://reviews.llvm.org/D68407 Files: clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/clang_rt.crtbegin-riscv32.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/clang_rt.crtend-riscv32.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/clang_rt.crtbegin-riscv64.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/clang_rt.crtend-riscv64.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtend.o clang/test/Driver/riscv32-toolchain.c clang/test/Driver/riscv64-toolchain.c
Index: clang/test/Driver/riscv64-toolchain.c =================================================================== --- clang/test/Driver/riscv64-toolchain.c +++ clang/test/Driver/riscv64-toolchain.c @@ -57,10 +57,10 @@ // C-RV64-BAREMETAL-LP64-NOGCC: "-internal-isystem" "[[DRIVERDIR]]/../riscv64-unknown-elf/include" // C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/riscv64-unknown-elf-ld" // C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crt0.o" -// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crtbegin.o" +// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/clang_rt.crtbegin-riscv64.o" // C-RV64-BAREMETAL-LP64-NOGCC: "-L[[DRIVERDIR]]/../riscv64-unknown-elf/lib" -// C-RV64-BAREMETAL-LP64-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc" -// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crtend.o" +// C-RV64-BAREMETAL-LP64-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lclang_rt.builtins-riscv64" +// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/clang_rt.crtend-riscv64.o" // RUN: %clangxx %s -### -no-canonical-prefixes \ Index: clang/test/Driver/riscv32-toolchain.c =================================================================== --- clang/test/Driver/riscv32-toolchain.c +++ clang/test/Driver/riscv32-toolchain.c @@ -57,10 +57,10 @@ // C-RV32-BAREMETAL-ILP32-NOGCC: "-internal-isystem" "[[DRIVERDIR]]/../riscv32-unknown-elf/include" // C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/riscv32-unknown-elf-ld" // C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crt0.o" -// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crtbegin.o" +// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/clang_rt.crtbegin-riscv32.o" // C-RV32-BAREMETAL-ILP32-NOGCC: "-L[[DRIVERDIR]]/../riscv32-unknown-elf/lib" -// C-RV32-BAREMETAL-ILP32-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc" -// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crtend.o" +// C-RV32-BAREMETAL-ILP32-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lclang_rt.builtins-riscv32" +// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/clang_rt.crtend-riscv32.o" // RUN: %clangxx %s -### -no-canonical-prefixes \ // RUN: -target riscv32-unknown-elf -stdlib=libstdc++ \ 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 @@ -38,7 +38,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( @@ -96,7 +97,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; @@ -108,9 +109,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); @@ -131,11 +151,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