Skip to content

Commit 42fe7d9

Browse files
authored
Merge pull request #79926 from hjyamauchi/explicit-module-build
Propagate vfs overlays and -fbuiltin-headers-in-system-modules
2 parents 78efbba + 8312f7a commit 42fe7d9

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
@@ -791,7 +791,8 @@ getEmbedBitcodeInvocationArguments(std::vector<std::string> &invocationArgStrs,
791791
void
792792
importer::addCommonInvocationArguments(
793793
std::vector<std::string> &invocationArgStrs,
794-
ASTContext &ctx, bool ignoreClangTarget) {
794+
ASTContext &ctx, bool requiresBuiltinHeadersInSystemModules,
795+
bool ignoreClangTarget) {
795796
using ImporterImpl = ClangImporter::Implementation;
796797
llvm::Triple triple = ctx.LangOpts.Target;
797798
// Use clang specific target triple if given.
@@ -961,6 +962,16 @@ importer::addCommonInvocationArguments(
961962
}
962963
}
963964
}
965+
966+
for (auto &overlay : searchPathOpts.VFSOverlayFiles) {
967+
invocationArgStrs.push_back("-ivfsoverlay");
968+
invocationArgStrs.push_back(overlay);
969+
}
970+
971+
if (requiresBuiltinHeadersInSystemModules) {
972+
invocationArgStrs.push_back("-Xclang");
973+
invocationArgStrs.push_back("-fbuiltin-headers-in-system-modules");
974+
}
964975
}
965976

966977
bool ClangImporter::canReadPCH(StringRef PCHFilename) {
@@ -1144,13 +1155,13 @@ ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget)
11441155
getEmbedBitcodeInvocationArguments(invocationArgStrs, ctx);
11451156
break;
11461157
}
1147-
addCommonInvocationArguments(invocationArgStrs, ctx, ignoreClangTarget);
1158+
addCommonInvocationArguments(invocationArgStrs, ctx,
1159+
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
11481160
return invocationArgStrs;
11491161
}
11501162

11511163
std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
1152-
ClangImporter *importer, ASTContext &ctx,
1153-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
1164+
ASTContext &ctx, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
11541165
bool ignoreClangTarget) {
11551166
std::unique_ptr<clang::CompilerInvocation> CI;
11561167

@@ -1165,7 +1176,7 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
11651176
llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> tempDiagOpts{
11661177
new clang::DiagnosticOptions};
11671178
auto *tempDiagClient =
1168-
new ClangDiagnosticConsumer(importer->Impl, *tempDiagOpts,
1179+
new ClangDiagnosticConsumer(Impl, *tempDiagOpts,
11691180
ctx.ClangImporterOpts.DumpClangDiagnostics);
11701181
auto clangDiags = clang::CompilerInstance::createDiagnostics(
11711182
tempDiagOpts.get(), tempDiagClient,
@@ -1255,20 +1266,18 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12551266
// resilient and provide a module even if there were building it.
12561267
auto TempVFS = clang::createVFSFromCompilerInvocation(
12571268
*CI, *clangDiags,
1258-
VFS ? VFS : importer->Impl.SwiftContext.SourceMgr.getFileSystem());
1269+
VFS ? VFS : Impl.SwiftContext.SourceMgr.getFileSystem());
12591270

12601271
std::vector<std::string> FilteredModuleMapFiles;
12611272
for (auto ModuleMapFile : CI->getFrontendOpts().ModuleMapFiles) {
12621273
if (ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
12631274
// There is no need to add any module map file here. Issue a warning and
12641275
// drop the option.
1265-
importer->Impl.diagnose(SourceLoc(), diag::module_map_ignored,
1266-
ModuleMapFile);
1276+
Impl.diagnose(SourceLoc(), diag::module_map_ignored, ModuleMapFile);
12671277
} else if (TempVFS->exists(ModuleMapFile)) {
12681278
FilteredModuleMapFiles.push_back(ModuleMapFile);
12691279
} else {
1270-
importer->Impl.diagnose(SourceLoc(), diag::module_map_not_found,
1271-
ModuleMapFile);
1280+
Impl.diagnose(SourceLoc(), diag::module_map_not_found, ModuleMapFile);
12721281
}
12731282
}
12741283
CI->getFrontendOpts().ModuleMapFiles = FilteredModuleMapFiles;
@@ -1337,6 +1346,9 @@ ClangImporter::create(ASTContext &ctx,
13371346
ClangInvocationFileMapping fileMapping =
13381347
getClangInvocationFileMapping(ctx, nullptr, ignoreFileMapping);
13391348

1349+
importer->requiresBuiltinHeadersInSystemModules =
1350+
fileMapping.requiresBuiltinHeadersInSystemModules;
1351+
13401352
// Avoid creating indirect file system when using include tree.
13411353
if (!ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
13421354
// Wrap Swift's FS to allow Clang to override the working directory
@@ -1377,14 +1389,11 @@ ClangImporter::create(ASTContext &ctx,
13771389

13781390
// Create a new Clang compiler invocation.
13791391
{
1380-
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS))
1392+
if (auto ClangArgs = importer->getClangCC1Arguments(ctx, VFS))
13811393
importer->Impl.ClangArgs = *ClangArgs;
13821394
else
13831395
return nullptr;
13841396

1385-
if (fileMapping.requiresBuiltinHeadersInSystemModules)
1386-
importer->Impl.ClangArgs.push_back("-fbuiltin-headers-in-system-modules");
1387-
13881397
ArrayRef<std::string> invocationArgStrs = importer->Impl.ClangArgs;
13891398
if (importerOpts.DumpClangDiagnostics) {
13901399
llvm::errs() << "clang importer cc1 args: '";
@@ -1472,8 +1481,7 @@ ClangImporter::create(ASTContext &ctx,
14721481
if (ctx.LangOpts.ClangTarget.has_value()) {
14731482
// If '-clang-target' is set, create a mock invocation with the Swift triple
14741483
// to configure CodeGen and Target options for Swift compilation.
1475-
auto swiftTargetClangArgs =
1476-
getClangCC1Arguments(importer.get(), ctx, VFS, true);
1484+
auto swiftTargetClangArgs = importer->getClangCC1Arguments(ctx, VFS, true);
14771485
if (!swiftTargetClangArgs)
14781486
return nullptr;
14791487
auto swiftTargetClangInvocation = createClangInvocation(

lib/ClangImporter/ClangModuleDependencyScanner.cpp

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

8787
/// Create the command line for Clang dependency scanning.
88-
static std::vector<std::string> getClangDepScanningInvocationArguments(
89-
ASTContext &ctx, std::optional<StringRef> sourceFileName = std::nullopt) {
90-
std::vector<std::string> commandLineArgs =
91-
ClangImporter::getClangDriverArguments(ctx);
88+
std::vector<std::string> ClangImporter::getClangDepScanningInvocationArguments(
89+
ASTContext &ctx, std::optional<StringRef> sourceFileName) {
90+
std::vector<std::string> commandLineArgs = getClangDriverArguments(ctx);
9291
addScannerPrefixMapperInvocationArguments(commandLineArgs, ctx);
9392

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