-
Notifications
You must be signed in to change notification settings - Fork 10.6k
Description
Description
Swiftlang fails to build bootstrap stage 0 when building for arm64. The error seen in the log is
08:59:57 In file included from /home/build-user/swift/lib/Demangling/Punycode.cpp:13:
08:59:57 In file included from /home/build-user/swift/include/swift/Demangling/Punycode.h:30:
08:59:57 In file included from /home/build-user/swift/stdlib/include/llvm/ADT/StringRef.h:12:
08:59:57 In file included from /home/build-user/swift/stdlib/include/llvm/ADT/Hashing.h:47:
08:59:57 In file included from /home/build-user/swift/stdlib/include/llvm/Support/ErrorHandling.h:17:
08:59:57 /home/build-user/swift/stdlib/include/llvm/Support/Compiler.h:19:10: fatal error: 'new' file not found
08:59:57 19 | #include <new>
08:59:57 | ^~~~~
08:59:57 1 error generated.
The compiler seemingly has trouble finding the C++ libraries and headers. After some investigation, it seems that the clang++ executable which is built has the wrong search paths.
For example: on X86 where the build works, you can see the following search paths from clang++
$ clang++ -v
clang version 17.0.0 (https://github.com/swiftlang/llvm-project.git 68128bc404300d4614691df049db6ab2ae0dcbc9)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/x86_64-amazon-linux/11
Selected GCC installation: /usr/lib/gcc/x86_64-amazon-linux/11
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
$ clang++ -print-search-dirs
programs: =/home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/bin:/usr/lib/gcc/x86_64-amazon-linux/11/../../../../x86_64-amazon-linux/bin
libraries: =/home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/lib/clang/17:/usr/lib/gcc/x86_64-amazon-linux/11:/usr/lib/gcc/x86_64-amazon-linux/11/../../../../lib64:/lib/../lib64:/usr/lib/../lib64:/lib:/usr/lib
$ clang++ -E -v -x c++ /dev/null
clang version 17.0.0 (https://github.com/swiftlang/llvm-project.git 68128bc404300d4614691df049db6ab2ae0dcbc9)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/x86_64-amazon-linux/11
Selected GCC installation: /usr/lib/gcc/x86_64-amazon-linux/11
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
(in-process)
"/home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/bin/clang-17" -cc1 -triple x86_64-unknown-linux-gnu -E -disable-free -clear-ast-before-backend -main-file-name null -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/build-user -v -fcoverage-compilation-dir=/home/build-user -resource-dir /home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/lib/clang/17 -internal-isystem /usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11 -internal-isystem /usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11/x86_64-amazon-linux -internal-isystem /usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11/backward -internal-isystem /home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-amazon-linux/11/../../../../x86_64-amazon-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o - -x c++ /dev/null
clang -cc1 version 17.0.0 based upon LLVM 17.0.0 default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/x86_64-amazon-linux/11/../../../../x86_64-amazon-linux/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11
/usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11/x86_64-amazon-linux
/usr/lib/gcc/x86_64-amazon-linux/11/../../../../include/c++/11/backward
/home/build-user/build/bootstrap_stage0/llvm-linux-x86_64/lib/clang/17/include
/usr/local/include
/usr/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 468 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2
What you'll notice is that the search paths look for the following prefix in the various folders x86_64-amazon-linux
Compare this to the stage0 clang++ output from the arm64 build
$ clang++ -v
clang version 17.0.0 (https://github.com/swiftlang/llvm-project.git 9682898a32ef144e2accf08e3c0d4d9f031b22d8)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/aarch64-unknown-linux-gnu/11
Selected GCC installation: /usr/lib/gcc/aarch64-unknown-linux-gnu/11
Candidate multilib: .;@m64
Selected multilib: .;@m64
$ clang++ -print-search-dirs
programs: =/home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/bin:/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../aarch64-unknown-linux-gnu/bin
libraries: =/home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/lib/clang/17:/usr/lib/gcc/aarch64-unknown-linux-gnu/11:/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../lib64:/lib/../lib64:/usr/lib/../lib64:/lib:/usr/lib
$ clang++ -E -v -x c++ /dev/null
clang version 17.0.0 (https://github.com/swiftlang/llvm-project.git 9682898a32ef144e2accf08e3c0d4d9f031b22d8)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/aarch64-unknown-linux-gnu/11
Selected GCC installation: /usr/lib/gcc/aarch64-unknown-linux-gnu/11
Candidate multilib: .;@m64
Selected multilib: .;@m64
(in-process)
"/home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/bin/clang-17" -cc1 -triple aarch64-unknown-linux-gnu -E -disable-free -clear-ast-before-backend -main-file-name null -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +v8a -target-feature +fp-armv8 -target-feature +neon -target-abi aapcs -debugger-tuning=gdb -fdebug-compilation-dir=/home/build-user -v -fcoverage-compilation-dir=/home/build-user -resource-dir /home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/lib/clang/17 -internal-isystem /usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11 -internal-isystem /usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11/aarch64-unknown-linux-gnu -internal-isystem /usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11/backward -internal-isystem /home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../aarch64-unknown-linux-gnu/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -target-feature +outline-atomics -target-feature -fmv -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o - -x c++ /dev/null
clang -cc1 version 17.0.0 based upon LLVM 17.0.0 default target aarch64-unknown-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../aarch64-unknown-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11
/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11/aarch64-unknown-linux-gnu
/usr/lib/gcc/aarch64-unknown-linux-gnu/11/../../../../include/c++/11/backward
/home/build-user/build/bootstrap_stage0/llvm-linux-aarch64/lib/clang/17/include
/usr/local/include
/usr/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 478 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2
The difference is that on arm64 we are adding the prefix aarch64-unknown-linux-gnu
to the search paths which does not exist in the docker images
One approach is to symlink the directories from within the image to the directories being searched for with the gnu
suffix
$ ln -sf /usr/include/c++/11/aarch64-amazon-linux /usr/include/c++/11/aarch64-unknown-linux-gnu && \
mkdir -p /usr/lib/gcc/aarch64-unknown-linux-gnu && \
ln -sf /usr/lib/gcc/aarch64-amazon-linux/11 /usr/lib/gcc/aarch64-unknown-linux-gnu/11 && \
ln -sf /usr/lib64 /usr/lib/aarch64-unknown-linux-gnu
But this does not seem right. Instead we should fix the search paths clang searches for to be correct on arm64
Reproduction
- Clone swift-docker
- Build the image on an aarch64 machine
cd swift-docker && docker build -t 2023-amazon-aarch64 -f ./swift-ci/main/amazon-linux/2023/Bootstrap/Dockerfile .
- Run the image and build within the container
docker run -it --rm --name test-swift-bootstrap-amazonlinux-2023-aarch64 -m 32G --cpus 14 -e TOOLCHAIN_VERSION -e OS_VERSION -e ARCHIVE -e SWIFT_SOURCE_ROOT -e GIT_ALLOW_PROTOCOL -w /home/build-user/ -v <swift-project>:/source 2023-amazon-aarch64
$ cp -r /source/* /home/build-user
$ ./swift/utils/build-script --preset bootstrap_stage0 build_subdir=bootstrap_stage0 install_destdir=/home/build-user/stages/stage0
Expected behavior
Expect it to build OK
Environment
Swift toolchain version: swift-DEVELOPMENT-SNAPSHOT-2025-09-10-a
Additional information
No response