Author: Petr Hosek Date: 2021-05-22T13:32:23-07:00 New Revision: b604301be3559fb85a11779db79fc9bda4b62bce
URL: https://github.com/llvm/llvm-project/commit/b604301be3559fb85a11779db79fc9bda4b62bce DIFF: https://github.com/llvm/llvm-project/commit/b604301be3559fb85a11779db79fc9bda4b62bce.diff LOG: [Driver] Support libc++ in MSVC This implements support for using libc++ headers and library in the MSVC toolchain. We only support libc++ that is a part of the toolchain, and not headers installed elsewhere on the system. Differential Revision: https://reviews.llvm.org/D101479 Added: clang/test/Driver/Inputs/msvc_libcxx_tree/usr/bin/.keep clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/c++/v1/.keep clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/x86_64-pc-windows-msvc/c++/v1/.keep clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/.keep clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/x86_64-pc-windows-msvc/.keep clang/test/Driver/msvc-libcxx.cpp Modified: clang/lib/Driver/ToolChains/MSVC.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 2fddbd6829fad..1acd5f4dcf6c2 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -435,6 +435,11 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L)) for (const auto &LibPath : Args.getAllArgValues(options::OPT_L)) CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath)); + // Add library directories for standard library shipped with the toolchain. + for (const auto &LibPath : TC.getFilePaths()) { + if (TC.getVFS().exists(LibPath)) + CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath)); + } CmdArgs.push_back("-nologo"); @@ -1323,7 +1328,36 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - // FIXME: There should probably be logic here to find libc++ on Windows. + if (DriverArgs.hasArg(options::OPT_nostdlibinc) || + DriverArgs.hasArg(options::OPT_nostdincxx)) + return; + + switch (GetCXXStdlibType(DriverArgs)) { + case ToolChain::CST_Libcxx: { + SmallString<128> P(getDriver().Dir); + llvm::sys::path::append(P, "..", "include"); + + std::string Version = detectLibcxxVersion(P); + if (Version.empty()) + return; + + // First add the per-target include path if it exists. + SmallString<128> TargetDir(P); + llvm::sys::path::append(TargetDir, getTripleString(), "c++", Version); + if (getVFS().exists(TargetDir)) + addSystemInclude(DriverArgs, CC1Args, TargetDir); + + // Second add the generic one. + SmallString<128> Dir(P); + llvm::sys::path::append(Dir, "c++", Version); + addSystemInclude(DriverArgs, CC1Args, Dir); + break; + } + + default: + // TODO: Shall we report an error for other C++ standard libraries? + break; + } } VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D, diff --git a/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/bin/.keep b/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/bin/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/c++/v1/.keep b/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/c++/v1/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/x86_64-pc-windows-msvc/c++/v1/.keep b/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/include/x86_64-pc-windows-msvc/c++/v1/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/.keep b/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/x86_64-pc-windows-msvc/.keep b/clang/test/Driver/Inputs/msvc_libcxx_tree/usr/lib/x86_64-pc-windows-msvc/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/msvc-libcxx.cpp b/clang/test/Driver/msvc-libcxx.cpp new file mode 100644 index 0000000000000..c209ec9aca24c --- /dev/null +++ b/clang/test/Driver/msvc-libcxx.cpp @@ -0,0 +1,7 @@ +// RUN: %clangxx -### %s 2>&1 -stdlib=libc++ -fuse-ld=lld \ +// RUN: --target=x86_64-pc-windows-msvc \ +// RUN: -ccc-install-dir %S/Inputs/msvc_libcxx_tree/usr/bin \ +// RUN: | FileCheck %s -check-prefix MSVC-LIBCXX +// MSVC-LIBCXX: "-internal-isystem" "{{.*[/\\]}}include{{/|\\\\}}x86_64-pc-windows-msvc{{/|\\\\}}c++{{/|\\\\}}v1" +// MSVC-LIBCXX: "-internal-isystem" "{{.*[/\\]}}include{{/|\\\\}}c++{{/|\\\\}}v1" +// MSVC-LIBCXX: "-libpath:{{.*}}{{/|\\\\}}..{{/|\\\\}}lib{{/|\\\\}}x86_64-pc-windows-msvc" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits