Skip to content

Propagate vfs overlays and -fbuiltin-headers-in-system-modules #79926

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions include/swift/ClangImporter/ClangImporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ class ClangImporter final : public ClangModuleLoader {
private:
Implementation &Impl;

bool requiresBuiltinHeadersInSystemModules = false;

ClangImporter(ASTContext &ctx,
DependencyTracker *tracker,
DWARFImporterDelegate *dwarfImporterDelegate);
Expand Down Expand Up @@ -198,14 +200,18 @@ class ClangImporter final : public ClangModuleLoader {
DWARFImporterDelegate *dwarfImporterDelegate = nullptr,
bool ignoreFileMapping = false);

static std::vector<std::string>
std::vector<std::string>
getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget = false);

static std::optional<std::vector<std::string>>
getClangCC1Arguments(ClangImporter *importer, ASTContext &ctx,
std::optional<std::vector<std::string>>
getClangCC1Arguments(ASTContext &ctx,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
bool ignoreClangTarget = false);

std::vector<std::string>
getClangDepScanningInvocationArguments(ASTContext &ctx,
std::optional<StringRef> sourceFileName = std::nullopt);

static std::unique_ptr<clang::CompilerInvocation>
createClangInvocation(ClangImporter *importer,
const ClangImporterOptions &importerOpts,
Expand Down
40 changes: 24 additions & 16 deletions lib/ClangImporter/ClangImporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -789,7 +789,8 @@ getEmbedBitcodeInvocationArguments(std::vector<std::string> &invocationArgStrs,
void
importer::addCommonInvocationArguments(
std::vector<std::string> &invocationArgStrs,
ASTContext &ctx, bool ignoreClangTarget) {
ASTContext &ctx, bool requiresBuiltinHeadersInSystemModules,
bool ignoreClangTarget) {
using ImporterImpl = ClangImporter::Implementation;
llvm::Triple triple = ctx.LangOpts.Target;
// Use clang specific target triple if given.
Expand Down Expand Up @@ -957,6 +958,16 @@ importer::addCommonInvocationArguments(
}
}
}

for (auto &overlay : searchPathOpts.VFSOverlayFiles) {
invocationArgStrs.push_back("-ivfsoverlay");
invocationArgStrs.push_back(overlay);
}

if (requiresBuiltinHeadersInSystemModules) {
invocationArgStrs.push_back("-Xclang");
invocationArgStrs.push_back("-fbuiltin-headers-in-system-modules");
}
}

bool ClangImporter::canReadPCH(StringRef PCHFilename) {
Expand Down Expand Up @@ -1140,13 +1151,13 @@ ClangImporter::getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget)
getEmbedBitcodeInvocationArguments(invocationArgStrs, ctx);
break;
}
addCommonInvocationArguments(invocationArgStrs, ctx, ignoreClangTarget);
addCommonInvocationArguments(invocationArgStrs, ctx,
requiresBuiltinHeadersInSystemModules, ignoreClangTarget);
return invocationArgStrs;
}

std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
ClangImporter *importer, ASTContext &ctx,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
ASTContext &ctx, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
bool ignoreClangTarget) {
std::unique_ptr<clang::CompilerInvocation> CI;

Expand All @@ -1161,7 +1172,7 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> tempDiagOpts{
new clang::DiagnosticOptions};
auto *tempDiagClient =
new ClangDiagnosticConsumer(importer->Impl, *tempDiagOpts,
new ClangDiagnosticConsumer(Impl, *tempDiagOpts,
ctx.ClangImporterOpts.DumpClangDiagnostics);
auto clangDiags = clang::CompilerInstance::createDiagnostics(
tempDiagOpts.get(), tempDiagClient,
Expand Down Expand Up @@ -1248,20 +1259,18 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
// resilient and provide a module even if there were building it.
auto TempVFS = clang::createVFSFromCompilerInvocation(
*CI, *clangDiags,
VFS ? VFS : importer->Impl.SwiftContext.SourceMgr.getFileSystem());
VFS ? VFS : Impl.SwiftContext.SourceMgr.getFileSystem());

std::vector<std::string> FilteredModuleMapFiles;
for (auto ModuleMapFile : CI->getFrontendOpts().ModuleMapFiles) {
if (ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
// There is no need to add any module map file here. Issue a warning and
// drop the option.
importer->Impl.diagnose(SourceLoc(), diag::module_map_ignored,
ModuleMapFile);
Impl.diagnose(SourceLoc(), diag::module_map_ignored, ModuleMapFile);
} else if (TempVFS->exists(ModuleMapFile)) {
FilteredModuleMapFiles.push_back(ModuleMapFile);
} else {
importer->Impl.diagnose(SourceLoc(), diag::module_map_not_found,
ModuleMapFile);
Impl.diagnose(SourceLoc(), diag::module_map_not_found, ModuleMapFile);
}
}
CI->getFrontendOpts().ModuleMapFiles = FilteredModuleMapFiles;
Expand Down Expand Up @@ -1330,6 +1339,9 @@ ClangImporter::create(ASTContext &ctx,
ClangInvocationFileMapping fileMapping =
getClangInvocationFileMapping(ctx, nullptr, ignoreFileMapping);

importer->requiresBuiltinHeadersInSystemModules =
fileMapping.requiresBuiltinHeadersInSystemModules;

// Avoid creating indirect file system when using include tree.
if (!ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
// Wrap Swift's FS to allow Clang to override the working directory
Expand Down Expand Up @@ -1370,14 +1382,11 @@ ClangImporter::create(ASTContext &ctx,

// Create a new Clang compiler invocation.
{
if (auto ClangArgs = getClangCC1Arguments(importer.get(), ctx, VFS))
if (auto ClangArgs = importer->getClangCC1Arguments(ctx, VFS))
importer->Impl.ClangArgs = *ClangArgs;
else
return nullptr;

if (fileMapping.requiresBuiltinHeadersInSystemModules)
importer->Impl.ClangArgs.push_back("-fbuiltin-headers-in-system-modules");

ArrayRef<std::string> invocationArgStrs = importer->Impl.ClangArgs;
if (importerOpts.DumpClangDiagnostics) {
llvm::errs() << "clang importer cc1 args: '";
Expand Down Expand Up @@ -1465,8 +1474,7 @@ ClangImporter::create(ASTContext &ctx,
if (ctx.LangOpts.ClangTarget.has_value()) {
// If '-clang-target' is set, create a mock invocation with the Swift triple
// to configure CodeGen and Target options for Swift compilation.
auto swiftTargetClangArgs =
getClangCC1Arguments(importer.get(), ctx, VFS, true);
auto swiftTargetClangArgs = importer->getClangCC1Arguments(ctx, VFS, true);
if (!swiftTargetClangArgs)
return nullptr;
auto swiftTargetClangInvocation = createClangInvocation(
Expand Down
7 changes: 3 additions & 4 deletions lib/ClangImporter/ClangModuleDependencyScanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,9 @@ static void addScannerPrefixMapperInvocationArguments(
}

/// Create the command line for Clang dependency scanning.
static std::vector<std::string> getClangDepScanningInvocationArguments(
ASTContext &ctx, std::optional<StringRef> sourceFileName = std::nullopt) {
std::vector<std::string> commandLineArgs =
ClangImporter::getClangDriverArguments(ctx);
std::vector<std::string> ClangImporter::getClangDepScanningInvocationArguments(
ASTContext &ctx, std::optional<StringRef> sourceFileName) {
std::vector<std::string> commandLineArgs = getClangDriverArguments(ctx);
addScannerPrefixMapperInvocationArguments(commandLineArgs, ctx);

auto sourceFilePos = std::find(
Expand Down
1 change: 1 addition & 0 deletions lib/ClangImporter/ImporterImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1914,6 +1914,7 @@ void getNormalInvocationArguments(std::vector<std::string> &invocationArgStrs,
/// Add command-line arguments common to all imports of Clang code.
void addCommonInvocationArguments(std::vector<std::string> &invocationArgStrs,
ASTContext &ctx,
bool requiresBuiltinHeadersInSystemModules,
bool ignoreClangTarget);

/// Finds a particular kind of nominal by looking through typealiases.
Expand Down
11 changes: 11 additions & 0 deletions test/ScanDependencies/win-crt.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -scan-dependencies -Xcc -v %s -o - | %validate-json | %FileCheck %s

// We want to explicitly import WinSDK's CRT.
// REQUIRES: OS=windows-msvc

import CRT

// CHECK: "modulePath": "{{.*}}\\ucrt-{{.*}}.pcm",
// CHECK-NEXT: "sourceFiles": [
// CHECK-NEXT: "{{.*}}\\ucrt\\module.modulemap"