From 0585ca7381883123b43edf181af5d90772c82499 Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Wed, 20 Mar 2024 14:22:39 -0700 Subject: [PATCH] [Explicit Module Builds] When building Swift modules, switch over to loading Clang modules eagerly instead of lazily Swift import resolution already does an equivalent to eager module loading during its import resolution phase. --- lib/AST/ModuleDependencies.cpp | 4 +++- lib/DependencyScan/ScanDependencies.cpp | 9 +-------- lib/Frontend/ModuleInterfaceLoader.cpp | 16 +++++++--------- .../explicit-module-map-clang-explicit.swift | 16 +++++++--------- .../explicit-module-map-clang-implicit.swift | 14 +++++--------- .../explicit-swift-dependencies.swift | 4 ++-- 6 files changed, 25 insertions(+), 38 deletions(-) diff --git a/lib/AST/ModuleDependencies.cpp b/lib/AST/ModuleDependencies.cpp index 7e77f356978a4..568702e79b561 100644 --- a/lib/AST/ModuleDependencies.cpp +++ b/lib/AST/ModuleDependencies.cpp @@ -425,7 +425,9 @@ SwiftDependencyScanningService::SwiftDependencyScanningService() { clang::CASOptions(), /* CAS (llvm::cas::ObjectStore) */ nullptr, /* Cache (llvm::cas::ActionCache) */ nullptr, - /* SharedFS */ nullptr); + /* SharedFS */ nullptr, + /* OptimizeArgs */ clang::tooling::dependencies::ScanningOptimizations::Default, + /* EagerModules */ false); SharedFilesystemCache.emplace(); } diff --git a/lib/DependencyScan/ScanDependencies.cpp b/lib/DependencyScan/ScanDependencies.cpp index 5855cc521ba69..1732f8e55b6b8 100644 --- a/lib/DependencyScan/ScanDependencies.cpp +++ b/lib/DependencyScan/ScanDependencies.cpp @@ -276,15 +276,8 @@ static llvm::Error resolveExplicitModuleInputs( assert(clangDepDetails && "Expected Clang Module dependency."); if (!resolvingDepInfo.isClangModule()) { commandLine.push_back("-Xcc"); - commandLine.push_back("-fmodule-file=" + depModuleID.ModuleName + "=" + + commandLine.push_back("-fmodule-file=" + clangDepDetails->mappedPCMPath); - if (!instance.getInvocation() - .getClangImporterOptions() - .UseClangIncludeTree) { - commandLine.push_back("-Xcc"); - commandLine.push_back("-fmodule-map-file=" + - remapPath(clangDepDetails->moduleMapFile)); - } } if (!clangDepDetails->moduleCacheKey.empty()) { commandLine.push_back("-Xcc"); diff --git a/lib/Frontend/ModuleInterfaceLoader.cpp b/lib/Frontend/ModuleInterfaceLoader.cpp index e4d1bb65a30c3..4cb548c7a1b55 100644 --- a/lib/Frontend/ModuleInterfaceLoader.cpp +++ b/lib/Frontend/ModuleInterfaceLoader.cpp @@ -2187,19 +2187,17 @@ struct ExplicitSwiftModuleLoader::Implementation { std::vector &extraClangArgs = Ctx.ClangImporterOpts.ExtraArgs; for (auto &entry : ExplicitClangModuleMap) { const auto &moduleMapPath = entry.getValue().moduleMapPath; - if (!moduleMapPath.empty() && - moduleMapsSeen.find(moduleMapPath) == moduleMapsSeen.end()) { - moduleMapsSeen.insert(moduleMapPath); - extraClangArgs.push_back( - (Twine("-fmodule-map-file=") + moduleMapPath).str()); - } - const auto &modulePath = entry.getValue().modulePath; if (!modulePath.empty()) { extraClangArgs.push_back( - (Twine("-fmodule-file=") + entry.getKey() + "=" + modulePath) + (Twine("-fmodule-file=" + modulePath)) .str()); - } + } else if (!moduleMapPath.empty() && + moduleMapsSeen.find(moduleMapPath) == moduleMapsSeen.end()) { + moduleMapsSeen.insert(moduleMapPath); + extraClangArgs.push_back( + (Twine("-fmodule-map-file=") + moduleMapPath).str()); + } } } diff --git a/test/ScanDependencies/explicit-module-map-clang-explicit.swift b/test/ScanDependencies/explicit-module-map-clang-explicit.swift index 5ff764e34d460..079ce8d3988ac 100644 --- a/test/ScanDependencies/explicit-module-map-clang-explicit.swift +++ b/test/ScanDependencies/explicit-module-map-clang-explicit.swift @@ -1,3 +1,4 @@ +// REQUIRES: objc_interop // RUN: %empty-directory(%t) // RUN: mkdir -p %t/clang-module-cache // RUN: mkdir -p %t/inputs @@ -19,18 +20,15 @@ // RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json // RUN: echo "}," >> %/t/inputs/map.json // RUN: echo "{" >> %/t/inputs/map.json -// RUN: echo "\"moduleName\": \"_Concurrency\"," >> %/t/inputs/map.json -// RUN: echo "\"modulePath\": \"%/concurrency_module\"," >> %/t/inputs/map.json -// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json -// RUN: echo "}," >> %/t/inputs/map.json -// RUN: echo "{" >> %/t/inputs/map.json -// RUN: echo "\"moduleName\": \"_StringProcessing\"," >> %/t/inputs/map.json -// RUN: echo "\"modulePath\": \"%/string_processing_module\"," >> %/t/inputs/map.json -// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json +// RUN: echo "\"moduleName\": \"SwiftShims\"," >> %/t/inputs/map.json +// RUN: echo "\"isFramework\": false," >> %/t/inputs/map.json +// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map.json +// RUN: echo "\"clangModulePath\": \"%t/inputs/SwiftShims.pcm\"" >> %/t/inputs/map.json // RUN: echo "}]" >> %/t/inputs/map.json +// RUN: %target-swift-emit-pcm -module-name SwiftShims %swift-lib-dir/swift/shims/module.modulemap -o %t/inputs/SwiftShims.pcm // RUN: %target-swift-emit-pcm -module-name A -o %t/inputs/A.pcm %S/Inputs/CHeaders/module.modulemap -// RUN: %target-swift-frontend -emit-module -emit-module-path %t/Foo.swiftmodule -module-cache-path %t.module-cache -explicit-swift-module-map-file %t/inputs/map.json %s +// RUN: %target-swift-frontend -emit-module -emit-module-path %t/Foo.swiftmodule -module-cache-path %t.module-cache -explicit-swift-module-map-file %t/inputs/map.json %s -disable-implicit-swift-modules -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import import A diff --git a/test/ScanDependencies/explicit-module-map-clang-implicit.swift b/test/ScanDependencies/explicit-module-map-clang-implicit.swift index a03ac9eb494b6..ef1784fee44be 100644 --- a/test/ScanDependencies/explicit-module-map-clang-implicit.swift +++ b/test/ScanDependencies/explicit-module-map-clang-implicit.swift @@ -1,3 +1,4 @@ +// REQUIRES: objc_interop // RUN: %empty-directory(%t) // RUN: mkdir -p %t/clang-module-cache // RUN: mkdir -p %t/inputs @@ -18,17 +19,12 @@ // RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json // RUN: echo "}," >> %/t/inputs/map.json // RUN: echo "{" >> %/t/inputs/map.json -// RUN: echo "\"moduleName\": \"_Concurrency\"," >> %/t/inputs/map.json -// RUN: echo "\"modulePath\": \"%/concurrency_module\"," >> %/t/inputs/map.json -// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json -// RUN: echo "}," >> %/t/inputs/map.json -// RUN: echo "{" >> %/t/inputs/map.json -// RUN: echo "\"moduleName\": \"_StringProcessing\"," >> %/t/inputs/map.json -// RUN: echo "\"modulePath\": \"%/string_processing_module\"," >> %/t/inputs/map.json -// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json +// RUN: echo "\"moduleName\": \"SwiftShims\"," >> %/t/inputs/map.json +// RUN: echo "\"isFramework\": false," >> %/t/inputs/map.json +// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map.json // RUN: echo "}]" >> %/t/inputs/map.json -// RUN: %target-swift-frontend -emit-module -emit-module-path %t/Foo.swiftmodule -module-cache-path %t.module-cache -explicit-swift-module-map-file %t/inputs/map.json %s +// RUN: %target-swift-frontend -emit-module -emit-module-path %t/Foo.swiftmodule -module-cache-path %t.module-cache -explicit-swift-module-map-file %t/inputs/map.json %s -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import import A diff --git a/test/ScanDependencies/explicit-swift-dependencies.swift b/test/ScanDependencies/explicit-swift-dependencies.swift index 6c00f9024be12..fe7d4e326d2d4 100644 --- a/test/ScanDependencies/explicit-swift-dependencies.swift +++ b/test/ScanDependencies/explicit-swift-dependencies.swift @@ -51,5 +51,5 @@ import F // CHECK-NEXT: "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule" // CHECK-DAG: "-swift-module-file=Swift={{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule" // CHECK-DAG: "-swift-module-file=SwiftOnoneSupport={{.*}}{{/|\\}}SwiftOnoneSupport-{{.*}}.swiftmodule" -// CHECK-DAG: "-fmodule-file=F={{.*}}{{/|\\}}F-{{.*}}.pcm", -// CHECK-DAG: "-fmodule-file=SwiftShims={{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm", +// CHECK-DAG: "-fmodule-file={{.*}}{{/|\\}}F-{{.*}}.pcm" +// CHECK-DAG: "-fmodule-file={{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm"