Skip to content

Commit 23a48f3

Browse files
committed
[Driver] Add support for crtbegin.o, crtend.o and libgloss lib to BareMetal
toolchain object This patch conditionalise the addition of crt{begin,end}.o object files along with addition of -lgloss lib based on whether libc selected is newlib or llvm libc. Since there is no way a user can specify which libc it wants to link against, currently passing valid GCCInstallation to driver will select newlib otherwise it will default to llvm libc. Moreover, this patch makes gnuld the default linker for baremetal toolchain object. User need to pass `-fuse-ld=lld` explicitly to driver to select lld This is the 2nd patch in the series of patches of merging RISCVToolchain into BareMetal toolchain object. RFC: https://discourse.llvm.org/t/merging-riscvtoolchain-and-baremetal-toolchains/75524 Change-Id: Ie06dc976c306cf04ec2733bbb2d271c57d201f86
1 parent f19e2e0 commit 23a48f3

File tree

8 files changed

+247
-13
lines changed

8 files changed

+247
-13
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -586,9 +586,31 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
586586
CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ? "-EB" : "-EL");
587587
}
588588

589-
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
590-
options::OPT_r)) {
591-
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
589+
bool NeedCRTs =
590+
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
591+
592+
const char *CRTBegin, *CRTEnd;
593+
if (NeedCRTs) {
594+
if (!Args.hasArg(options::OPT_r))
595+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
596+
if (TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D)) {
597+
auto RuntimeLib = TC.GetRuntimeLibType(Args);
598+
switch (RuntimeLib) {
599+
case (ToolChain::RLT_Libgcc): {
600+
CRTBegin = "crtbegin.o";
601+
CRTEnd = "crtend.o";
602+
break;
603+
}
604+
case (ToolChain::RLT_CompilerRT): {
605+
CRTBegin =
606+
TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object);
607+
CRTEnd =
608+
TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);
609+
break;
610+
}
611+
}
612+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTBegin)));
613+
}
592614
}
593615

594616
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
@@ -611,9 +633,12 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
611633
}
612634

613635
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
636+
CmdArgs.push_back("--start-group");
614637
AddRunTimeLibs(TC, D, CmdArgs, Args);
615-
616638
CmdArgs.push_back("-lc");
639+
if (TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D))
640+
CmdArgs.push_back("-lgloss");
641+
CmdArgs.push_back("--end-group");
617642
}
618643

619644
if (D.isUsingLTO()) {
@@ -629,6 +654,11 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
629654
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
630655
D.getLTOMode() == LTOK_Thin);
631656
}
657+
658+
if ((TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D)) &&
659+
NeedCRTs)
660+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTEnd)));
661+
632662
if (TC.getTriple().isRISCV())
633663
CmdArgs.push_back("-X");
634664

clang/lib/Driver/ToolChains/BareMetal.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
3838
public:
3939
bool initGCCInstallation(const llvm::Triple &Triple,
4040
const llvm::opt::ArgList &Args);
41+
bool hasValidGCCInstallation() const { return IsGCCInstallationValid; }
4142
bool isBareMetal() const override { return true; }
4243
bool isCrossCompiling() const override { return true; }
4344
bool HasNativeLLVMSupport() const override { return true; }
@@ -63,8 +64,6 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
6364
return ToolChain::CST_Libcxx;
6465
}
6566

66-
const char *getDefaultLinker() const override { return "ld.lld"; }
67-
6867
void
6968
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
7069
llvm::opt::ArgStringList &CC1Args) const override;

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,21 @@
1515
// RUN: mkdir -p %t/aarch64-nogcc/bin
1616
// RUN: ln -s %clang %t/aarch64-nogcc/bin/clang
1717
// RUN: ln -s %S/Inputs/basic_aarch64_nogcc_tree/aarch64-none-elf %t/aarch64-nogcc/aarch64-none-elf
18+
// RUN: ln -s %S/Inputs/basic_aarch64_nogcc_tree/bin/aarch64-none-elf-ld %t/aarch64-nogcc/bin/aarch64-none-elf-ld
1819
// RUN: %t/aarch64-nogcc/bin/clang %s -### -no-canonical-prefixes \
1920
// RUN: --gcc-toolchain=%t/aarch64-nogcc/invalid \
2021
// RUN: --target=aarch64-none-elf --rtlib=libgcc -fuse-ld=ld 2>&1 \
21-
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
22+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL-NOGCC %s
2223

2324
// RUN: %t/aarch64-nogcc/bin/clang %s -### -no-canonical-prefixes \
2425
// RUN: --sysroot=%t/aarch64-nogcc/bin/../aarch64-none-elf \
2526
// RUN: --target=aarch64-none-elf --rtlib=libgcc -fuse-ld=ld 2>&1 \
26-
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
27+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL-NOGCC %s
2728

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

clang/test/Driver/aarch64-toolchain.c

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
// UNSUPPORTED: system-windows
22

3+
// Test interaction with -fuse-ld=lld
4+
// RUN: %clang -### %s -fuse-ld=lld -B%S/Inputs/lld \
5+
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
6+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
7+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
8+
// RUN: | FileCheck -check-prefix=LLD-AARCH64-BAREMETAL %s
9+
10+
// LLD-AARCH64-BAREMETAL: "-cc1" "-triple" "aarch64-unknown-none-elf"
11+
// LLD-AARCH64-BAREMETAL: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
12+
// LLD-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
13+
// LLD-AARCH64-BAREMETAL: "{{.*}}/Inputs/lld/ld.lld"
14+
// LLD-AARCH64-BAREMETAL: "{{.*}}.o" "-Bstatic" "-EL"
15+
// LLD-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
16+
// LLD-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
17+
// LLD-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
18+
// LLD-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
19+
// LLD-AARCH64-BAREMETAL: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
20+
// LLD-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
21+
322
// RUN: %clang -### %s -fuse-ld= \
423
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
524
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
@@ -9,6 +28,14 @@
928
// C-AARCH64-BAREMETAL: "-cc1" "-triple" "aarch64-unknown-none-elf"
1029
// C-AARCH64-BAREMETAL: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
1130
// C-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
31+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
32+
// C-AARCH64-BAREMETAL: "{{.*}}.o" "-Bstatic" "-EL"
33+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
34+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
35+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
36+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
37+
// C-AARCH64-BAREMETAL: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
38+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
1239

1340
// RUN: %clang -### %s -fuse-ld= \
1441
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
@@ -18,6 +45,14 @@
1845

1946
// C-AARCH64-BAREMETAL-NOSYSROOT: "-cc1" "-triple" "aarch64-unknown-none-elf"
2047
// C-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
48+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
49+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}.o" "-Bstatic" "-EL"
50+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
51+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
52+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
53+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
54+
// C-AARCH64-BAREMETAL-NOSYSROOT: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
55+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
2156

2257
// RUN: %clangxx -### %s -fuse-ld= \
2358
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -29,6 +64,14 @@
2964
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1/backward"
3065
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1"
3166
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
67+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
68+
// CXX-AARCH64-BAREMETAL: "{{.*}}.o" "-Bstatic" "-EL"
69+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
70+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
71+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
72+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
73+
// CXX-AARCH64-BAREMETAL: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
74+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
3275

3376
// RUN: %clangxx -### %s -fuse-ld= \
3477
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -40,6 +83,14 @@
4083
// 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"
4184
// 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"
4285
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
86+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
87+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}.o" "-Bstatic" "-EL"
88+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
89+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
90+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
91+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
92+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
93+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
4394

4495
// RUN: %clangxx -### %s -fuse-ld= \
4596
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -50,6 +101,14 @@
50101
// CXX-AARCH64-BAREMETAL-LIBCXX: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
51102
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/v1"
52103
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
104+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld
105+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}.o" "-Bstatic" "-EL"
106+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
107+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
108+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
109+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
110+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
111+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
53112

54113
// RUN: %clangxx -### %s -fuse-ld= \
55114
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -59,3 +118,39 @@
59118

60119
// 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"
61120
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
121+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
122+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}.o" "-Bstatic" "-EL"
123+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
124+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
125+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
126+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
127+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
128+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
129+
130+
// RUN: %clang -### %s -fuse-ld= \
131+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt \
132+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
133+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
134+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-COMPILER-RT %s
135+
136+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}crt0.o"
137+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtbegin.o"
138+
// AARCH64-BAREMETAL-COMPILER-RT: "--start-group" "{{.*}}libclang_rt.builtins.a" "-lc" "-lgloss" "--end-group"
139+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtend.o"
140+
141+
// RUN: %clang -### %s -fuse-ld= \
142+
// RUN: --target=aarch64-none-elf --unwindlib=libunwind \
143+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
144+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
145+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
146+
147+
// RUN: %clang -### %s -fuse-ld= \
148+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt --unwindlib=libunwind \
149+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
150+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
151+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
152+
153+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}crt0.o"
154+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}clang_rt.crtbegin.o"
155+
// AARCH64-BAREMETAL-UNWINDLIB: "--start-group" "{{.*}}libclang_rt.builtins.a" "--as-needed" "-lunwind" "--no-as-needed" "-lc" "-lgloss" "--end-group"
156+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}clang_rt.crtend.o"

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// RUN: mkdir -p %t/arm-nogcc/bin
1616
// RUN: ln -s %clang %t/arm-nogcc/bin/clang
1717
// RUN: ln -s %S/Inputs/basic_arm_nogcc_tree/armv6m-none-eabi %t/arm-nogcc/armv6m-none-eabi
18+
// RUN: ln -s %S/Inputs/basic_arm_nogcc_tree/bin/armv6m-none-eabi-ld %t/arm-nogcc/bin/armv6m-none-eabi-ld
1819
// RUN: %t/arm-nogcc/bin/clang %s -### -no-canonical-prefixes \
1920
// RUN: --gcc-toolchain=%t/arm-nogcc/invalid \
2021
// RUN: --target=armv6m-none-eabi --rtlib=libgcc -fuse-ld=ld 2>&1 \
@@ -26,4 +27,10 @@
2627
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
2728

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

0 commit comments

Comments
 (0)