Skip to content

Commit 48d1283

Browse files
committed
[RISCV] Change linker job in Baremetal toolchain object to accomodate valid
GCCInstallation.(2/3) This patch adds the defaults for CXXSstdlib type and other runtime libs. Additionally, this patch also modifes the linker job and extend it to support valid GCCInstallation. This PR preserves the behavior of both toolchain objects in the linker job with the only new change being that the presence of `--gcc-toolchain` or `--gcc-install-dir` will imply that GNU linker is the default linker unless otherwise a differnt linker is passed through `-fuse-ld` flag. This is the second PR in the series of 3 PRs for merging and extending Baremetal toolchain object. The division of the PRs is as follows: - Teach Baremetal toolchain about GCC installation and make sysroot and assembler related changes. - Changes related to linker job and defaults for CXXStdlib and other runtime libs. - Finally removing the call to RISCVToolchain object. RFC: https://discourse.llvm.org/t/merging-riscvtoolchain-and-baremetal-toolchains/75524 Change-Id: I8fdb3490a3888001b1bb999e7ee8df90a187d18d
1 parent 03b91a8 commit 48d1283

10 files changed

+298
-78
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

+86-24
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple &Triple,
172172
: Generic_ELF(D, Triple, Args) {
173173
GCCInstallation.init(Triple, Args);
174174
SysRoot = computeSysRoot();
175+
UseLD =
176+
Args.getLastArgValue(options::OPT_fuse_ld_EQ).equals_insensitive("ld");
175177
if (GCCInstallation.isValid()) {
176178
Multilibs = GCCInstallation.getMultilibs();
177179
SelectedMultilibs.assign({GCCInstallation.getMultilib()});
@@ -342,6 +344,32 @@ BareMetal::OrderedMultilibs BareMetal::getOrderedMultilibs() const {
342344
return llvm::reverse(Default);
343345
}
344346

347+
ToolChain::CXXStdlibType BareMetal::GetDefaultCXXStdlibType() const {
348+
if (getTriple().isRISCV() && GCCInstallation.isValid())
349+
return ToolChain::CST_Libstdcxx;
350+
return ToolChain::CST_Libcxx;
351+
}
352+
353+
ToolChain::RuntimeLibType BareMetal::GetDefaultRuntimeLibType() const {
354+
if (getTriple().isRISCV() && GCCInstallation.isValid())
355+
return ToolChain::RLT_Libgcc;
356+
return ToolChain::RLT_CompilerRT;
357+
}
358+
359+
ToolChain::UnwindLibType
360+
BareMetal::GetUnwindLibType(const llvm::opt::ArgList &Args) const {
361+
if (getTriple().isRISCV())
362+
return ToolChain::UNW_None;
363+
364+
return ToolChain::GetUnwindLibType(Args);
365+
}
366+
367+
const char *BareMetal::getDefaultLinker() const {
368+
if (isUsingLD())
369+
return "ld";
370+
return "ld.lld";
371+
}
372+
345373
void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
346374
ArgStringList &CC1Args) const {
347375
if (DriverArgs.hasArg(options::OPT_nostdinc))
@@ -535,12 +563,21 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
535563
const llvm::Triple::ArchType Arch = TC.getArch();
536564
const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
537565

538-
AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
566+
if (!D.SysRoot.empty())
567+
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
539568

540569
CmdArgs.push_back("-Bstatic");
541570

542-
if (TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
543-
CmdArgs.push_back("--no-relax");
571+
if (Triple.isRISCV()) {
572+
if (Args.hasArg(options::OPT_mno_relax))
573+
CmdArgs.push_back("--no-relax");
574+
if (TC.isUsingLD()) {
575+
CmdArgs.push_back("-m");
576+
CmdArgs.push_back(Arch == llvm::Triple::riscv64 ? "elf64lriscv"
577+
: "elf32lriscv");
578+
}
579+
CmdArgs.push_back("-X");
580+
}
544581

545582
if (Triple.isARM() || Triple.isThumb()) {
546583
bool IsBigEndian = arm::isARMBigEndian(Triple, Args);
@@ -551,19 +588,54 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
551588
CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ? "-EB" : "-EL");
552589
}
553590

554-
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
555-
options::OPT_r)) {
556-
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
591+
bool WantCRTs =
592+
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
593+
594+
const char *crtbegin, *crtend;
595+
if (WantCRTs) {
596+
if (!Args.hasArg(options::OPT_r))
597+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
598+
if (TC.isUsingLD()) {
599+
auto RuntimeLib = TC.GetRuntimeLibType(Args);
600+
if (RuntimeLib == ToolChain::RLT_Libgcc) {
601+
crtbegin = "crtbegin.o";
602+
crtend = "crtend.o";
603+
} else {
604+
assert(RuntimeLib == ToolChain::RLT_CompilerRT);
605+
crtbegin =
606+
TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object);
607+
crtend =
608+
TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);
609+
}
610+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(crtbegin)));
611+
}
557612
}
558613

559-
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
560-
options::OPT_s, options::OPT_t, options::OPT_r});
614+
Args.addAllArgs(CmdArgs,
615+
{options::OPT_L, options::OPT_u, options::OPT_T_Group,
616+
options::OPT_s, options::OPT_t, options::OPT_r});
561617

562618
TC.AddFilePathLibArgs(Args, CmdArgs);
563619

564620
for (const auto &LibPath : TC.getLibraryPaths())
565621
CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-L", LibPath)));
566622

623+
if (D.isUsingLTO()) {
624+
assert(!Inputs.empty() && "Must have at least one input.");
625+
// Find the first filename InputInfo object.
626+
auto Input = llvm::find_if(
627+
Inputs, [](const InputInfo &II) -> bool { return II.isFilename(); });
628+
if (Input == Inputs.end())
629+
// For a very rare case, all of the inputs to the linker are
630+
// InputArg. If that happens, just use the first InputInfo.
631+
Input = Inputs.begin();
632+
633+
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
634+
D.getLTOMode() == LTOK_Thin);
635+
}
636+
637+
AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
638+
567639
if (TC.ShouldLinkCXXStdlib(Args)) {
568640
bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
569641
!Args.hasArg(options::OPT_static);
@@ -576,26 +648,16 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
576648
}
577649

578650
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
651+
CmdArgs.push_back("--start-group");
579652
AddRunTimeLibs(TC, D, CmdArgs, Args);
580-
581653
CmdArgs.push_back("-lc");
654+
if (TC.isUsingLD())
655+
CmdArgs.push_back("-lgloss");
656+
CmdArgs.push_back("--end-group");
582657
}
583658

584-
if (D.isUsingLTO()) {
585-
assert(!Inputs.empty() && "Must have at least one input.");
586-
// Find the first filename InputInfo object.
587-
auto Input = llvm::find_if(
588-
Inputs, [](const InputInfo &II) -> bool { return II.isFilename(); });
589-
if (Input == Inputs.end())
590-
// For a very rare case, all of the inputs to the linker are
591-
// InputArg. If that happens, just use the first InputInfo.
592-
Input = Inputs.begin();
593-
594-
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
595-
D.getLTOMode() == LTOK_Thin);
596-
}
597-
if (TC.getTriple().isRISCV())
598-
CmdArgs.push_back("-X");
659+
if (TC.isUsingLD() && WantCRTs)
660+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(crtend)));
599661

600662
// The R_ARM_TARGET2 relocation must be treated as R_ARM_REL32 on arm*-*-elf
601663
// and arm*-*-eabi (the default is R_ARM_GOT_PREL, used on arm*-*-linux and

clang/lib/Driver/ToolChains/BareMetal.h

+10-10
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
3636
Tool *buildStaticLibTool() const override;
3737

3838
public:
39+
virtual bool isUsingLD() const { return UseLD || GCCInstallation.isValid(); }
3940
bool isBareMetal() const override { return true; }
4041
bool isCrossCompiling() const override { return true; }
4142
bool HasNativeLLVMSupport() const override { return true; }
@@ -48,19 +49,18 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
4849

4950
StringRef getOSLibName() const override { return "baremetal"; }
5051

51-
RuntimeLibType GetDefaultRuntimeLibType() const override {
52-
return ToolChain::RLT_CompilerRT;
53-
}
54-
CXXStdlibType GetDefaultCXXStdlibType() const override {
55-
return ToolChain::CST_Libcxx;
56-
}
57-
5852
UnwindTableLevel
5953
getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override {
6054
return UnwindTableLevel::None;
6155
}
6256

63-
const char *getDefaultLinker() const override { return "ld.lld"; }
57+
CXXStdlibType GetDefaultCXXStdlibType() const override;
58+
59+
RuntimeLibType GetDefaultRuntimeLibType() const override;
60+
61+
UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
62+
63+
const char *getDefaultLinker() const override;
6464

6565
void
6666
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
@@ -82,7 +82,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
8282
using OrderedMultilibs =
8383
llvm::iterator_range<llvm::SmallVector<Multilib>::const_reverse_iterator>;
8484
OrderedMultilibs getOrderedMultilibs() const;
85-
85+
bool UseLD;
8686
std::string SysRoot;
8787
std::string computeGCCSysRoot() const;
8888
};
@@ -108,7 +108,7 @@ class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool {
108108

109109
class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
110110
public:
111-
Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
111+
Linker(const ToolChain &TC) : Tool("baremetal::Linker", "linker", TC) {}
112112
bool isLinkJob() const override { return true; }
113113
bool hasIntegratedCPP() const override { return false; }
114114
void ConstructJob(Compilation &C, const JobAction &JA,

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

+6
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,9 @@
2626
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
2727

2828
// C-ARM-BAREMETAL-NOGCC: "-internal-isystem" "{{.*}}/aarch64-nogcc/bin/../aarch64-none-elf/include"
29+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/ld"
30+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/aarch64-nogcc/bin/../aarch64-none-elf/lib/crt0.o"
31+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/aarch64-nogcc/{{.*}}/aarch64-none-elf/lib/crtbegin.o"
32+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/aarch64-nogcc/bin/../aarch64-none-elf/lib"
33+
// C-ARM-BAREMETAL-NOGCC: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
34+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/aarch64-nogcc/{{.*}}/aarch64-none-elf/lib/crtend.o"

clang/test/Driver/aarch64-toolchain.c

+73
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@
99
// C-AARCH64-BAREMETAL: "-cc1" "-triple" "aarch64-unknown-none-elf"
1010
// C-AARCH64-BAREMETAL: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
1111
// C-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
12+
// C-AARCH64-BAREMETAL: "{{.*}}/ld" "--sysroot={{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
13+
// C-AARCH64-BAREMETAL: "-Bstatic" "-EL"
14+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
15+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
16+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
17+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
18+
// C-AARCH64-BAREMETAL: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
19+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
1220

1321
// RUN: %clang -### %s -fuse-ld= \
1422
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
@@ -18,6 +26,13 @@
1826

1927
// C-AARCH64-BAREMETAL-NOSYSROOT: "-cc1" "-triple" "aarch64-unknown-none-elf"
2028
// C-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
29+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/ld" "-Bstatic" "-EL"
30+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
31+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
32+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
33+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
34+
// C-AARCH64-BAREMETAL-NOSYSROOT: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
35+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
2136

2237
// RUN: %clangxx -### %s -fuse-ld= \
2338
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -29,6 +44,14 @@
2944
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1/backward"
3045
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1"
3146
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
47+
// CXX-AARCH64-BAREMETAL: "{{.*}}/ld" "--sysroot={{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
48+
// CXX-AARCH64-BAREMETAL: "-Bstatic" "-EL"
49+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
50+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
51+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
52+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
53+
// CXX-AARCH64-BAREMETAL: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
54+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
3255

3356
// RUN: %clangxx -### %s -fuse-ld= \
3457
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -40,6 +63,13 @@
4063
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include/c++/8.2.1/backward"
4164
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include/c++/8.2.1"
4265
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
66+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/ld" "-Bstatic" "-EL"
67+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
68+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
69+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
70+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
71+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
72+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
4373

4474
// RUN: %clangxx -### %s -fuse-ld= \
4575
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -50,6 +80,14 @@
5080
// CXX-AARCH64-BAREMETAL-LIBCXX: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
5181
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/v1"
5282
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
83+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/ld" "--sysroot={{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
84+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-Bstatic" "-EL"
85+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
86+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
87+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
88+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
89+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
90+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
5391

5492
// RUN: %clangxx -### %s -fuse-ld= \
5593
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -59,3 +97,38 @@
5997

6098
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include/c++/v1"
6199
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
100+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/ld" "-Bstatic" "-EL"
101+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
102+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
103+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
104+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
105+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
106+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
107+
108+
// RUN: %clang -### %s -fuse-ld= \
109+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt \
110+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
111+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
112+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-COMPILER-RT %s
113+
114+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}crt0.o"
115+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtbegin.o"
116+
// AARCH64-BAREMETAL-COMPILER-RT: "--start-group" "{{.*}}libclang_rt.builtins.a" "-lc" "-lgloss" "--end-group"
117+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtend.o"
118+
119+
// RUN: %clang -### %s -fuse-ld= \
120+
// RUN: --target=aarch64-none-elf --unwindlib=libunwind \
121+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
122+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
123+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
124+
125+
// RUN: %clang -### %s -fuse-ld= \
126+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt --unwindlib=libunwind \
127+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
128+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
129+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
130+
131+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}crt0.o"
132+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}clang_rt.crtbegin.o"
133+
// AARCH64-BAREMETAL-UNWINDLIB: "--start-group" "{{.*}}libclang_rt.builtins.a" "--as-needed" "-lunwind" "--no-as-needed" "-lc" "-lgloss" "--end-group"
134+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}clang_rt.crtend.o"

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@
2626
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
2727

2828
// C-ARM-BAREMETAL-NOGCC: "-internal-isystem" "{{.*}}/arm-nogcc/bin/../armv6m-none-eabi/include"
29-
29+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/ld"
30+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/arm-nogcc/bin/../armv6m-none-eabi/lib/crt0.o"
31+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/arm-nogcc/{{.*}}/armv6m-none-eabi/lib/crtbegin.o"
32+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/arm-nogcc/bin/../armv6m-none-eabi/lib"
33+
// C-ARM-BAREMETAL-NOGCC: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
34+
// C-ARM-BAREMETAL-NOGCC: "{{.*}}/arm-nogcc/{{.*}}/armv6m-none-eabi/lib/crtend.o

0 commit comments

Comments
 (0)