Skip to content

Commit 8312f7a

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 8312f7a

File tree

5 files changed

+48
-23
lines changed

5 files changed

+48
-23
lines changed

include/swift/ClangImporter/ClangImporter.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ class ClangImporter final : public ClangModuleLoader {
160160
private:
161161
Implementation &Impl;
162162

163+
bool requiresBuiltinHeadersInSystemModules = false;
164+
163165
ClangImporter(ASTContext &ctx,
164166
DependencyTracker *tracker,
165167
DWARFImporterDelegate *dwarfImporterDelegate);
@@ -198,14 +200,18 @@ class ClangImporter final : public ClangModuleLoader {
198200
DWARFImporterDelegate *dwarfImporterDelegate = nullptr,
199201
bool ignoreFileMapping = false);
200202

201-
static std::vector<std::string>
203+
std::vector<std::string>
202204
getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget = false);
203205

204-
static std::optional<std::vector<std::string>>
205-
getClangCC1Arguments(ClangImporter *importer, ASTContext &ctx,
206+
std::optional<std::vector<std::string>>
207+
getClangCC1Arguments(ASTContext &ctx,
206208
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
207209
bool ignoreClangTarget = false);
208210

211+
std::vector<std::string>
212+
getClangDepScanningInvocationArguments(ASTContext &ctx,
213+
std::optional<StringRef> sourceFileName = std::nullopt);
214+
209215
static std::unique_ptr<clang::CompilerInvocation>
210216
createClangInvocation(ClangImporter *importer,
211217
const ClangImporterOptions &importerOpts,

lib/ClangImporter/ClangImporter.cpp

Lines changed: 24 additions & 16 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) {
@@ -1140,13 +1151,13 @@ ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget)
11401151
getEmbedBitcodeInvocationArguments(invocationArgStrs, ctx);
11411152
break;
11421153
}
1143-
addCommonInvocationArguments(invocationArgStrs, ctx, ignoreClangTarget);
1154+
addCommonInvocationArguments(invocationArgStrs, ctx,
1155+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
11441156
return invocationArgStrs;
11451157
}
11461158

11471159
std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
1148-
ClangImporter *importer, ASTContext &ctx,
1149-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
1160+
ASTContext &ctx, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
11501161
bool ignoreClangTarget) {
11511162
std::unique_ptr<clang::CompilerInvocation> CI;
11521163

@@ -1161,7 +1172,7 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
11611172
llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> tempDiagOpts{
11621173
new clang::DiagnosticOptions};
11631174
auto *tempDiagClient =
1164-
new ClangDiagnosticConsumer(importer->Impl, *tempDiagOpts,
1175+
new ClangDiagnosticConsumer(Impl, *tempDiagOpts,
11651176
ctx.ClangImporterOpts.DumpClangDiagnostics);
11661177
auto clangDiags = clang::CompilerInstance::createDiagnostics(
11671178
tempDiagOpts.get(), tempDiagClient,
@@ -1248,20 +1259,18 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12481259
// resilient and provide a module even if there were building it.
12491260
auto TempVFS = clang::createVFSFromCompilerInvocation(
12501261
*CI, *clangDiags,
1251-
VFS ? VFS : importer->Impl.SwiftContext.SourceMgr.getFileSystem());
1262+
VFS ? VFS : Impl.SwiftContext.SourceMgr.getFileSystem());
12521263

12531264
std::vector<std::string> FilteredModuleMapFiles;
12541265
for (auto ModuleMapFile : CI->getFrontendOpts().ModuleMapFiles) {
12551266
if (ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
12561267
// There is no need to add any module map file here. Issue a warning and
12571268
// drop the option.
1258-
importer->Impl.diagnose(SourceLoc(), diag::module_map_ignored,
1259-
ModuleMapFile);
1269+
Impl.diagnose(SourceLoc(), diag::module_map_ignored, ModuleMapFile);
12601270
} else if (TempVFS->exists(ModuleMapFile)) {
12611271
FilteredModuleMapFiles.push_back(ModuleMapFile);
12621272
} else {
1263-
importer->Impl.diagnose(SourceLoc(), diag::module_map_not_found,
1264-
ModuleMapFile);
1273+
Impl.diagnose(SourceLoc(), diag::module_map_not_found, ModuleMapFile);
12651274
}
12661275
}
12671276
CI->getFrontendOpts().ModuleMapFiles = FilteredModuleMapFiles;
@@ -1330,6 +1339,9 @@ ClangImporter::create(ASTContext &ctx,
13301339
ClangInvocationFileMapping fileMapping =
13311340
getClangInvocationFileMapping(ctx, nullptr, ignoreFileMapping);
13321341

1342+
importer->requiresBuiltinHeadersInSystemModules =
1343+
fileMapping.requiresBuiltinHeadersInSystemModules;
1344+
13331345
// Avoid creating indirect file system when using include tree.
13341346
if (!ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
13351347
// Wrap Swift's FS to allow Clang to override the working directory
@@ -1370,14 +1382,11 @@ ClangImporter::create(ASTContext &ctx,
13701382

13711383
// Create a new Clang compiler invocation.
13721384
{
1373-
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS))
1385+
if (auto ClangArgs = importer->getClangCC1Arguments(ctx, VFS))
13741386
importer->Impl.ClangArgs = *ClangArgs;
13751387
else
13761388
return nullptr;
13771389

1378-
if (fileMapping.requiresBuiltinHeadersInSystemModules)
1379-
importer->Impl.ClangArgs.push_back("-fbuiltin-headers-in-system-modules");
1380-
13811390
ArrayRef<std::string> invocationArgStrs = importer->Impl.ClangArgs;
13821391
if (importerOpts.DumpClangDiagnostics) {
13831392
llvm::errs() << "clang importer cc1 args: '";
@@ -1465,8 +1474,7 @@ ClangImporter::create(ASTContext &ctx,
14651474
if (ctx.LangOpts.ClangTarget.has_value()) {
14661475
// If '-clang-target' is set, create a mock invocation with the Swift triple
14671476
// to configure CodeGen and Target options for Swift compilation.
1468-
auto swiftTargetClangArgs =
1469-
getClangCC1Arguments(importer.get(), ctx, VFS, true);
1477+
auto swiftTargetClangArgs = importer->getClangCC1Arguments(ctx, VFS, true);
14701478
if (!swiftTargetClangArgs)
14711479
return nullptr;
14721480
auto swiftTargetClangInvocation = createClangInvocation(

lib/ClangImporter/ClangModuleDependencyScanner.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,9 @@ static void addScannerPrefixMapperInvocationArguments(
7070
}
7171

7272
/// Create the command line for Clang dependency scanning.
73-
static std::vector<std::string> getClangDepScanningInvocationArguments(
74-
ASTContext &ctx, std::optional<StringRef> sourceFileName = std::nullopt) {
75-
std::vector<std::string> commandLineArgs =
76-
ClangImporter::getClangDriverArguments(ctx);
73+
std::vector<std::string> ClangImporter::getClangDepScanningInvocationArguments(
74+
ASTContext &ctx, std::optional<StringRef> sourceFileName) {
75+
std::vector<std::string> commandLineArgs = getClangDriverArguments(ctx);
7776
addScannerPrefixMapperInvocationArguments(commandLineArgs, ctx);
7877

7978
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)