Skip to content

Commit b6dac4b

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 9bb7823 commit b6dac4b

10 files changed

+297
-77
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

+86-24
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple &Triple,
154154
: Generic_ELF(D, Triple, Args) {
155155
GCCInstallation.init(Triple, Args);
156156
SysRoot = computeSysRoot();
157+
UseLD =
158+
Args.getLastArgValue(options::OPT_fuse_ld_EQ).equals_insensitive("ld");
157159
if (GCCInstallation.isValid()) {
158160
Multilibs = GCCInstallation.getMultilibs();
159161
SelectedMultilibs.assign({GCCInstallation.getMultilib()});
@@ -331,6 +333,32 @@ BareMetal::OrderedMultilibs BareMetal::getOrderedMultilibs() const {
331333
return llvm::reverse(Default);
332334
}
333335

336+
ToolChain::CXXStdlibType BareMetal::GetDefaultCXXStdlibType() const {
337+
if (getTriple().isRISCV() && GCCInstallation.isValid())
338+
return ToolChain::CST_Libstdcxx;
339+
return ToolChain::CST_Libcxx;
340+
}
341+
342+
ToolChain::RuntimeLibType BareMetal::GetDefaultRuntimeLibType() const {
343+
if (getTriple().isRISCV() && GCCInstallation.isValid())
344+
return ToolChain::RLT_Libgcc;
345+
return ToolChain::RLT_CompilerRT;
346+
}
347+
348+
ToolChain::UnwindLibType
349+
BareMetal::GetUnwindLibType(const llvm::opt::ArgList &Args) const {
350+
if (getTriple().isRISCV())
351+
return ToolChain::UNW_None;
352+
353+
return ToolChain::GetUnwindLibType(Args);
354+
}
355+
356+
const char *BareMetal::getDefaultLinker() const {
357+
if (isUsingLD())
358+
return "ld";
359+
return "ld.lld";
360+
}
361+
334362
void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
335363
ArgStringList &CC1Args) const {
336364
if (DriverArgs.hasArg(options::OPT_nostdinc))
@@ -524,12 +552,21 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
524552
const llvm::Triple::ArchType Arch = TC.getArch();
525553
const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
526554

527-
AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
555+
if (!D.SysRoot.empty())
556+
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
528557

529558
CmdArgs.push_back("-Bstatic");
530559

531-
if (TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
532-
CmdArgs.push_back("--no-relax");
560+
if (Triple.isRISCV()) {
561+
if (Args.hasArg(options::OPT_mno_relax))
562+
CmdArgs.push_back("--no-relax");
563+
if (TC.isUsingLD()) {
564+
CmdArgs.push_back("-m");
565+
CmdArgs.push_back(Arch == llvm::Triple::riscv64 ? "elf64lriscv"
566+
: "elf32lriscv");
567+
}
568+
CmdArgs.push_back("-X");
569+
}
533570

534571
if (Triple.isARM() || Triple.isThumb()) {
535572
bool IsBigEndian = arm::isARMBigEndian(Triple, Args);
@@ -540,19 +577,54 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
540577
CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ? "-EB" : "-EL");
541578
}
542579

543-
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
544-
options::OPT_r)) {
545-
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
580+
bool WantCRTs =
581+
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
582+
583+
const char *crtbegin, *crtend;
584+
if (WantCRTs) {
585+
if (!Args.hasArg(options::OPT_r))
586+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
587+
if (TC.isUsingLD()) {
588+
auto RuntimeLib = TC.GetRuntimeLibType(Args);
589+
if (RuntimeLib == ToolChain::RLT_Libgcc) {
590+
crtbegin = "crtbegin.o";
591+
crtend = "crtend.o";
592+
} else {
593+
assert(RuntimeLib == ToolChain::RLT_CompilerRT);
594+
crtbegin =
595+
TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object);
596+
crtend =
597+
TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);
598+
}
599+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(crtbegin)));
600+
}
546601
}
547602

548-
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
549-
options::OPT_s, options::OPT_t, options::OPT_r});
603+
Args.addAllArgs(CmdArgs,
604+
{options::OPT_L, options::OPT_u, options::OPT_T_Group,
605+
options::OPT_s, options::OPT_t, options::OPT_r});
550606

551607
TC.AddFilePathLibArgs(Args, CmdArgs);
552608

553609
for (const auto &LibPath : TC.getLibraryPaths())
554610
CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-L", LibPath)));
555611

612+
if (D.isUsingLTO()) {
613+
assert(!Inputs.empty() && "Must have at least one input.");
614+
// Find the first filename InputInfo object.
615+
auto Input = llvm::find_if(
616+
Inputs, [](const InputInfo &II) -> bool { return II.isFilename(); });
617+
if (Input == Inputs.end())
618+
// For a very rare case, all of the inputs to the linker are
619+
// InputArg. If that happens, just use the first InputInfo.
620+
Input = Inputs.begin();
621+
622+
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
623+
D.getLTOMode() == LTOK_Thin);
624+
}
625+
626+
AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
627+
556628
if (TC.ShouldLinkCXXStdlib(Args)) {
557629
bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
558630
!Args.hasArg(options::OPT_static);
@@ -565,26 +637,16 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
565637
}
566638

567639
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
640+
CmdArgs.push_back("--start-group");
568641
AddRunTimeLibs(TC, D, CmdArgs, Args);
569-
570642
CmdArgs.push_back("-lc");
643+
if (TC.isUsingLD())
644+
CmdArgs.push_back("-lgloss");
645+
CmdArgs.push_back("--end-group");
571646
}
572647

573-
if (D.isUsingLTO()) {
574-
assert(!Inputs.empty() && "Must have at least one input.");
575-
// Find the first filename InputInfo object.
576-
auto Input = llvm::find_if(
577-
Inputs, [](const InputInfo &II) -> bool { return II.isFilename(); });
578-
if (Input == Inputs.end())
579-
// For a very rare case, all of the inputs to the linker are
580-
// InputArg. If that happens, just use the first InputInfo.
581-
Input = Inputs.begin();
582-
583-
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
584-
D.getLTOMode() == LTOK_Thin);
585-
}
586-
if (TC.getTriple().isRISCV())
587-
CmdArgs.push_back("-X");
648+
if (TC.isUsingLD() && WantCRTs)
649+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(crtend)));
588650

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

clang/lib/Driver/ToolChains/BareMetal.h

+9-9
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+
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; }
@@ -53,14 +54,13 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
5354
return UnwindTableLevel::None;
5455
}
5556

56-
RuntimeLibType GetDefaultRuntimeLibType() const override {
57-
return ToolChain::RLT_CompilerRT;
58-
}
59-
CXXStdlibType GetDefaultCXXStdlibType() const override {
60-
return ToolChain::CST_Libcxx;
61-
}
57+
CXXStdlibType GetDefaultCXXStdlibType() const override;
58+
59+
RuntimeLibType GetDefaultRuntimeLibType() const override;
6260

63-
const char *getDefaultLinker() const override { return "ld.lld"; }
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,
@@ -85,7 +85,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
8585
using OrderedMultilibs =
8686
llvm::iterator_range<llvm::SmallVector<Multilib>::const_reverse_iterator>;
8787
OrderedMultilibs getOrderedMultilibs() const;
88-
88+
bool UseLD;
8989
std::string SysRoot;
9090
SmallVector<std::string> MultilibMacroDefines;
9191
};
@@ -111,7 +111,7 @@ class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool {
111111

112112
class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
113113
public:
114-
Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
114+
Linker(const ToolChain &TC) : Tool("baremetal::Linker", "linker", TC) {}
115115
bool isLinkJob() const override { return true; }
116116
bool hasIntegratedCPP() const override { return false; }
117117
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)