Skip to content

Commit 36f8e16

Browse files
committed
[Driver] Add support for crtbegin.o, crtend.o and libgloss lib to BareMetal toolchain object (#121830)
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: I19f10807b5b41a8ebc413ca0b3209efd258a87df
1 parent a0c5f19 commit 36f8e16

File tree

8 files changed

+423
-9
lines changed

8 files changed

+423
-9
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

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

474-
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
475-
options::OPT_r)) {
476-
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
474+
bool NeedCRTs =
475+
!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
476+
477+
const char *CRTBegin, *CRTEnd;
478+
if (NeedCRTs) {
479+
if (!Args.hasArg(options::OPT_r))
480+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
481+
if (TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D)) {
482+
auto RuntimeLib = TC.GetRuntimeLibType(Args);
483+
switch (RuntimeLib) {
484+
case (ToolChain::RLT_Libgcc): {
485+
CRTBegin = "crtbegin.o";
486+
CRTEnd = "crtend.o";
487+
break;
488+
}
489+
case (ToolChain::RLT_CompilerRT): {
490+
CRTBegin =
491+
TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object);
492+
CRTEnd =
493+
TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);
494+
break;
495+
}
496+
}
497+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTBegin)));
498+
}
477499
}
478500

479501
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
@@ -496,15 +518,22 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
496518
}
497519

498520
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
521+
CmdArgs.push_back("--start-group");
499522
AddRunTimeLibs(TC, D, CmdArgs, Args);
500-
501523
CmdArgs.push_back("-lc");
524+
if (TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D))
525+
CmdArgs.push_back("-lgloss");
526+
CmdArgs.push_back("--end-group");
502527
}
503528

504529
if (D.isUsingLTO())
505530
addLTOOptions(TC, Args, CmdArgs, Output, Inputs,
506531
D.getLTOMode() == LTOK_Thin);
507532

533+
if ((TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D)) &&
534+
NeedCRTs)
535+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(CRTEnd)));
536+
508537
if (TC.getTriple().isRISCV())
509538
CmdArgs.push_back("-X");
510539

clang/lib/Driver/ToolChains/BareMetal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
3535
Tool *buildStaticLibTool() const override;
3636

3737
public:
38-
bool useIntegratedAs() const override { return true; }
38+
bool initGCCInstallation(const llvm::Triple &Triple,
39+
const llvm::opt::ArgList &Args);
40+
bool hasValidGCCInstallation() const { return IsGCCInstallationValid; }
3941
bool isBareMetal() const override { return true; }
4042
bool isCrossCompiling() const override { return true; }
4143
bool HasNativeLLVMSupport() const override { return true; }
@@ -55,8 +57,6 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
5557
return ToolChain::CST_Libcxx;
5658
}
5759

58-
const char *getDefaultLinker() const override { return "ld.lld"; }
59-
6060
void
6161
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
6262
llvm::opt::ArgStringList &CC1Args) const override;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// A basic clang -cc1 command-line, and simple environment check.
2+
3+
// The tests here are similar to those in aarch64-toolchain.c, however
4+
// these tests need to create symlinks to test directory trees in order to
5+
// set up the environment and therefore shell support is required.
6+
// REQUIRES: shell
7+
// UNSUPPORTED: system-windows
8+
9+
// If there is no GCC install detected then the driver searches for executables
10+
// and runtime starting from the directory tree above the driver itself.
11+
// The test below checks that the driver correctly finds the linker and
12+
// runtime if and only if they exist.
13+
//
14+
// RUN: rm -rf %t
15+
// RUN: mkdir -p %t/aarch64-nogcc/bin
16+
// RUN: ln -s %clang %t/aarch64-nogcc/bin/clang
17+
// 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
19+
// RUN: %t/aarch64-nogcc/bin/clang %s -### -no-canonical-prefixes \
20+
// RUN: --gcc-toolchain=%t/aarch64-nogcc/invalid \
21+
// RUN: --target=aarch64-none-elf --rtlib=libgcc --unwindlib=platform -fuse-ld=ld 2>&1 \
22+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL-NOGCC %s
23+
24+
// RUN: %t/aarch64-nogcc/bin/clang %s -### -no-canonical-prefixes \
25+
// RUN: --sysroot=%t/aarch64-nogcc/bin/../aarch64-none-elf \
26+
// RUN: --target=aarch64-none-elf --rtlib=libgcc --unwindlib=platform -fuse-ld=ld 2>&1 \
27+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL-NOGCC %s
28+
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: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// UNSUPPORTED: system-windows
2+
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 --unwindlib=platform \
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+
22+
// RUN: %clang -### %s -fuse-ld= \
23+
// RUN: --target=aarch64-none-elf --rtlib=libgcc --unwindlib=platform \
24+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
25+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
26+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL %s
27+
28+
// C-AARCH64-BAREMETAL: "-cc1" "-triple" "aarch64-unknown-none-elf"
29+
// C-AARCH64-BAREMETAL: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
30+
// 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"
39+
40+
// RUN: %clang -### %s -fuse-ld= \
41+
// RUN: --target=aarch64-none-elf --rtlib=libgcc --unwindlib=platform \
42+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
43+
// RUN: --sysroot= 2>&1 \
44+
// RUN: | FileCheck -check-prefix=C-AARCH64-BAREMETAL-NOSYSROOT %s
45+
46+
// C-AARCH64-BAREMETAL-NOSYSROOT: "-cc1" "-triple" "aarch64-unknown-none-elf"
47+
// 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"
56+
57+
// RUN: %clangxx -### %s -fuse-ld= \
58+
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc --unwindlib=platform \
59+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
60+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
61+
// RUN: | FileCheck -check-prefix=CXX-AARCH64-BAREMETAL %s
62+
63+
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1/aarch64-none-elf"
64+
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1/backward"
65+
// CXX-AARCH64-BAREMETAL: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/8.2.1"
66+
// 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"
75+
76+
// RUN: %clangxx -### %s -fuse-ld= \
77+
// RUN: --target=aarch64-none-elf -stdlib=libstdc++ --rtlib=libgcc --unwindlib=platform \
78+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
79+
// RUN: --sysroot= 2>&1 \
80+
// RUN: | FileCheck -check-prefix=CXX-AARCH64-BAREMETAL-NOSYSROOT %s
81+
82+
// 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/aarch64-none-elf"
83+
// 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"
84+
// 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"
85+
// 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"
94+
95+
// RUN: %clangxx -### %s -fuse-ld= \
96+
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc --unwindlib=platform \
97+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
98+
// RUN: --sysroot=%S/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf 2>&1 \
99+
// RUN: | FileCheck -check-prefix=CXX-AARCH64-BAREMETAL-LIBCXX %s
100+
101+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-isysroot" "{{.*}}Inputs/basic_aarch64_gcc_tree/aarch64-none-elf"
102+
// CXX-AARCH64-BAREMETAL-LIBCXX: "-internal-isystem" "{{.*}}/Inputs/basic_aarch64_gcc_tree/aarch64-none-elf/include/c++/v1"
103+
// 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"
112+
113+
// RUN: %clangxx -### %s -fuse-ld= \
114+
// RUN: --target=aarch64-none-elf -stdlib=libc++ --rtlib=libgcc --unwindlib=platform \
115+
// RUN: --gcc-toolchain=%S/Inputs/basic_aarch64_gcc_tree \
116+
// RUN: --sysroot= 2>&1 \
117+
// RUN: | FileCheck -check-prefix=CXX-AARCH64-BAREMETAL-NOSYSROOT-LIBCXX %s
118+
119+
// 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"
120+
// 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 --unwindlib=platform \
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 --rtlib=platform --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"
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// A basic clang -cc1 command-line, and simple environment check.
2+
3+
// The tests here are similar to those in arm-toolchain.c, however
4+
// these tests need to create symlinks to test directory trees in order to
5+
// set up the environment and therefore shell support is required.
6+
// REQUIRES: shell
7+
// UNSUPPORTED: system-windows
8+
9+
// If there is no GCC install detected then the driver searches for executables
10+
// and runtime starting from the directory tree above the driver itself.
11+
// The test below checks that the driver correctly finds the linker and
12+
// runtime if and only if they exist.
13+
//
14+
// RUN: rm -rf %t
15+
// RUN: mkdir -p %t/arm-nogcc/bin
16+
// RUN: ln -s %clang %t/arm-nogcc/bin/clang
17+
// 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
19+
// RUN: %t/arm-nogcc/bin/clang %s -### -no-canonical-prefixes \
20+
// RUN: --gcc-toolchain=%t/arm-nogcc/invalid \
21+
// RUN: --target=armv6m-none-eabi --rtlib=libgcc --unwindlib=platform -fuse-ld=ld 2>&1 \
22+
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
23+
24+
// RUN: %t/arm-nogcc/bin/clang %s -### -no-canonical-prefixes \
25+
// RUN: --sysroot=%t/arm-nogcc/bin/../armv6m-none-eabi \
26+
// RUN: --target=armv6m-none-eabi --rtlib=libgcc --unwindlib=platform -fuse-ld=ld 2>&1 \
27+
// RUN: | FileCheck -check-prefix=C-ARM-BAREMETAL-NOGCC %s
28+
29+
// 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"
36+

0 commit comments

Comments
 (0)