Skip to content

Commit 0bea332

Browse files
committed
Support --sysroot= for ${arch}-windows-msvc targets
I think it is possible to use the same rule for msvc targets with --target= and --sysroot= See Repository: https://github.com/trcrsired/windows-msvc-sysroot Add sysroot support for msvc MSVC.cpp needs getDriver before using D add stl in parser for -stdlib= Add Vcruntime to runtime list and unwind list MSVC add default runtime lib type and default unwind lib type add a msvc sysroot test use %S instead of /foo Fix test for msvc-sysroot Also add a pesudo implementation for WebAssembly and maybe Microsoft STL could be ported to more targets in the future Fix the toggle of wasm that prevents -stdlib=stl passed into Avoid clang-formatting in MSVC.cpp Add some comments to ToolChain avoid indent the if block Add back space before winsysroot line use instead of arch in the comment remove FIXME for libc++ since we have added the logic here Remove MSVC.h formatting Remove default cases in WebAssembly add back the empty line before the Sysroot line fix msvc-sysroot typo for libc++ loongarch
1 parent 95038a5 commit 0bea332

File tree

8 files changed

+279
-5
lines changed

8 files changed

+279
-5
lines changed

clang/include/clang/Driver/ToolChain.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,22 @@ class ToolChain {
9494
using path_list = SmallVector<std::string, 16>;
9595

9696
enum CXXStdlibType {
97-
CST_Libcxx,
98-
CST_Libstdcxx
97+
CST_Libcxx, // LLVM libc++
98+
CST_Libstdcxx, // GNU libstdc++
99+
CST_Stl, // MSVC STL
99100
};
100101

101102
enum RuntimeLibType {
102103
RLT_CompilerRT,
103-
RLT_Libgcc
104+
RLT_Libgcc,
105+
RLT_Vcruntime
104106
};
105107

106108
enum UnwindLibType {
107109
UNW_None,
108110
UNW_CompilerRT,
109-
UNW_Libgcc
111+
UNW_Libgcc,
112+
UNW_Vcruntime
110113
};
111114

112115
enum class UnwindTableLevel {

clang/lib/Driver/ToolChain.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,6 +1091,8 @@ ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
10911091
runtimeLibType = ToolChain::RLT_CompilerRT;
10921092
else if (LibName == "libgcc")
10931093
runtimeLibType = ToolChain::RLT_Libgcc;
1094+
else if (LibName == "vcruntime")
1095+
runtimeLibType = ToolChain::RLT_Vcruntime;
10941096
else if (LibName == "platform")
10951097
runtimeLibType = GetDefaultRuntimeLibType();
10961098
else {
@@ -1129,6 +1131,8 @@ ToolChain::UnwindLibType ToolChain::GetUnwindLibType(
11291131
unwindLibType = ToolChain::UNW_CompilerRT;
11301132
} else if (LibName == "libgcc")
11311133
unwindLibType = ToolChain::UNW_Libgcc;
1134+
else if (LibName == "vcruntime")
1135+
unwindLibType = ToolChain::UNW_Vcruntime;
11321136
else {
11331137
if (A)
11341138
getDriver().Diag(diag::err_drv_invalid_unwindlib_name)
@@ -1152,6 +1156,8 @@ ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
11521156
cxxStdlibType = ToolChain::CST_Libcxx;
11531157
else if (LibName == "libstdc++")
11541158
cxxStdlibType = ToolChain::CST_Libstdcxx;
1159+
else if (LibName == "stl")
1160+
cxxStdlibType = ToolChain::CST_Stl;
11551161
else if (LibName == "platform")
11561162
cxxStdlibType = GetDefaultCXXStdlibType();
11571163
else {
@@ -1290,6 +1296,10 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
12901296
case ToolChain::CST_Libstdcxx:
12911297
CmdArgs.push_back("-lstdc++");
12921298
break;
1299+
1300+
case ToolChain:CST_Stl:
1301+
// MSVC STL does not need to add -l
1302+
break;
12931303
}
12941304
}
12951305

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9090
CmdArgs.push_back("-defaultlib:oldnames");
9191
}
9292

93+
auto SysRoot = TC.getDriver().SysRoot;
94+
if (!SysRoot.empty()) {
95+
// If we have --sysroot, then we ignore all other setings
96+
// libpath is $SYSROOT/lib and $SYSROOT/lib/${ARCH}-unknown-windows-msvc
97+
const std::string MultiarchTriple =
98+
TC.getMultiarchTriple(TC.getDriver(), TC.getTriple(), SysRoot);
99+
std::string SysRootLib = "-libpath:" + SysRoot + "/lib";
100+
CmdArgs.push_back(Args.MakeArgString(SysRootLib + '/' + MultiarchTriple));
101+
CmdArgs.push_back(Args.MakeArgString(SysRootLib));
102+
} else {
93103
// If the VC environment hasn't been configured (perhaps because the user
94104
// did not run vcvarsall), try to build a consistent link environment. If
95105
// the environment variable is set however, assume the user knows what
@@ -133,6 +143,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
133143
CmdArgs.push_back(
134144
Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath));
135145
}
146+
}
136147

137148
if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
138149
for (const auto &LibPath : Args.getAllArgValues(options::OPT_L))
@@ -430,6 +441,12 @@ MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple,
430441
RocmInstallation(D, Triple, Args) {
431442
getProgramPaths().push_back(getDriver().Dir);
432443

444+
auto SysRoot = getDriver().SysRoot;
445+
if (!SysRoot.empty()) {
446+
// We have sysroot so we ignore all VCTools settings
447+
return;
448+
}
449+
433450
std::optional<llvm::StringRef> VCToolsDir, VCToolsVersion;
434451
if (Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsdir))
435452
VCToolsDir = A->getValue();
@@ -647,6 +664,17 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
647664
"include");
648665
}
649666

667+
auto SysRoot = getDriver().SysRoot;
668+
if (!SysRoot.empty()) {
669+
const Driver &D = getDriver();
670+
const std::string MultiarchTriple =
671+
getMultiarchTriple(D, getTriple(), SysRoot);
672+
addSystemInclude(DriverArgs, CC1Args,
673+
SysRoot + "/include/" + MultiarchTriple);
674+
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
675+
return;
676+
}
677+
650678
// Add %INCLUDE%-like directories from the -imsvc flag.
651679
for (const auto &Path : DriverArgs.getAllArgValues(options::OPT__SLASH_imsvc))
652680
addSystemInclude(DriverArgs, CC1Args, Path);
@@ -775,7 +803,22 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
775803

776804
void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
777805
ArgStringList &CC1Args) const {
778-
// FIXME: There should probably be logic here to find libc++ on Windows.
806+
if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
807+
options::OPT_nostdincxx))
808+
return;
809+
if (getDriver().SysRoot.empty())
810+
return;
811+
switch (GetCXXStdlibType(DriverArgs)) {
812+
case ToolChain::CST_Stl:
813+
addStlIncludePaths(DriverArgs, CC1Args);
814+
break;
815+
case ToolChain::CST_Libstdcxx:
816+
addLibStdCXXIncludePaths(DriverArgs, CC1Args);
817+
break;
818+
case ToolChain::CST_Libcxx:
819+
addLibCxxIncludePaths(DriverArgs, CC1Args);
820+
break;
821+
}
779822
}
780823

781824
VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D,
@@ -1027,3 +1070,86 @@ void MSVCToolChain::addClangTargetOptions(
10271070
if (Arg *A = DriverArgs.getLastArgNoClaim(options::OPT_marm64x))
10281071
A->ignoreTargetSpecific();
10291072
}
1073+
1074+
void MSVCToolChain::addStlIncludePaths(
1075+
const llvm::opt::ArgList &DriverArgs,
1076+
llvm::opt::ArgStringList &CC1Args) const {
1077+
const Driver &D = getDriver();
1078+
std::string SysRoot = computeSysRoot();
1079+
std::string LibPath = SysRoot + "/include";
1080+
const std::string MultiarchTriple =
1081+
getMultiarchTriple(D, getTriple(), SysRoot);
1082+
1083+
std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/stl";
1084+
addSystemInclude(DriverArgs, CC1Args, TargetDir);
1085+
1086+
// Second add the generic one.
1087+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/stl");
1088+
}
1089+
1090+
void MSVCToolChain::addLibCxxIncludePaths(
1091+
const llvm::opt::ArgList &DriverArgs,
1092+
llvm::opt::ArgStringList &CC1Args) const {
1093+
const Driver &D = getDriver();
1094+
std::string SysRoot = computeSysRoot();
1095+
std::string LibPath = SysRoot + "/include";
1096+
const std::string MultiarchTriple =
1097+
getMultiarchTriple(D, getTriple(), SysRoot);
1098+
1099+
std::string Version = detectLibcxxVersion(LibPath);
1100+
if (Version.empty())
1101+
return;
1102+
1103+
std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/" + Version;
1104+
addSystemInclude(DriverArgs, CC1Args, TargetDir);
1105+
1106+
// Second add the generic one.
1107+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
1108+
}
1109+
1110+
void MSVCToolChain::addLibStdCXXIncludePaths(
1111+
const llvm::opt::ArgList &DriverArgs,
1112+
llvm::opt::ArgStringList &CC1Args) const {
1113+
// We cannot use GCCInstallationDetector here as the sysroot usually does
1114+
// not contain a full GCC installation.
1115+
// Instead, we search the given sysroot for /usr/include/xx, similar
1116+
// to how we do it for libc++.
1117+
const Driver &D = getDriver();
1118+
std::string SysRoot = computeSysRoot();
1119+
std::string LibPath = SysRoot + "/include";
1120+
const std::string MultiarchTriple =
1121+
getMultiarchTriple(D, getTriple(), SysRoot);
1122+
1123+
// This is similar to detectLibcxxVersion()
1124+
std::string Version;
1125+
{
1126+
std::error_code EC;
1127+
Generic_GCC::GCCVersion MaxVersion =
1128+
Generic_GCC::GCCVersion::Parse("0.0.0");
1129+
SmallString<128> Path(LibPath);
1130+
llvm::sys::path::append(Path, "c++");
1131+
for (llvm::vfs::directory_iterator LI = getVFS().dir_begin(Path, EC), LE;
1132+
!EC && LI != LE; LI = LI.increment(EC)) {
1133+
StringRef VersionText = llvm::sys::path::filename(LI->path());
1134+
if (VersionText[0] != 'v') {
1135+
auto Version = Generic_GCC::GCCVersion::Parse(VersionText);
1136+
if (Version > MaxVersion)
1137+
MaxVersion = Version;
1138+
}
1139+
}
1140+
if (MaxVersion.Major > 0)
1141+
Version = MaxVersion.Text;
1142+
}
1143+
1144+
if (Version.empty())
1145+
return;
1146+
1147+
std::string TargetDir = LibPath + "/c++/" + Version + "/" + MultiarchTriple;
1148+
addSystemInclude(DriverArgs, CC1Args, TargetDir);
1149+
1150+
// Second add the generic one.
1151+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
1152+
// Third the backward one.
1153+
addSystemInclude(DriverArgs, CC1Args,
1154+
LibPath + "/c++/" + Version + "/backward");
1155+
}

clang/lib/Driver/ToolChains/MSVC.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,21 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain {
133133
Tool *buildLinker() const override;
134134
Tool *buildAssembler() const override;
135135
private:
136+
CXXStdlibType GetDefaultCXXStdlibType() const override {
137+
return ToolChain::CST_Stl;
138+
}
139+
RuntimeLibType GetDefaultRuntimeLibType() const override {
140+
return ToolChain::RLT_Vcruntime;
141+
}
142+
UnwindLibType GetDefaultUnwindLibType() const override {
143+
return ToolChain::UNW_Vcruntime;
144+
}
145+
void addStlIncludePaths(const llvm::opt::ArgList &DriverArgs,
146+
llvm::opt::ArgStringList &CC1Args) const;
147+
void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
148+
llvm::opt::ArgStringList &CC1Args) const;
149+
void addLibStdCXXIncludePaths(const llvm::opt::ArgList &DriverArgs,
150+
llvm::opt::ArgStringList &CC1Args) const;
136151
std::optional<llvm::StringRef> WinSdkDir, WinSdkVersion, WinSysRoot;
137152
std::string VCToolChainPath;
138153
llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS;

clang/lib/Driver/ToolChains/WebAssembly.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,8 @@ WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
460460
return ToolChain::CST_Libcxx;
461461
else if (Value == "libstdc++")
462462
return ToolChain::CST_Libstdcxx;
463+
else if (Value == "stl")
464+
return ToolChain::CST_Stl;
463465
else
464466
getDriver().Diag(diag::err_drv_invalid_stdlib_name)
465467
<< A->getAsString(Args);
@@ -518,6 +520,9 @@ void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
518520
case ToolChain::CST_Libstdcxx:
519521
addLibStdCXXIncludePaths(DriverArgs, CC1Args);
520522
break;
523+
case ToolChain::CST_Stl:
524+
addStlIncludePaths(DriverArgs, CC1Args);
525+
break;
521526
}
522527
}
523528

@@ -552,6 +557,26 @@ Tool *WebAssembly::buildLinker() const {
552557
return new tools::wasm::Linker(*this);
553558
}
554559

560+
void WebAssembly::addStlIncludePaths(
561+
const llvm::opt::ArgList &DriverArgs,
562+
llvm::opt::ArgStringList &CC1Args) const {
563+
const Driver &D = getDriver();
564+
std::string SysRoot = computeSysRoot();
565+
std::string LibPath = SysRoot + "/include";
566+
const std::string MultiarchTriple =
567+
getMultiarchTriple(D, getTriple(), SysRoot);
568+
bool IsKnownOs = (getTriple().getOS() != llvm::Triple::UnknownOS);
569+
570+
// First add the per-target include path if the OS is known.
571+
if (IsKnownOs) {
572+
std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/stl";
573+
addSystemInclude(DriverArgs, CC1Args, TargetDir);
574+
}
575+
576+
// Second add the generic one.
577+
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/stl");
578+
}
579+
555580
void WebAssembly::addLibCxxIncludePaths(
556581
const llvm::opt::ArgList &DriverArgs,
557582
llvm::opt::ArgStringList &CC1Args) const {

clang/lib/Driver/ToolChains/WebAssembly.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly final : public ToolChain {
7979
const llvm::Triple &TargetTriple,
8080
StringRef SysRoot) const override;
8181

82+
void addStlIncludePaths(const llvm::opt::ArgList &DriverArgs,
83+
llvm::opt::ArgStringList &CC1Args) const;
8284
void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
8385
llvm::opt::ArgStringList &CC1Args) const;
8486
void addLibStdCXXIncludePaths(const llvm::opt::ArgList &DriverArgs,

clang/test/Driver/msvc-sysroot.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// RUN: %clangxx --target=x86_64-unknown-windows-msvc -### \
2+
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
3+
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_STL %s
4+
// COMPILE_X86_64_STL: clang{{.*}}" "-cc1"
5+
// COMPILE_X86_64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
6+
// COMPILE_X86_64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/stl"
7+
// COMPILE_X86_64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
8+
// COMPILE_X86_64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
9+
10+
// RUN: %clangxx --target=x86_64-unknown-windows-msvc -### \
11+
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree/usr -stdlib=libc++ -fuse-ld=lld %s 2>&1 \
12+
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_LIBCXX %s
13+
// COMPILE_X86_64_LIBCXX: clang{{.*}}" "-cc1"
14+
// COMPILE_X86_64_LIBCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
15+
// COMPILE_X86_64_LIBCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/v1"
16+
// COMPILE_X86_64_LIBCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/v1"
17+
// COMPILE_X86_64_LIBCXX: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
18+
19+
// RUN: %clangxx -### --target=x86_64-unknown-windows-msvc --stdlib=libstdc++ %s 2>&1 \
20+
// RUN: -fuse-ld=lld --sysroot=%S/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr \
21+
// RUN: | FileCheck -check-prefix=COMPILE_X86_64_LIBSTDCXX %s
22+
// COMPILE_X86_64_LIBSTDCXX: "-cc1"
23+
// COMPILE_X86_64_LIBSTDCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]*]]"
24+
// COMPILE_X86_64_LIBSTDCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
25+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/x86_64-unknown-windows-msvc"
26+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8"
27+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/backward"
28+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include"
29+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc"
30+
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include"
31+
// COMPILE_X86_64_LIBSTDCXX: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
32+
33+
// RUN: %clangxx --target=aarch64-unknown-windows-msvc -### \
34+
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
35+
// RUN: | FileCheck --check-prefix=COMPILE_AARCH64_STL %s
36+
// COMPILE_AARCH64_STL: clang{{.*}}" "-cc1"
37+
// COMPILE_AARCH64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
38+
// COMPILE_AARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/aarch64-unknown-windows-msvc/c++/stl"
39+
// COMPILE_AARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
40+
// COMPILE_AARCH64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/aarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
41+
42+
// RUN: %clangxx --target=loongarch64-unknown-windows-msvc -stdlib=stl -### \
43+
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
44+
// RUN: | FileCheck --check-prefix=COMPILE_LOONGARCH64_STL %s
45+
// COMPILE_LOONGARCH64_STL: clang{{.*}}" "-cc1"
46+
// COMPILE_LOONGARCH64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
47+
// COMPILE_LOONGARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/loongarch64-unknown-windows-msvc/c++/stl"
48+
// COMPILE_LOONGARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
49+
// COMPILE_LOONGARCH64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/loongarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
50+
51+
// RUN: %clangxx --target=x86_64-unknown-windows-msvc -stdlib=stl -### \
52+
// RUN: --sysroot=%S %s 2>&1 \
53+
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_STL_LINK %s
54+
// COMPILE_X86_64_STL_LINK: clang{{.*}}" "-cc1"
55+
// COMPILE_X86_64_STL_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
56+
// COMPILE_X86_64_STL_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/stl"
57+
// COMPILE_X86_64_STL_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
58+
// COMPILE_X86_64_STL_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
59+
60+
// RUN: %clangxx --target=loongarch64-unknown-windows-msvc -stdlib=libc++ -### \
61+
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree/usr %s 2>&1 \
62+
// RUN: | FileCheck --check-prefix=COMPILE_LOONGARCH64_LIBCXX_LINK %s
63+
// COMPILE_LOONGARCH64_LIBCXX_LINK: clang{{.*}}" "-cc1"
64+
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
65+
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/loongarch64-unknown-windows-msvc/c++/v1"
66+
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/v1"
67+
// COMPILE_LOONGARCH64_LIBCXX_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/loongarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
68+
69+
// RUN: %clangxx --target=riscv64-unknown-windows-msvc -### --stdlib=libstdc++ %s 2>&1 \
70+
// RUN: --sysroot=%S/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr \
71+
// RUN: | FileCheck -check-prefix=COMPILE_RISCV64_LIBSTDCXX_LINK %s
72+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-cc1"
73+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-resource-dir" "[[RESOURCE_DIR:[^"]*]]"
74+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
75+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/riscv64-unknown-windows-msvc"
76+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8"
77+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/backward"
78+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include"
79+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/riscv64-unknown-windows-msvc"
80+
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include"
81+
// COMPILE_RISCV64_LIBSTDCXX_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/riscv64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

0 commit comments

Comments
 (0)