diff --git a/include/swift/ClangImporter/ClangImporter.h b/include/swift/ClangImporter/ClangImporter.h index cf96a7127ecd4..5358961157ee4 100644 --- a/include/swift/ClangImporter/ClangImporter.h +++ b/include/swift/ClangImporter/ClangImporter.h @@ -160,6 +160,8 @@ class ClangImporter final : public ClangModuleLoader { private: Implementation &Impl; + bool requiresBuiltinHeadersInSystemModules = false; + ClangImporter(ASTContext &ctx, DependencyTracker *tracker, DWARFImporterDelegate *dwarfImporterDelegate); @@ -198,14 +200,18 @@ class ClangImporter final : public ClangModuleLoader { DWARFImporterDelegate *dwarfImporterDelegate = nullptr, bool ignoreFileMapping = false); - static std::vector + std::vector getClangDriverArguments(ASTContext &ctx, bool ignoreClangTarget = false); - static std::optional> - getClangCC1Arguments(ClangImporter *importer, ASTContext &ctx, + std::optional> + getClangCC1Arguments(ASTContext &ctx, llvm::IntrusiveRefCntPtr VFS, bool ignoreClangTarget = false); + std::vector + getClangDepScanningInvocationArguments(ASTContext &ctx, + std::optional sourceFileName = std::nullopt); + static std::unique_ptr createClangInvocation(ClangImporter *importer, const ClangImporterOptions &importerOpts, diff --git a/lib/ClangImporter/ClangImporter.cpp b/lib/ClangImporter/ClangImporter.cpp index a32c529832bec..0bdf9ca765a0a 100644 --- a/lib/ClangImporter/ClangImporter.cpp +++ b/lib/ClangImporter/ClangImporter.cpp @@ -789,7 +789,8 @@ getEmbedBitcodeInvocationArguments(std::vector &invocationArgStrs, void importer::addCommonInvocationArguments( std::vector &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. @@ -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) { @@ -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> ClangImporter::getClangCC1Arguments( - ClangImporter *importer, ASTContext &ctx, - llvm::IntrusiveRefCntPtr VFS, + ASTContext &ctx, llvm::IntrusiveRefCntPtr VFS, bool ignoreClangTarget) { std::unique_ptr CI; @@ -1161,7 +1172,7 @@ std::optional> ClangImporter::getClangCC1Arguments( llvm::IntrusiveRefCntPtr 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, @@ -1248,20 +1259,18 @@ std::optional> 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 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; @@ -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 @@ -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 invocationArgStrs = importer->Impl.ClangArgs; if (importerOpts.DumpClangDiagnostics) { llvm::errs() << "clang importer cc1 args: '"; @@ -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( diff --git a/lib/ClangImporter/ClangModuleDependencyScanner.cpp b/lib/ClangImporter/ClangModuleDependencyScanner.cpp index 37e702ca29095..4726a488750a3 100644 --- a/lib/ClangImporter/ClangModuleDependencyScanner.cpp +++ b/lib/ClangImporter/ClangModuleDependencyScanner.cpp @@ -70,10 +70,9 @@ static void addScannerPrefixMapperInvocationArguments( } /// Create the command line for Clang dependency scanning. -static std::vector getClangDepScanningInvocationArguments( - ASTContext &ctx, std::optional sourceFileName = std::nullopt) { - std::vector commandLineArgs = - ClangImporter::getClangDriverArguments(ctx); +std::vector ClangImporter::getClangDepScanningInvocationArguments( + ASTContext &ctx, std::optional sourceFileName) { + std::vector commandLineArgs = getClangDriverArguments(ctx); addScannerPrefixMapperInvocationArguments(commandLineArgs, ctx); auto sourceFilePos = std::find( diff --git a/lib/ClangImporter/ImporterImpl.h b/lib/ClangImporter/ImporterImpl.h index 08a44e1d797b3..a8b72279efd44 100644 --- a/lib/ClangImporter/ImporterImpl.h +++ b/lib/ClangImporter/ImporterImpl.h @@ -1914,6 +1914,7 @@ void getNormalInvocationArguments(std::vector &invocationArgStrs, /// Add command-line arguments common to all imports of Clang code. void addCommonInvocationArguments(std::vector &invocationArgStrs, ASTContext &ctx, + bool requiresBuiltinHeadersInSystemModules, bool ignoreClangTarget); /// Finds a particular kind of nominal by looking through typealiases. diff --git a/test/ScanDependencies/win-crt.swift b/test/ScanDependencies/win-crt.swift new file mode 100644 index 0000000000000..0b1055d4087c3 --- /dev/null +++ b/test/ScanDependencies/win-crt.swift @@ -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"