llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-driver Author: Frederik Harwath (frederik-h) <details> <summary>Changes</summary> This patch reapplies https://github.com/llvm/llvm-project/pull/145056. The test in the original PR did not specify a target in the clang RUN line and used a wrong way of piping to FileCheck. --- Patch is 40.77 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/154487.diff 37 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+16) - (modified) clang/include/clang/Basic/DiagnosticDriverKinds.td (+5) - (modified) clang/include/clang/Driver/ToolChain.h (+3-3) - (modified) clang/lib/Driver/ToolChain.cpp (+8-7) - (modified) clang/lib/Driver/ToolChains/Gnu.cpp (+158-63) - (modified) clang/lib/Driver/ToolChains/Gnu.h (+83-15) - (modified) clang/lib/Driver/ToolChains/Hurd.cpp (+8-6) - (modified) clang/lib/Driver/ToolChains/Linux.cpp (+9-9) - (modified) clang/lib/Driver/ToolChains/Managarm.cpp (+1-3) - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/10/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/10/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/10/include/c++/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/11/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/11/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/11/include/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/12/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/12/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc10/usr/lib/gcc/x86_64-linux-gnu/12/include/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/10/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/10/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/10/include/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/11/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/11/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/11/include/c++/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/12/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/12/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc11/usr/lib/gcc/x86_64-linux-gnu/12/include/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/10/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/10/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/10/include/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/11/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/11/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/11/include/c++/.keep () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/12/crtbegin.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/12/crtend.o () - (added) clang/test/Driver/Inputs/gcc_toolchain_libstdcxx/gcc12/usr/lib/gcc/x86_64-linux-gnu/12/include/c++/.keep () - (added) clang/test/Driver/gcc-toolchain-libstdcxx.cpp (+28) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index eed26c00641a2..3e0aa7c44f0c0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -37,6 +37,22 @@ latest release, please see the `Clang Web Site <https://clang.llvm.org>`_ or the Potentially Breaking Changes ============================ +- Clang will now emit a warning if the auto-detected GCC installation + directory (i.e. the one with the largest version number) does not + contain libstdc++ include directories although a "complete" GCC + installation directory containing the include directories is + available. It is planned to change the auto-detection to prefer the + "complete" directory in the future. The warning will disappear if + the libstdc++ include directories are either installed or removed + for all GCC installation directories considered by the + auto-detection; see the output of ``clang -v`` for a list of those + directories. If the GCC installations cannot be modified and + maintaining the current choice of the auto-detection is desired, the + GCC installation directory can be selected explicitly using the + ``--gcc-install-dir`` command line argument. This will silence the + warning. It can also be disabled using the + ``-Wno-gcc-install-dir-libstdcxx`` command line flag. + C/C++ Language Potentially Breaking Changes ------------------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 6df8f9932f30f..b8c7c6e8d6909 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -885,4 +885,9 @@ def warn_drv_openacc_without_cir : Warning<"OpenACC directives will result in no runtime behavior; use " "-fclangir to enable runtime effect">, InGroup<SourceUsesOpenACC>; + +def warn_drv_gcc_install_dir_libstdcxx : Warning< + "future releases of the clang compiler will prefer GCC installations " + "containing libstdc++ include directories; '%0' would be chosen over '%1'">, + InGroup<DiagGroup<"gcc-install-dir-libstdcxx">>; } diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 243056360370f..1425714d34110 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -224,9 +224,6 @@ class ToolChain { static void addSystemFrameworkInclude(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const Twine &Path); - static void addSystemInclude(const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args, - const Twine &Path); static void addExternCSystemInclude(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const Twine &Path); @@ -246,6 +243,9 @@ class ToolChain { ///@} public: + static void addSystemInclude(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + const Twine &Path); virtual ~ToolChain(); // Accessors diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 7667dbddb0ca2..65b36217a940f 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1409,13 +1409,6 @@ void ToolChain::addSystemFrameworkInclude(const llvm::opt::ArgList &DriverArgs, CC1Args.push_back(DriverArgs.MakeArgString(Path)); } -/// Utility function to add a system include directory to CC1 arguments. -void ToolChain::addSystemInclude(const ArgList &DriverArgs, - ArgStringList &CC1Args, const Twine &Path) { - CC1Args.push_back("-internal-isystem"); - CC1Args.push_back(DriverArgs.MakeArgString(Path)); -} - /// Utility function to add a system include directory with extern "C" /// semantics to CC1 arguments. /// @@ -1438,6 +1431,14 @@ void ToolChain::addExternCSystemIncludeIfExists(const ArgList &DriverArgs, addExternCSystemInclude(DriverArgs, CC1Args, Path); } +/// Utility function to add a system include directory to CC1 arguments. +/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs, + ArgStringList &CC1Args, + const Twine &Path) { + CC1Args.push_back("-internal-isystem"); + CC1Args.push_back(DriverArgs.MakeArgString(Path)); +} + /// Utility function to add a list of system framework directories to CC1. void ToolChain::addSystemFrameworkIncludes(const ArgList &DriverArgs, ArgStringList &CC1Args, diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 01b146db24f3e..3dade2bdf2277 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2123,10 +2123,11 @@ void Generic_GCC::GCCInstallationDetector::init( StringRef TripleText = llvm::sys::path::filename(llvm::sys::path::parent_path(InstallDir)); - Version = GCCVersion::Parse(VersionText); - GCCTriple.setTriple(TripleText); - GCCInstallPath = std::string(InstallDir); - GCCParentLibPath = GCCInstallPath + "/../../.."; + SelectedInstallation.Version = GCCVersion::Parse(VersionText); + SelectedInstallation.GCCTriple.setTriple(TripleText); + SelectedInstallation.GCCInstallPath = std::string(InstallDir); + SelectedInstallation.GCCParentLibPath = + SelectedInstallation.GCCInstallPath + "/../../.."; IsValid = true; } return; @@ -2186,7 +2187,7 @@ void Generic_GCC::GCCInstallationDetector::init( // Loop over the various components which exist and select the best GCC // installation available. GCC installs are ranked by version number. const GCCVersion VersionZero = GCCVersion::Parse("0.0.0"); - Version = VersionZero; + SelectedInstallation.Version = VersionZero; for (const std::string &Prefix : Prefixes) { auto &VFS = D.getVFS(); if (!VFS.exists(Prefix)) @@ -2214,7 +2215,7 @@ void Generic_GCC::GCCInstallationDetector::init( } // Skip other prefixes once a GCC installation is found. - if (Version > VersionZero) + if (SelectedInstallation.Version > VersionZero) break; } } @@ -2223,14 +2224,17 @@ void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const { for (const auto &InstallPath : CandidateGCCInstallPaths) OS << "Found candidate GCC installation: " << InstallPath << "\n"; - if (!GCCInstallPath.empty()) - OS << "Selected GCC installation: " << GCCInstallPath << "\n"; + if (!SelectedInstallation.GCCInstallPath.empty()) + OS << "Selected GCC installation: " << SelectedInstallation.GCCInstallPath + << "\n"; for (const auto &Multilib : Multilibs) OS << "Candidate multilib: " << Multilib << "\n"; - if (Multilibs.size() != 0 || !SelectedMultilib.isDefault()) - OS << "Selected multilib: " << SelectedMultilib << "\n"; + if (Multilibs.size() != 0 || + !SelectedInstallation.SelectedMultilib.isDefault()) + OS << "Selected multilib: " << SelectedInstallation.SelectedMultilib + << "\n"; } bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { @@ -2768,14 +2772,50 @@ bool Generic_GCC::GCCInstallationDetector::ScanGCCForMultilibs( } Multilibs = Detected.Multilibs; - SelectedMultilib = Detected.SelectedMultilibs.empty() - ? Multilib() - : Detected.SelectedMultilibs.back(); + SelectedInstallation.SelectedMultilib = + Detected.SelectedMultilibs.empty() ? Multilib() + : Detected.SelectedMultilibs.back(); BiarchSibling = Detected.BiarchSibling; return true; } +bool Generic_GCC::GCCInstallationDetector::SelectGCCInstallationDirectory( + const SmallVector<Generic_GCC::GCCInstallCandidate, 3> &Installations, + const ArgList &Args, + Generic_GCC::GCCInstallCandidate &SelectedInstallation) const { + if (Installations.empty()) + return false; + + SelectedInstallation = + *max_element(Installations, [](const auto &Max, const auto &I) { + return I.Version > Max.Version; + }); + + // FIXME Start selecting installation with libstdc++ in clang 22, + // using the current way of selecting the installation as a fallback + // only. For now, warn if the installation with libstdc++ differs + // from SelectedInstallation. + const GCCInstallCandidate *InstallWithIncludes = nullptr; + for (const auto &I : Installations) { + if ((!InstallWithIncludes || I.Version > InstallWithIncludes->Version) && + GCCInstallationHasLibStdcxxIncludePaths(I, Args)) + InstallWithIncludes = &I; + } + + if (InstallWithIncludes && SelectedInstallation.GCCInstallPath != + InstallWithIncludes->GCCInstallPath) + D.Diag(diag::warn_drv_gcc_install_dir_libstdcxx) + << InstallWithIncludes->GCCInstallPath + << SelectedInstallation.GCCInstallPath; + + // TODO Warn if SelectedInstallation does not contain libstdc++ includes + // although compiler flags indicate that it is required (C++ compilation, + // libstdc++ not explicitly disabled). + + return true; +} + void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( const llvm::Triple &TargetTriple, const ArgList &Args, const std::string &LibDir, StringRef CandidateTriple, @@ -2805,6 +2845,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( TargetTriple.getVendor() == llvm::Triple::Freescale || TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}}; + SmallVector<GCCInstallCandidate, 3> Installations; for (auto &Suffix : Suffixes) { if (!Suffix.Active) continue; @@ -2822,23 +2863,31 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( continue; // Saw this path before; no need to look at it again. if (CandidateVersion.isOlderThan(4, 1, 1)) continue; - if (CandidateVersion <= Version) + if (CandidateVersion <= SelectedInstallation.Version && IsValid) continue; if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(), NeedsBiarchSuffix)) continue; - Version = CandidateVersion; - GCCTriple.setTriple(CandidateTriple); + GCCInstallCandidate Installation; + Installation.Version = CandidateVersion; + Installation.GCCTriple.setTriple(CandidateTriple); // FIXME: We hack together the directory name here instead of // using LI to ensure stable path separators across Windows and // Linux. - GCCInstallPath = (LibDir + "/" + LibSuffix + "/" + VersionText).str(); - GCCParentLibPath = (GCCInstallPath + "/../" + Suffix.ReversePath).str(); - IsValid = true; + Installation.GCCInstallPath = + (LibDir + "/" + LibSuffix + "/" + VersionText).str(); + Installation.GCCParentLibPath = + (Installation.GCCInstallPath + "/../" + Suffix.ReversePath).str(); + Installation.SelectedMultilib = getMultilib(); + + Installations.push_back(Installation); } } + + IsValid |= + SelectGCCInstallationDirectory(Installations, Args, SelectedInstallation); } bool Generic_GCC::GCCInstallationDetector::ScanGentooConfigs( @@ -2916,10 +2965,12 @@ bool Generic_GCC::GCCInstallationDetector::ScanGentooGccConfig( NeedsBiarchSuffix)) continue; - Version = GCCVersion::Parse(ActiveVersion.second); - GCCInstallPath = GentooPath; - GCCParentLibPath = GentooPath + std::string("/../../.."); - GCCTriple.setTriple(ActiveVersion.first); + SelectedInstallation.Version = + GCCVersion::Parse(ActiveVersion.second); + SelectedInstallation.GCCInstallPath = GentooPath; + SelectedInstallation.GCCParentLibPath = + GentooPath + std::string("/../../.."); + SelectedInstallation.GCCTriple.setTriple(ActiveVersion.first); IsValid = true; return true; } @@ -3122,8 +3173,9 @@ void Generic_GCC::AddMultilibIncludeArgs(const ArgList &DriverArgs, // gcc TOOL_INCLUDE_DIR. const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); std::string LibPath(GCCInstallation.getParentLibPath()); - addSystemInclude(DriverArgs, CC1Args, - Twine(LibPath) + "/../" + GCCTriple.str() + "/include"); + ToolChain::addSystemInclude(DriverArgs, CC1Args, + Twine(LibPath) + "/../" + GCCTriple.str() + + "/include"); const auto &Callback = Multilibs.includeDirsCallback(); if (Callback) { @@ -3210,12 +3262,14 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, return; } -bool Generic_GCC::addLibStdCXXIncludePaths(Twine IncludeDir, StringRef Triple, - Twine IncludeSuffix, - const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args, - bool DetectDebian) const { - if (!getVFS().exists(IncludeDir)) +static bool addLibStdCXXIncludePaths(llvm::vfs::FileSystem &vfs, + Twine IncludeDir, StringRef Triple, + Twine IncludeSuffix, + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + bool DetectDebian = false) { + + if (!vfs.exists(IncludeDir)) return false; // Debian native gcc uses g++-multiarch-incdir.diff which uses @@ -3227,39 +3281,48 @@ bool Generic_GCC::addLibStdCXXIncludePaths(Twine IncludeDir, StringRef Triple, std::string Path = (Include + "/" + Triple + Dir.substr(Include.size()) + IncludeSuffix) .str(); - if (DetectDebian && !getVFS().exists(Path)) + if (DetectDebian && !vfs.exists(Path)) return false; // GPLUSPLUS_INCLUDE_DIR - addSystemInclude(DriverArgs, CC1Args, IncludeDir); + ToolChain::addSystemInclude(DriverArgs, CC1Args, IncludeDir); // GPLUSPLUS_TOOL_INCLUDE_DIR. If Triple is not empty, add a target-dependent // include directory. if (DetectDebian) - addSystemInclude(DriverArgs, CC1Args, Path); + ToolChain::addSystemInclude(DriverArgs, CC1Args, Path); else if (!Triple.empty()) - addSystemInclude(DriverArgs, CC1Args, - IncludeDir + "/" + Triple + IncludeSuffix); + ToolChain::addSystemInclude(DriverArgs, CC1Args, + IncludeDir + "/" + Triple + IncludeSuffix); // GPLUSPLUS_BACKWARD_INCLUDE_DIR - addSystemInclude(DriverArgs, CC1Args, IncludeDir + "/backward"); + ToolChain::addSystemInclude(DriverArgs, CC1Args, IncludeDir + "/backward"); return true; } -bool Generic_GCC::addGCCLibStdCxxIncludePaths( - const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, - StringRef DebianMultiarch) const { - assert(GCCInstallation.isValid()); +bool Generic_GCC::addLibStdCXXIncludePaths(Twine IncludeDir, StringRef Triple, + Twine IncludeSuffix, + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + bool DetectDebian) const { + return ::addLibStdCXXIncludePaths(getVFS(), IncludeDir, Triple, IncludeSuffix, + DriverArgs, CC1Args, DetectDebian); +} + +bool Generic_GCC::GCCInstallCandidate::addGCCLibStdCxxIncludePaths( + llvm::vfs::FileSystem &vfs, const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, StringRef DebianMultiarch) const { // By default, look for the C++ headers in an include directory adjacent to // the lib directory of the GCC installation. Note that this is expect to be // equivalent to '/usr/include/c++/X.Y' in almost all cases. - StringRef LibDir = GCCInstallation.getParentLibPath(); - StringRef InstallDir = GCCInstallation.getInstallPath(); - StringRef TripleStr = GCCInstallation.getTriple().str(); - const Multilib &Multilib = GCCInstallation.getMultilib(); - const GCCVersion &Version = GCCInstallation.getVersion(); + StringRef LibDir = getParentLibPath(); + StringRef InstallDir = getInstallPath(); + StringRef TripleStr = getTriple().str(); + const Multilib &Multilib = getMultilib(); + const GCCVersion &Version = getVersion(); // Try /../$triple/include/c++/$version (gcc --print-multiarch is not empty). - if (addLibStdCXXIncludePaths( + if (::addLibStdCXXIncludePaths( + vfs, LibDir.str() + "/../" + TripleStr + "/include/c++/" + Version.Text, TripleStr, Multilib.includeSuffix(), DriverArgs, CC1Args)) return true; @@ -3267,22 +3330,24 @@ bool Generic_GCC::addGCCLibStdCxxIncludePaths( // Try /gcc/$triple/$version/include/c++/ (gcc --print-multiarch is not // empty). Like above but for GCC built with // --enable-version-specific-runtime-libs. - if (addLibStdCXXIncludePaths(LibDir.str() + "/gcc/" + TripleStr + "/" + - Version.Text + "/include/c++/", - TripleStr, Multilib.includeSuffix(), DriverArgs, - CC1Args)) + if (::addLibStdCXXIncludePaths(vfs, + LibDir.str() + "/gcc/" + TripleStr + "/" + + Version.Text + "/include/c++/", + TripleStr, Multilib.includeSuffix(), + DriverArgs, CC1Args)) return true; // Detect Debian g++-multiarch-incdir.diff. - if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text, - DebianMultiarch, Multilib.includeSuffix(), - DriverArgs, CC1Args, /*Debian=*/true)) + if (::addLibStdCXXIncludePaths( + vfs, LibDir.str() + "/../include/c++/" + Version.Text, + DebianMultiarch, Multilib.includeSuffix(), DriverArgs, CC1Args, + /*Debian=*/true)) return true; // Try /../include/c++/$version (gcc --print-multiarch is empty). - if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text, - TripleStr, Multilib.includeSuffix(), DriverArgs, - CC1Args)) + if (::addLibStdCXXIncludePaths( + vfs, LibDir.str() + "/../include/c++/" + Version.Text, TripleStr, + Multilib.includeSuffix(), DriverArgs, CC1Args)) return true; // Otherwise, fall back on a bunch of options which don't use multiarch @@ -3297,20 +3362,50 @@ bool Generic_GCC::addGCCLibStdCxxIncludePaths( }; for (const auto &IncludePath : LibStdCXXIncludePathCandidates) { - if (addLibStdCXXIncludePaths(IncludePath, TripleStr, - Multilib.includeSuffix(), DriverArgs, CC1Args)) + if (::addLibStdCXXIncludePaths(vfs, IncludePath, TripleStr, + Multilib.includeSuffix(), DriverArgs, + CC1Args)) return true; } return false; } +bool Generic_GCC::GCCInstallationDetector:: + GCCInstallationHasLibStdcxxIncludePaths( + const GCCInstallCandidate &GCCInstallation, + const llvm::opt::ArgList &DriverArgs) const { + StringRef DebianMultiarch = + TripleToDebianMultiarch(GCCInstallation.getTriple()); + + // The following function checks for libstdc++ include paths and + // adds them to the provided argument list. Here we just need the + // check. + llvm::opt::ArgStringList dummyCC1Args; + return GCCInstallation.addGCCLibStdCxxIncludePaths( + D.getVFS(), DriverArgs, dummyCC1Args, DebianMultiarch); +} + +bool Generic_GCC::addGCCLibStdCxxIncludePaths( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1A... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/154487 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits