Skip to content

Commit 3289352

Browse files
committed
[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
1 parent 7417cc1 commit 3289352

File tree

8 files changed

+45
-19
lines changed

8 files changed

+45
-19
lines changed

clang/lib/Driver/ToolChains/RISCVToolchain.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ Tool *RISCVToolChain::buildLinker() const {
4141
return new tools::RISCV::Linker(*this);
4242
}
4343

44+
ToolChain::RuntimeLibType RISCVToolChain::GetDefaultRuntimeLibType() const {
45+
return GCCInstallation.isValid() ?
46+
ToolChain::RLT_Libgcc : ToolChain::RLT_CompilerRT;
47+
}
48+
49+
ToolChain::UnwindLibType
50+
RISCVToolChain::GetUnwindLibType(const llvm::opt::ArgList &Args) const {
51+
return ToolChain::UNW_None;
52+
}
53+
4454
void RISCVToolChain::addClangTargetOptions(
4555
const llvm::opt::ArgList &DriverArgs,
4656
llvm::opt::ArgStringList &CC1Args,
@@ -110,9 +120,22 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
110120
bool WantCRTs =
111121
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
112122

123+
const char *crtbegin, *crtend;
124+
auto RuntimeLib = ToolChain.GetRuntimeLibType(Args);
125+
if (RuntimeLib == ToolChain::RLT_Libgcc) {
126+
crtbegin = "crtbegin.o";
127+
crtend = "crtend.o";
128+
} else {
129+
assert (RuntimeLib == ToolChain::RLT_CompilerRT);
130+
crtbegin = ToolChain.getCompilerRTArgString(Args, "crtbegin",
131+
ToolChain::FT_Object);
132+
crtend = ToolChain.getCompilerRTArgString(Args, "crtend",
133+
ToolChain::FT_Object);
134+
}
135+
113136
if (WantCRTs) {
114137
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
115-
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
138+
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
116139
}
117140

118141
Args.AddAllArgs(CmdArgs, options::OPT_L);
@@ -133,11 +156,11 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
133156
CmdArgs.push_back("-lc");
134157
CmdArgs.push_back("-lgloss");
135158
CmdArgs.push_back("--end-group");
136-
CmdArgs.push_back("-lgcc");
159+
AddRunTimeLibs(ToolChain, ToolChain.getDriver(), CmdArgs, Args);
137160
}
138161

139162
if (WantCRTs)
140-
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
163+
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
141164

142165
CmdArgs.push_back("-o");
143166
CmdArgs.push_back(Output.getFilename());

clang/lib/Driver/ToolChains/RISCVToolchain.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF {
2525
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
2626
llvm::opt::ArgStringList &CC1Args,
2727
Action::OffloadKind) const override;
28+
RuntimeLibType GetDefaultRuntimeLibType() const override;
29+
UnwindLibType
30+
GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
2831
void
2932
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
3033
llvm::opt::ArgStringList &CC1Args) const override;

clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtend.o

Whitespace-only changes.

clang/test/Driver/riscv32-toolchain-extra.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
// RUN: -target riscv32-unknown-elf 2>&1 \
2323
// RUN: | FileCheck -check-prefix=C-RV32-BAREMETAL-ILP32-NOGCC %s
2424

25-
// C-RV32-BAREMETAL-ILP32-NOGCC: InstalledDir: [[DRIVERDIR:.*]]
2625
// C-RV32-BAREMETAL-ILP32-NOGCC: "-fuse-init-array"
27-
// C-RV32-BAREMETAL-ILP32-NOGCC: "-internal-isystem" "[[DRIVERDIR]]/../riscv32-unknown-elf/include"
28-
// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/riscv32-unknown-elf-ld"
29-
// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crt0.o"
30-
// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crtbegin.o"
31-
// C-RV32-BAREMETAL-ILP32-NOGCC: "-L[[DRIVERDIR]]/../riscv32-unknown-elf/lib"
32-
// C-RV32-BAREMETAL-ILP32-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc"
33-
// C-RV32-BAREMETAL-ILP32-NOGCC: "[[DRIVERDIR]]/../riscv32-unknown-elf/lib/crtend.o"
26+
// C-RV32-BAREMETAL-ILP32-NOGCC: "-internal-isystem" "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/include"
27+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/riscv32-unknown-elf-ld"
28+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/lib/crt0.o"
29+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/clang_rt.crtbegin-riscv32.o"
30+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/lib"
31+
// C-RV32-BAREMETAL-ILP32-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group"
32+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/libclang_rt.builtins-riscv32.a"
33+
// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/clang_rt.crtend-riscv32.o"

clang/test/Driver/riscv64-toolchain-extra.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
// RUN: -target riscv64-unknown-elf 2>&1 \
2323
// RUN: | FileCheck -check-prefix=C-RV64-BAREMETAL-LP64-NOGCC %s
2424

25-
// C-RV64-BAREMETAL-LP64-NOGCC: InstalledDir: [[DRIVERDIR:.*]]
2625
// C-RV64-BAREMETAL-LP64-NOGCC: "-fuse-init-array"
27-
// C-RV64-BAREMETAL-LP64-NOGCC: "-internal-isystem" "[[DRIVERDIR]]/../riscv64-unknown-elf/include"
28-
// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/riscv64-unknown-elf-ld"
29-
// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crt0.o"
30-
// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crtbegin.o"
31-
// C-RV64-BAREMETAL-LP64-NOGCC: "-L[[DRIVERDIR]]/../riscv64-unknown-elf/lib"
32-
// C-RV64-BAREMETAL-LP64-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc"
33-
// C-RV64-BAREMETAL-LP64-NOGCC: "[[DRIVERDIR]]/../riscv64-unknown-elf/lib/crtend.o"
26+
// C-RV64-BAREMETAL-LP64-NOGCC: "-internal-isystem" "{{.*}}Output/testroot-riscv64-baremetal-nogcc/bin/../riscv64-unknown-elf/include"
27+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/bin/riscv64-unknown-elf-ld"
28+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/bin/../riscv64-unknown-elf/lib/crt0.o"
29+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/clang_rt.crtbegin-riscv64.o"
30+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/bin/../riscv64-unknown-elf/lib"
31+
// C-RV64-BAREMETAL-LP64-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group"
32+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/libclang_rt.builtins-riscv64.a"
33+
// C-RV64-BAREMETAL-LP64-NOGCC: "{{.*}}Output/testroot-riscv64-baremetal-nogcc/lib/clang/{{[0-9.]*}}/lib/clang_rt.crtend-riscv64.o"

0 commit comments

Comments
 (0)