mstorsjo updated this revision to Diff 488182. mstorsjo added a comment. Updated with some testcases. This does test that the include directory is omitted when cross compiling, but those kinds of tests, which set up a simulated toolchain environment with symlinks, don't run on actual Windows - so it's not quite as easy to test the case that we actually do keep the unprefixed include directory on Windows. As this matches the current testing coverage status quo, I hope this is ok...
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D141206/new/ https://reviews.llvm.org/D141206 Files: clang/lib/Driver/ToolChains/MinGW.cpp clang/test/Driver/mingw-sysroot.cpp Index: clang/test/Driver/mingw-sysroot.cpp =================================================================== --- clang/test/Driver/mingw-sysroot.cpp +++ clang/test/Driver/mingw-sysroot.cpp @@ -31,6 +31,18 @@ // CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10" // CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include" +// This test is only executed on non-Windows systems, i.e. only when +// cross compiling. Check that we don't add the tool root's plain include +// directory to the path - this would end up including /usr/include for +// cross toolchains installed in /usr. +// CHECK_TESTROOT_GCC-NOT: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}include" + +// If we pass --sysroot explicitly, then we do include <sysroot>/include +// even when cross compiling. +// RUN: %clang -target x86_64-w64-mingw32 -rtlib=platform -stdlib=libstdc++ --sysroot="%T/testroot-gcc" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_GCC_EXPLICIT %s + +// CHECK_TESTROOT_GCC_EXPLICIT: "-internal-isystem" "{{[^"]+}}/testroot-gcc{{/|\\\\}}include" + // If there's a matching sysroot next to the clang binary itself, prefer that // over a gcc in the path: Index: clang/lib/Driver/ToolChains/MinGW.cpp =================================================================== --- clang/lib/Driver/ToolChains/MinGW.cpp +++ clang/lib/Driver/ToolChains/MinGW.cpp @@ -348,6 +348,15 @@ Exec, CmdArgs, Inputs, Output)); } +static bool isCrossCompiling(const llvm::Triple &T, bool RequireArchMatch) { + llvm::Triple HostTriple(llvm::Triple::normalize(LLVM_HOST_TRIPLE)); + if (HostTriple.getOS() != llvm::Triple::Win32) + return true; + if (RequireArchMatch && HostTriple.getArch() != T.getArch()) + return true; + return false; +} + // Simplified from Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple. static bool findGccVersion(StringRef LibDir, std::string &GccLibDir, std::string &Ver, @@ -487,7 +496,13 @@ getFilePaths().push_back( (Base + SubdirName + llvm::sys::path::get_separator() + "mingw/lib").str()); - getFilePaths().push_back(Base + "lib"); + // Only include <base>/lib if we're not cross compiling (not even for + // windows->windows to a different arch), or if the sysroot has been set + // (where we presume the user has pointed it at an arch specific + // subdirectory). + if (!::isCrossCompiling(getTriple(), /*RequireArchMatch=*/true) || + getDriver().SysRoot.size()) + getFilePaths().push_back(Base + "lib"); NativeLLVMSupport = Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER) @@ -649,7 +664,13 @@ addSystemInclude(DriverArgs, CC1Args, Base + SubdirName + llvm::sys::path::get_separator() + "usr/include"); - addSystemInclude(DriverArgs, CC1Args, Base + "include"); + // Only include <base>/include if we're not cross compiling (but do allow it + // if we're on Windows and building for Windows on another architecture), + // or if the sysroot has been set (where we presume the user has pointed it + // at an arch specific subdirectory). + if (!::isCrossCompiling(getTriple(), /*RequireArchMatch=*/false) || + getDriver().SysRoot.size()) + addSystemInclude(DriverArgs, CC1Args, Base + "include"); } void toolchains::MinGW::addClangTargetOptions(
Index: clang/test/Driver/mingw-sysroot.cpp =================================================================== --- clang/test/Driver/mingw-sysroot.cpp +++ clang/test/Driver/mingw-sysroot.cpp @@ -31,6 +31,18 @@ // CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10" // CHECK_TESTROOT_GCC: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include" +// This test is only executed on non-Windows systems, i.e. only when +// cross compiling. Check that we don't add the tool root's plain include +// directory to the path - this would end up including /usr/include for +// cross toolchains installed in /usr. +// CHECK_TESTROOT_GCC-NOT: "-internal-isystem" "[[BASE]]/testroot-gcc{{/|\\\\}}include" + +// If we pass --sysroot explicitly, then we do include <sysroot>/include +// even when cross compiling. +// RUN: %clang -target x86_64-w64-mingw32 -rtlib=platform -stdlib=libstdc++ --sysroot="%T/testroot-gcc" -c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_GCC_EXPLICIT %s + +// CHECK_TESTROOT_GCC_EXPLICIT: "-internal-isystem" "{{[^"]+}}/testroot-gcc{{/|\\\\}}include" + // If there's a matching sysroot next to the clang binary itself, prefer that // over a gcc in the path: Index: clang/lib/Driver/ToolChains/MinGW.cpp =================================================================== --- clang/lib/Driver/ToolChains/MinGW.cpp +++ clang/lib/Driver/ToolChains/MinGW.cpp @@ -348,6 +348,15 @@ Exec, CmdArgs, Inputs, Output)); } +static bool isCrossCompiling(const llvm::Triple &T, bool RequireArchMatch) { + llvm::Triple HostTriple(llvm::Triple::normalize(LLVM_HOST_TRIPLE)); + if (HostTriple.getOS() != llvm::Triple::Win32) + return true; + if (RequireArchMatch && HostTriple.getArch() != T.getArch()) + return true; + return false; +} + // Simplified from Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple. static bool findGccVersion(StringRef LibDir, std::string &GccLibDir, std::string &Ver, @@ -487,7 +496,13 @@ getFilePaths().push_back( (Base + SubdirName + llvm::sys::path::get_separator() + "mingw/lib").str()); - getFilePaths().push_back(Base + "lib"); + // Only include <base>/lib if we're not cross compiling (not even for + // windows->windows to a different arch), or if the sysroot has been set + // (where we presume the user has pointed it at an arch specific + // subdirectory). + if (!::isCrossCompiling(getTriple(), /*RequireArchMatch=*/true) || + getDriver().SysRoot.size()) + getFilePaths().push_back(Base + "lib"); NativeLLVMSupport = Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER) @@ -649,7 +664,13 @@ addSystemInclude(DriverArgs, CC1Args, Base + SubdirName + llvm::sys::path::get_separator() + "usr/include"); - addSystemInclude(DriverArgs, CC1Args, Base + "include"); + // Only include <base>/include if we're not cross compiling (but do allow it + // if we're on Windows and building for Windows on another architecture), + // or if the sysroot has been set (where we presume the user has pointed it + // at an arch specific subdirectory). + if (!::isCrossCompiling(getTriple(), /*RequireArchMatch=*/false) || + getDriver().SysRoot.size()) + addSystemInclude(DriverArgs, CC1Args, Base + "include"); } void toolchains::MinGW::addClangTargetOptions(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits