Author: eugenis Date: Mon Nov 9 15:10:54 2015 New Revision: 252514 URL: http://llvm.org/viewvc/llvm-project?rev=252514&view=rev Log: Extend linux header search to find libc++ headers in c++/vN for any N.
Added: cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/bin/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/bin/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v1/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v1/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v2/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v2/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/lib/ cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/lib/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/bin/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/bin/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/4.8/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/4.8/backward/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/4.8/backward/.keep (with props) cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v1/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v1/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v2/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v2/.keep cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/lib/ cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/lib/.keep Modified: cfe/trunk/lib/Driver/ToolChains.cpp cfe/trunk/test/Driver/linux-header-search.cpp Modified: cfe/trunk/lib/Driver/ToolChains.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=252514&r1=252513&r2=252514&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Nov 9 15:10:54 2015 @@ -3849,6 +3849,25 @@ void Linux::AddClangSystemIncludeArgs(co } +static std::string DetectLibcxxIncludePath(StringRef base) { + std::error_code EC; + int MaxVersion = 0; + std::string MaxVersionString = ""; + for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE; + LI = LI.increment(EC)) { + StringRef VersionText = llvm::sys::path::filename(LI->path()); + int Version; + if (VersionText[0] == 'v' && + !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) { + if (Version > MaxVersion) { + MaxVersion = Version; + MaxVersionString = VersionText; + } + } + } + return MaxVersion ? (base + "/" + MaxVersionString).str() : ""; +} + void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (DriverArgs.hasArg(options::OPT_nostdlibinc) || @@ -3858,17 +3877,14 @@ void Linux::AddClangCXXStdlibIncludeArgs // Check if libc++ has been enabled and provide its include paths if so. if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) { const std::string LibCXXIncludePathCandidates[] = { - // The primary location is within the Clang installation. - // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to - // newer ABI versions. - getDriver().Dir + "/../include/c++/v1", + DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"), // We also check the system as for a long time this is the only place // Clang looked. // FIXME: We should really remove this. It doesn't make any sense. - getDriver().SysRoot + "/usr/include/c++/v1"}; + DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")}; for (const auto &IncludePath : LibCXXIncludePathCandidates) { - if (!getVFS().exists(IncludePath)) + if (IncludePath.empty() || !getVFS().exists(IncludePath)) continue; // Add the first candidate that exists. addSystemInclude(DriverArgs, CC1Args, IncludePath); Added: cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/bin/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/bin/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v1/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c%2B%2B/v1/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c++/v2/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/include/c%2B%2B/v2/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/lib/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libcxxv2_tree/usr/lib/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/bin/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/bin/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/4.8/backward/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c%2B%2B/4.8/backward/.keep?rev=252514&view=auto ============================================================================== (empty) Propchange: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/4.8/backward/.keep ------------------------------------------------------------------------------ svn:executable = * Added: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v1/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c%2B%2B/v1/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c++/v2/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/include/c%2B%2B/v2/.keep?rev=252514&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/lib/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr/lib/.keep?rev=252514&view=auto ============================================================================== (empty) Modified: cfe/trunk/test/Driver/linux-header-search.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-header-search.cpp?rev=252514&r1=252513&r2=252514&view=diff ============================================================================== --- cfe/trunk/test/Driver/linux-header-search.cpp (original) +++ cfe/trunk/test/Driver/linux-header-search.cpp Mon Nov 9 15:10:54 2015 @@ -26,6 +26,42 @@ // CHECK-BASIC-LIBCXX-INSTALL: "-internal-isystem" "[[SYSROOT]]/usr/bin/../include/c++/v1" // CHECK-BASIC-LIBCXX-INSTALL: "-internal-isystem" "[[SYSROOT]]/usr/local/include" // +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-unknown-linux-gnu \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxxv2_tree \ +// RUN: --gcc-toolchain="" \ +// RUN: | FileCheck --check-prefix=CHECK-BASIC-LIBCXXV2-SYSROOT %s +// CHECK-BASIC-LIBCXXV2-SYSROOT: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBCXXV2-SYSROOT: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-BASIC-LIBCXXV2-SYSROOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v2" +// CHECK-BASIC-LIBCXXV2-SYSROOT: "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-unknown-linux-gnu \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_linux_libcxxv2_tree/usr/bin \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxxv2_tree \ +// RUN: --gcc-toolchain="" \ +// RUN: | FileCheck --check-prefix=CHECK-BASIC-LIBCXXV2-INSTALL %s +// CHECK-BASIC-LIBCXXV2-INSTALL: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBCXXV2-INSTALL: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-BASIC-LIBCXXV2-INSTALL: "-internal-isystem" "[[SYSROOT]]/usr/bin/../include/c++/v2" +// CHECK-BASIC-LIBCXXV2-INSTALL: "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// +// Test Linux with both libc++ and libstdc++ installed. +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-unknown-linux-gnu \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \ +// RUN: --sysroot=%S/Inputs/basic_linux_libstdcxx_libcxxv2_tree \ +// RUN: --gcc-toolchain="" \ +// RUN: | FileCheck --check-prefix=CHECK-BASIC-LIBSTDCXX-LIBCXXV2-SYSROOT %s +// CHECK-BASIC-LIBSTDCXX-LIBCXXV2-SYSROOT: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBSTDCXX-LIBCXXV2-SYSROOT: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-BASIC-LIBSTDCXX-LIBCXXV2-SYSROOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v2" +// CHECK-BASIC-LIBSTDCXX-LIBCXXV2-SYSROOT: "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// // Test a very broken version of multiarch that shipped in Ubuntu 11.04. // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ // RUN: -target i386-unknown-linux \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits