Skip to content

Commit d557912

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 0565206 commit d557912

File tree

8 files changed

+224
-13
lines changed

8 files changed

+224
-13
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

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

548-
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
549-
options::OPT_r)) {
550-
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
548+
bool NeedCRTs =
549+
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
550+
551+
const char *CRTBegin, *CRTEnd;
552+
if (NeedCRTs) {
553+
if (!Args.hasArg(options::OPT_r))
554+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
555+
if (TC.hasValidGCCInstallation() || hasGCCToolChainAlongSideClang(D)) {
556+
auto RuntimeLib = TC.GetRuntimeLibType(Args);
557+
switch (RuntimeLib) {
558+
case (ToolChain::RLT_Libgcc): {
559+
CRTBegin = "crtbegin.o";
560+
CRTEnd = "crtend.o";
561+
break;
562+
}
563+
case (ToolChain::RLT_CompilerRT): {
564+
CRTBegin =
565+
TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object);
566+
CRTEnd =
567+
TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);
568+
break;
569+
}
570+
}
571+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTBegin)));
572+
}
551573
}
552574

553575
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
@@ -570,9 +592,12 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
570592
}
571593

572594
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
595+
CmdArgs.push_back("--start-group");
573596
AddRunTimeLibs(TC, D, CmdArgs, Args);
574-
575597
CmdArgs.push_back("-lc");
598+
if (TC.hasValidGCCInstallation() || hasGCCToolChainAlongSideClang(D))
599+
CmdArgs.push_back("-lgloss");
600+
CmdArgs.push_back("--end-group");
576601
}
577602

578603
if (D.isUsingLTO()) {
@@ -588,6 +613,11 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
588613
addLTOOptions(TC, Args, CmdArgs, Output, *Input,
589614
D.getLTOMode() == LTOK_Thin);
590615
}
616+
617+
if ((TC.hasValidGCCInstallation() || hasGCCToolChainAlongSideClang(D)) &&
618+
NeedCRTs)
619+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTEnd)));
620+
591621
if (TC.getTriple().isRISCV())
592622
CmdArgs.push_back("-X");
593623

clang/lib/Driver/ToolChains/BareMetal.h

Lines changed: 1 addition & 2 deletions
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 hasValidGCCInstallation() const { return GCCInstallation.isValid(); }
3940
bool isBareMetal() const override { return true; }
4041
bool isCrossCompiling() const override { return true; }
4142
bool HasNativeLLVMSupport() const override { return true; }
@@ -60,8 +61,6 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
6061
return ToolChain::CST_Libcxx;
6162
}
6263

63-
const char *getDefaultLinker() const override { return "ld.lld"; }
64-
6564
void
6665
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
6766
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: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
// UNSUPPORTED: system-windows
22

3+
// Test interaction with -fuse-ld=lld
4+
// RUN: %clang -### %s -fuse-ld=lld \
5+
// RUN: --target=aarch64-none-elf \
6+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree 2>&1 \
7+
// RUN: | FileCheck -check-prefix=LLD %s
8+
// LLD: ld.lld
9+
310
// RUN: %clang -### %s -fuse-ld= \
411
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
512
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
@@ -9,6 +16,14 @@
916
// C-AARCH64-BAREMETAL: "-cc1" "-triple" "aarch64-unknown-none-elf"
1017
// C-AARCH64-BAREMETAL: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
1118
// C-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
19+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
20+
// C-AARCH64-BAREMETAL: "{{.*}}.o" "-Bstatic" "-EL"
21+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
22+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
23+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
24+
// C-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
25+
// C-AARCH64-BAREMETAL: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
26+
// C-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
1227

1328
// RUN: %clang -### %s -fuse-ld= \
1429
// RUN: --target=aarch64-none-elf --rtlib=libgcc \
@@ -18,6 +33,14 @@
1833

1934
// C-AARCH64-BAREMETAL-NOSYSROOT: "-cc1" "-triple" "aarch64-unknown-none-elf"
2035
// C-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
36+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
37+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}.o" "-Bstatic" "-EL"
38+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
39+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
40+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
41+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
42+
// C-AARCH64-BAREMETAL-NOSYSROOT: "--start-group" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgloss" "--end-group"
43+
// C-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
2144

2245
// RUN: %clangxx -### %s -fuse-ld= \
2346
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -29,6 +52,14 @@
2952
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1/backward"
3053
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1"
3154
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
55+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
56+
// CXX-AARCH64-BAREMETAL: "{{.*}}.o" "-Bstatic" "-EL"
57+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
58+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
59+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
60+
// CXX-AARCH64-BAREMETAL: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
61+
// CXX-AARCH64-BAREMETAL: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
62+
// CXX-AARCH64-BAREMETAL: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
3263

3364
// RUN: %clangxx -### %s -fuse-ld= \
3465
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc \
@@ -40,6 +71,14 @@
4071
// 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"
4172
// 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"
4273
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
74+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
75+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}.o" "-Bstatic" "-EL"
76+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
77+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
78+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
79+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
80+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "-lstdc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
81+
// CXX-AARCH64-BAREMETAL-NOSYSROOT: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
4382

4483
// RUN: %clangxx -### %s -fuse-ld= \
4584
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -50,6 +89,14 @@
5089
// CXX-AARCH64-BAREMETAL-LIBCXX: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
5190
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/v1"
5291
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include"
92+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld
93+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}.o" "-Bstatic" "-EL"
94+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib/crt0.o"
95+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
96+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
97+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/lib"
98+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
99+
// CXX-AARCH64-BAREMETAL-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
53100

54101
// RUN: %clangxx -### %s -fuse-ld= \
55102
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc \
@@ -59,3 +106,39 @@
59106

60107
// 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"
61108
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/include"
109+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../bin/aarch64-none-elf-ld"
110+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}.o" "-Bstatic" "-EL"
111+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib/crt0.o"
112+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtbegin.o"
113+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1"
114+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-L{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/../../../../aarch64-none-elf/lib"
115+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "-lc++" "-lm" "--start-group" "-lgcc_s" "-lgcc" "-lc" "-lgloss" "--end-group"
116+
// CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX: "{{.*}}/Inputs/basic_aarch64_gcc_tree/lib/gcc/aarch64-none-elf/8.2.1/crtend.o"
117+
118+
// RUN: %clang -### %s -fuse-ld= \
119+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt \
120+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
121+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
122+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-COMPILER-RT %s
123+
124+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}crt0.o"
125+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtbegin.o"
126+
// AARCH64-BAREMETAL-COMPILER-RT: "--start-group" "{{.*}}libclang_rt.builtins.a" "-lc" "-lgloss" "--end-group"
127+
// AARCH64-BAREMETAL-COMPILER-RT: "{{.*}}clang_rt.crtend.o"
128+
129+
// RUN: %clang -### %s -fuse-ld= \
130+
// RUN: --target=aarch64-none-elf --unwindlib=libunwind \
131+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
132+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
133+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
134+
135+
// RUN: %clang -### %s -fuse-ld= \
136+
// RUN: --target=aarch64-none-elf --rtlib=compiler-rt --unwindlib=libunwind \
137+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
138+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
139+
// RUN: | FileCheck -check-prefix=AARCH64-BAREMETAL-UNWINDLIB %s
140+
141+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}crt0.o"
142+
// AARCH64-BAREMETAL-UNWINDLIB: "{{.*}}clang_rt.crtbegin.o"
143+
// AARCH64-BAREMETAL-UNWINDLIB: "--start-group" "{{.*}}libclang_rt.builtins.a" "--as-needed" "-lunwind" "--no-as-needed" "-lc" "-lgloss" "--end-group"
144+
// 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)