Skip to content

Commit 983869a

Browse files
authored
[Driver] Include crt0.o in the baremetal link (#101258)
The common baremetal libc implementations already provide crt0.o and GCC automatically links it so this improves parity.
1 parent a2855f5 commit 983869a

File tree

4 files changed

+13
-0
lines changed

4 files changed

+13
-0
lines changed

clang/lib/Driver/ToolChains/BareMetal.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,11 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
487487
CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ? "-EB" : "-EL");
488488
}
489489

490+
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
491+
options::OPT_r)) {
492+
CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o")));
493+
}
494+
490495
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
491496
options::OPT_s, options::OPT_t, options::OPT_r});
492497

clang/test/Driver/Inputs/baremetal_arm/lib/crt0.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_baremetal_tree/lib/armv6m-unknown-none-eabi/crt0.o

Whitespace-only changes.

clang/test/Driver/baremetal.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// CHECK-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}include"
1717
// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
1818
// CHECK-V6M-C-NEXT: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic" "-EL"
19+
// CHECK-V6M-C-SAME: "[[SYSROOT:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}crt0.o"
1920
// CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome{{[/\\]+}}directory{{[/\\]+}}user{{[/\\]+}}asked{{[/\\]+}}for"
2021
// CHECK-V6M-C-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}lib"
2122
// CHECK-V6M-C-SAME: "-lc" "-lm" "{{[^"]*}}libclang_rt.builtins.a" "--target2=rel" "-o" "{{.*}}.tmp.out"
@@ -37,6 +38,7 @@
3738
// CHECK-V6M-TREE-SAME: "-internal-isystem" "[[INSTALLED_DIR]]{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}armv6m-unknown-none-eabi"
3839
// CHECK-V6M-TREE-SAME: "-x" "c++" "{{.*}}baremetal.cpp"
3940
// CHECK-V6M-TREE-NEXT: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic" "-EL"
41+
// CHECK-V6M-TREE-SAME: "[[INSTALLED_DIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}armv6m-unknown-none-eabi{{[/\\]+}}crt0.o"
4042
// CHECK-V6M-TREE-SAME: "-L[[INSTALLED_DIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}armv6m-unknown-none-eabi"
4143
// CHECK-V6M-TREE-SAME: "-lc" "-lm" "{{[^"]*}}libclang_rt.builtins.a" "--target2=rel" "-o" "{{.*}}.tmp.out"
4244

@@ -48,6 +50,7 @@
4850
// CHECK-ARMV7M-PER-TARGET: "-isysroot" "[[SYSROOT:[^"]*]]"
4951
// CHECK-ARMV7M-PER-TARGET: "-x" "c++" "{{.*}}baremetal.cpp"
5052
// CHECK-ARMV7M-PER-TARGET: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic" "-EL"
53+
// CHECK-ARMV7M-PER_TARGET: "[[SYSROOT:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}crt0.o"
5154
// CHECK-ARMV7M-PER-TARGET: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}lib"
5255
// CHECK-ARMV7M-PER-TARGET: "-L[[RESOURCE_DIR:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}armv7m-vendor-none-eabi
5356
// CHECK-ARMV7M-PER-TARGET: "-lc" "-lm" "{{[^"]*}}libclang_rt.builtins.a"
@@ -56,6 +59,7 @@
5659
// RUN: --sysroot=%S/Inputs/baremetal_arm | FileCheck --check-prefix=CHECK-V6M-DEFAULTCXX %s
5760
// CHECK-V6M-DEFAULTCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
5861
// CHECK-V6M-DEFAULTCXX: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic" "-EL"
62+
// CHECK-V6M-DEFAULTCXX-SAME: "[[SYSROOT:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}crt0.o"
5963
// CHECK-V6M-DEFAULTCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}baremetal_arm{{[/\\]+}}lib"
6064
// CHECK-V6M-DEFAULTCXX-SAME: "-lc++" "-lc++abi" "-lunwind"
6165
// CHECK-V6M-DEFAULTCXX-SAME: "-lc" "-lm" "{{[^"]*}}libclang_rt.builtins.a" "--target2=rel" "-o" "a.out"
@@ -117,6 +121,10 @@
117121
// RUN: | FileCheck %s --check-prefix=CHECK-THREAD-MODEL-POSIX
118122
// CHECK-THREAD-MODEL-POSIX: Thread model: posix
119123

124+
// RUN: %clangxx -### --target=arm-none-eabi -nostartfiles -v %s 2>&1 \
125+
// RUN: | FileCheck %s --check-prefix=CHECK-NOSTARTFILES
126+
// CHECK-NOSTARTFILES-NOT: "crt0.o"
127+
120128
// RUN: %clang -### --target=arm-none-eabi -rtlib=libgcc -v %s 2>&1 \
121129
// RUN: | FileCheck %s --check-prefix=CHECK-RTLIB-GCC
122130
// CHECK-RTLIB-GCC: -lgcc

0 commit comments

Comments
 (0)