[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
This commit is contained in:
Petr Hosek 2021-04-28 11:23:54 -07:00
parent fc01b9bdf8
commit b604301be3
7 changed files with 42 additions and 1 deletions

View File

@ -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,

View File

@ -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"