For x86, most contempory mingw toolchains use i686 as 32 bit x86 arch target. As long as the target triple is set to the right form, this works fine, either as the compiler's default target, or via e.g. a triple prefix like i686-w64-mingw32-clang. However, if the unprefixed toolchain targets x86_64, but the user tries to switch it to target 32 bit by adding the -m32 option, the computeTargetTriple function in Clang, together with Triple::get32BitArchVariant, sets the arch to i386. This causes the right sysroot to not be found. When targeting an arch where there are potential spelling ambiguities with respect to the sysroots (i386 and arm), check if the driver can find a sysroot with the arch name - if not, try a couple other candidates. Differential Revision: https://reviews.llvm.org/D111952
51 lines
3.3 KiB
C++
51 lines
3.3 KiB
C++
// REQUIRES: shell
|
|
// UNSUPPORTED: system-windows
|
|
|
|
// RUN: rm -rf %T/testroot-gcc
|
|
// RUN: mkdir -p %T/testroot-gcc/bin
|
|
// RUN: ln -s %clang %T/testroot-gcc/bin/x86_64-w64-mingw32-gcc
|
|
// RUN: ln -s %clang %T/testroot-gcc/bin/x86_64-w64-mingw32-clang
|
|
// RUN: ln -s %S/Inputs/mingw_ubuntu_posix_tree/usr/x86_64-w64-mingw32 %T/testroot-gcc/x86_64-w64-mingw32
|
|
// RUN: ln -s %S/Inputs/mingw_ubuntu_posix_tree/usr/lib %T/testroot-gcc/lib
|
|
|
|
// RUN: rm -rf %T/testroot-clang
|
|
// RUN: mkdir -p %T/testroot-clang/bin
|
|
// RUN: ln -s %clang %T/testroot-clang/bin/x86_64-w64-mingw32-clang
|
|
// RUN: ln -s %S/Inputs/mingw_ubuntu_posix_tree/usr/x86_64-w64-mingw32 %T/testroot-clang/x86_64-w64-mingw32
|
|
// RUN: ln -s %S/Inputs/mingw_arch_tree/usr/i686-w64-mingw32 %T/testroot-clang/i686-w64-mingw32
|
|
|
|
|
|
// If we find a gcc in the path with the right triplet prefix, pick that as
|
|
// sysroot:
|
|
|
|
// RUN: env "PATH=%T/testroot-gcc/bin:%PATH%" %clang -target x86_64-w64-mingw32 -rtlib=platform -stdlib=libstdc++ --sysroot="" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_GCC %s
|
|
// CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE:[^"]+]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
|
|
// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
|
|
// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
|
|
// CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
|
|
|
|
|
|
// If there's a matching sysroot next to the clang binary itself, prefer that
|
|
// over a gcc in the path:
|
|
|
|
// RUN: env "PATH=%T/testroot-gcc/bin:%PATH%" %T/testroot-clang/bin/x86_64-w64-mingw32-clang -target x86_64-w64-mingw32 -rtlib=compiler-rt -stdlib=libstdc++ --sysroot="" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_CLANG %s
|
|
// CHECK_TESTROOT_CLANG: "{{[^"]+}}/testroot-clang{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
|
|
|
|
|
|
// If we pick a root based on a sysroot next to the clang binary, which also
|
|
// happens to be in the same directory as gcc, make sure we still can pick up
|
|
// the libgcc directory:
|
|
|
|
// RUN: env "PATH=%T/testroot-gcc/bin:%PATH%" %T/testroot-gcc/bin/x86_64-w64-mingw32-clang -target x86_64-w64-mingw32 -rtlib=platform -stdlib=libstdc++ --sysroot="" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_GCC %s
|
|
|
|
|
|
// If the user requests a different arch via the -m32 option, which changes
|
|
// x86_64 into i386, check that the driver notices that it can't find a
|
|
// sysroot for i386 but there is one for i686, and uses that one.
|
|
// (In practice, the real usecase is when using an unprefixed native clang
|
|
// that defaults to x86_64 mingw, but it's easier to test this in cross setups
|
|
// with symlinks, like the other tests here.)
|
|
|
|
// RUN: env "PATH=%T/testroot-gcc/bin:%PATH%" %T/testroot-clang/bin/x86_64-w64-mingw32-clang --target=x86_64-w64-mingw32 -m32 -rtlib=compiler-rt -stdlib=libstdc++ --sysroot="" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_CLANG_I686 %s
|
|
// CHECK_TESTROOT_CLANG_I686: "{{[^"]+}}/testroot-clang{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include"
|