Skip to content

Commit 89083b7

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 89083b7

File tree

5 files changed

+43
-13
lines changed

5 files changed

+43
-13
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: 23 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,16 @@ 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+
if (requiresBuiltinHeadersInSystemModules) {
968+
invocationArgStrs.push_back("-Xclang");
969+
invocationArgStrs.push_back("-fbuiltin-headers-in-system-modules");
970+
}
960971
}
961972

962973
bool ClangImporter::canReadPCH(StringRef PCHFilename) {
@@ -1124,7 +1135,8 @@ ClangImporter::getOrCreatePCH(const ClangImporterOptions &ImporterOptions,
11241135
}
11251136

11261137
std::vector<std::string>
1127-
ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget) {
1138+
ClangImporter::getClangDriverArguments(ASTContext &ctx,
1139+
bool requiresBuiltinHeadersInSystemModules, bool ignoreClangTarget) {
11281140
assert(!ctx.ClangImporterOpts.DirectClangCC1ModuleBuild &&
11291141
"direct-clang-cc1-module-build should not call this function");
11301142
std::vector<std::string> invocationArgStrs;
@@ -1140,14 +1152,15 @@ ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget)
11401152
getEmbedBitcodeInvocationArguments(invocationArgStrs, ctx);
11411153
break;
11421154
}
1143-
addCommonInvocationArguments(invocationArgStrs, ctx, ignoreClangTarget);
1155+
addCommonInvocationArguments(invocationArgStrs, ctx,
1156+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
11441157
return invocationArgStrs;
11451158
}
11461159

11471160
std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
11481161
ClangImporter *importer, ASTContext &ctx,
11491162
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
1150-
bool ignoreClangTarget) {
1163+
bool requiresBuiltinHeadersInSystemModules, bool ignoreClangTarget) {
11511164
std::unique_ptr<clang::CompilerInvocation> CI;
11521165

11531166
// Set up a temporary diagnostic client to report errors from parsing the
@@ -1210,7 +1223,8 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12101223
CI->getFrontendOpts().IndexStorePath = ctx.ClangImporterOpts.IndexStorePath;
12111224
} else {
12121225
// Otherwise, create cc1 arguments from driver args.
1213-
auto driverArgs = getClangDriverArguments(ctx, ignoreClangTarget);
1226+
auto driverArgs = getClangDriverArguments(ctx,
1227+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
12141228

12151229
llvm::SmallVector<const char *> invocationArgs;
12161230
invocationArgs.reserve(driverArgs.size());
@@ -1370,14 +1384,12 @@ ClangImporter::create(ASTContext &ctx,
13701384

13711385
// Create a new Clang compiler invocation.
13721386
{
1373-
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS))
1387+
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS,
1388+
fileMapping.requiresBuiltinHeadersInSystemModules))
13741389
importer->Impl.ClangArgs = *ClangArgs;
13751390
else
13761391
return nullptr;
13771392

1378-
if (fileMapping.requiresBuiltinHeadersInSystemModules)
1379-
importer->Impl.ClangArgs.push_back("-fbuiltin-headers-in-system-modules");
1380-
13811393
ArrayRef<std::string> invocationArgStrs = importer->Impl.ClangArgs;
13821394
if (importerOpts.DumpClangDiagnostics) {
13831395
llvm::errs() << "clang importer cc1 args: '";
@@ -1465,8 +1477,8 @@ ClangImporter::create(ASTContext &ctx,
14651477
if (ctx.LangOpts.ClangTarget.has_value()) {
14661478
// If '-clang-target' is set, create a mock invocation with the Swift triple
14671479
// to configure CodeGen and Target options for Swift compilation.
1468-
auto swiftTargetClangArgs =
1469-
getClangCC1Arguments(importer.get(), ctx, VFS, true);
1480+
auto swiftTargetClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS,
1481+
fileMapping.requiresBuiltinHeadersInSystemModules, true);
14701482
if (!swiftTargetClangArgs)
14711483
return nullptr;
14721484
auto swiftTargetClangInvocation = createClangInvocation(

lib/ClangImporter/ClangModuleDependencyScanner.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,11 @@ static void addScannerPrefixMapperInvocationArguments(
7272
/// Create the command line for Clang dependency scanning.
7373
static std::vector<std::string> getClangDepScanningInvocationArguments(
7474
ASTContext &ctx, std::optional<StringRef> sourceFileName = std::nullopt) {
75+
ClangInvocationFileMapping fileMapping =
76+
getClangInvocationFileMapping(ctx, nullptr, /*suppressDiagnostic*/true);
7577
std::vector<std::string> commandLineArgs =
76-
ClangImporter::getClangDriverArguments(ctx);
78+
ClangImporter::getClangDriverArguments(ctx,
79+
fileMapping.requiresBuiltinHeadersInSystemModules);
7780
addScannerPrefixMapperInvocationArguments(commandLineArgs, ctx);
7881

7982
auto sourceFilePos = std::find(

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)