Skip to content

Commit 8698e59

Browse files
committed
Propagate vfs overlays and -fbuiltin-headers-in-system-modules
This fixes explicit module builds for a hello world program on Windows as well as the ucrt import build failure as in the included test.
1 parent b852f94 commit 8698e59

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

include/swift/ClangImporter/ClangImporter.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,14 @@ class ClangImporter final : public ClangModuleLoader {
199199
bool ignoreFileMapping = false);
200200

201201
static std::vector<std::string>
202-
getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget = false);
202+
getClangDriverArguments(ASTContext &ctx,
203+
bool requiresBuiltinHeadersInSystemModules = false,
204+
bool ignoreClangTarget = false);
203205

204206
static std::optional<std::vector<std::string>>
205207
getClangCC1Arguments(ClangImporter *importer, ASTContext &ctx,
206208
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
209+
bool requiresBuiltinHeadersInSystemModules = false,
207210
bool ignoreClangTarget = false);
208211

209212
static std::unique_ptr<clang::CompilerInvocation>

lib/ClangImporter/ClangImporter.cpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,8 @@ getEmbedBitcodeInvocationArguments(std::vector<std::string> &invocationArgStrs,
789789
void
790790
importer::addCommonInvocationArguments(
791791
std::vector<std::string> &invocationArgStrs,
792-
ASTContext &ctx, bool ignoreClangTarget) {
792+
ASTContext &ctx, bool requiresBuiltinHeadersInSystemModules,
793+
bool ignoreClangTarget) {
793794
using ImporterImpl = ClangImporter::Implementation;
794795
llvm::Triple triple = ctx.LangOpts.Target;
795796
// Use clang specific target triple if given.
@@ -957,6 +958,18 @@ importer::addCommonInvocationArguments(
957958
}
958959
}
959960
}
961+
962+
for (auto &overlay : searchPathOpts.VFSOverlayFiles) {
963+
invocationArgStrs.push_back("-ivfsoverlay");
964+
invocationArgStrs.push_back(overlay);
965+
}
966+
967+
ClangInvocationFileMapping fileMapping =
968+
getClangInvocationFileMapping(ctx, nullptr, /*supressDiagnostic*/true);
969+
if (fileMapping.requiresBuiltinHeadersInSystemModules) {
970+
invocationArgStrs.push_back("-Xclang");
971+
invocationArgStrs.push_back("-fbuiltin-headers-in-system-modules");
972+
}
960973
}
961974

962975
bool ClangImporter::canReadPCH(StringRef PCHFilename) {
@@ -1124,7 +1137,8 @@ ClangImporter::getOrCreatePCH(const ClangImporterOptions &ImporterOptions,
11241137
}
11251138

11261139
std::vector<std::string>
1127-
ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget) {
1140+
ClangImporter::getClangDriverArguments(ASTContext &ctx,
1141+
bool requiresBuiltinHeadersInSystemModules, bool ignoreClangTarget) {
11281142
assert(!ctx.ClangImporterOpts.DirectClangCC1ModuleBuild &&
11291143
"direct-clang-cc1-module-build should not call this function");
11301144
std::vector<std::string> invocationArgStrs;
@@ -1140,14 +1154,15 @@ ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget)
11401154
getEmbedBitcodeInvocationArguments(invocationArgStrs, ctx);
11411155
break;
11421156
}
1143-
addCommonInvocationArguments(invocationArgStrs, ctx, ignoreClangTarget);
1157+
addCommonInvocationArguments(invocationArgStrs, ctx,
1158+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
11441159
return invocationArgStrs;
11451160
}
11461161

11471162
std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
11481163
ClangImporter *importer, ASTContext &ctx,
11491164
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
1150-
bool ignoreClangTarget) {
1165+
bool requiresBuiltinHeadersInSystemModules, bool ignoreClangTarget) {
11511166
std::unique_ptr<clang::CompilerInvocation> CI;
11521167

11531168
// Set up a temporary diagnostic client to report errors from parsing the
@@ -1210,7 +1225,8 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12101225
CI->getFrontendOpts().IndexStorePath = ctx.ClangImporterOpts.IndexStorePath;
12111226
} else {
12121227
// Otherwise, create cc1 arguments from driver args.
1213-
auto driverArgs = getClangDriverArguments(ctx, ignoreClangTarget);
1228+
auto driverArgs = getClangDriverArguments(ctx,
1229+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
12141230

12151231
llvm::SmallVector<const char *> invocationArgs;
12161232
invocationArgs.reserve(driverArgs.size());
@@ -1370,14 +1386,12 @@ ClangImporter::create(ASTContext &ctx,
13701386

13711387
// Create a new Clang compiler invocation.
13721388
{
1373-
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS))
1389+
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS,
1390+
fileMapping.requiresBuiltinHeadersInSystemModules))
13741391
importer->Impl.ClangArgs = *ClangArgs;
13751392
else
13761393
return nullptr;
13771394

1378-
if (fileMapping.requiresBuiltinHeadersInSystemModules)
1379-
importer->Impl.ClangArgs.push_back("-fbuiltin-headers-in-system-modules");
1380-
13811395
ArrayRef<std::string> invocationArgStrs = importer->Impl.ClangArgs;
13821396
if (importerOpts.DumpClangDiagnostics) {
13831397
llvm::errs() << "clang importer cc1 args: '";
@@ -1465,8 +1479,9 @@ ClangImporter::create(ASTContext &ctx,
14651479
if (ctx.LangOpts.ClangTarget.has_value()) {
14661480
// If '-clang-target' is set, create a mock invocation with the Swift triple
14671481
// to configure CodeGen and Target options for Swift compilation.
1468-
auto swiftTargetClangArgs =
1469-
getClangCC1Arguments(importer.get(), ctx, VFS, true);
1482+
auto swiftTargetClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS,
1483+
/*requiresBuiltinHeadersInSystemModulestrue*/false,
1484+
/*ignoreClangTarget*/true);
14701485
if (!swiftTargetClangArgs)
14711486
return nullptr;
14721487
auto swiftTargetClangInvocation = createClangInvocation(

lib/ClangImporter/ImporterImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,6 +1914,7 @@ void getNormalInvocationArguments(std::vector<std::string> &invocationArgStrs,
19141914
/// Add command-line arguments common to all imports of Clang code.
19151915
void addCommonInvocationArguments(std::vector<std::string> &invocationArgStrs,
19161916
ASTContext &ctx,
1917+
bool requiresBuiltinHeadersInSystemModules,
19171918
bool ignoreClangTarget);
19181919

19191920
/// Finds a particular kind of nominal by looking through typealiases.

test/ScanDependencies/win-crt.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -scan-dependencies -Xcc -v %s -o - | %validate-json | %FileCheck %s
3+
4+
// We want to explicitly import WinSDK's CRT.
5+
// REQUIRES: OS=windows-msvc
6+
7+
import CRT
8+
9+
// CHECK: "modulePath": "{{.*}}\\ucrt-{{.*}}.pcm",
10+
// CHECK-NEXT: "sourceFiles": [
11+
// CHECK-NEXT: "{{.*}}\\ucrt\\module.modulemap"

0 commit comments

Comments
 (0)