From f920d4313481f7920b2ef3ad78906354959e62e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Mon, 29 Apr 2024 12:54:05 -0700 Subject: [PATCH 1/3] Schedule an emit-module-separately job even if an input is not compilable The following invocation should schedule an emit-module-separately job for src.swift and include other.dylib in the link job. ``` swiftc -emit-library src.swift other.dylib ``` rdar://127238278 --- Sources/SwiftDriver/Jobs/EmitModuleJob.swift | 2 +- Tests/SwiftDriverTests/SwiftDriverTests.swift | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift index 1afafd78d..16b982c56 100644 --- a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift +++ b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift @@ -136,7 +136,7 @@ extension Driver { moduleOutputInfo: ModuleOutputInfo, inputFiles: [TypedVirtualPath]) -> Bool { if moduleOutputInfo.output == nil || - !inputFiles.allSatisfy({ $0.type.isPartOfSwiftCompilation }) { + !inputFiles.contains(where: { $0.type.isPartOfSwiftCompilation }) { return false } diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index fc63d9ca4..e54f53af8 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3504,6 +3504,22 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 4) XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .emitModule, .link])) } + + do { + // Schedule an emit-module separately job even if there are non-compilable inputs. + var driver = try Driver(args: ["swiftc", "foo.swift", "bar.dylib", "-emit-library", "foo.dylib", "-emit-module-path", "foo.swiftmodule"], + env: envVars) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(plannedJobs.count, 3) + XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .emitModule, .link])) + + let emitJob = try plannedJobs.findJob(.emitModule) + XCTAssertTrue(emitJob.commandLine.contains(try toPathOption("foo.swift"))) + XCTAssertFalse(emitJob.commandLine.contains(try toPathOption("bar.dylib"))) + + let linkJob = try plannedJobs.findJob(.link) + XCTAssertTrue(linkJob.commandLine.contains(try toPathOption("bar.dylib"))) + } } func testEmitModuleSeparatelyWMO() throws { From 7cbc41e41c703400765adbc766f7694308c0d195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 30 Apr 2024 14:01:48 -0700 Subject: [PATCH 2/3] Remap input file paths passed to the emit-module-separately job Fixes the failure in testDependencyScanningPathRemap. --- Sources/SwiftDriver/Jobs/EmitModuleJob.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift index 16b982c56..d1e110d9a 100644 --- a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift +++ b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift @@ -90,7 +90,7 @@ extension Driver { // Add the inputs. for input in self.inputFiles where input.type.isPartOfSwiftCompilation { - commandLine.append(.path(input.file)) + try addPathArgument(input.file, to: &commandLine) inputs.append(input) } From 4cbefd868c35388a9faa1484af4d911b7100e373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 30 Apr 2024 14:21:05 -0700 Subject: [PATCH 3/3] Disable emit-module-separately in testWMOWithNonSourceInputFirstAndModuleOutput --- Tests/SwiftDriverTests/SwiftDriverTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index e54f53af8..f8be84497 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3096,7 +3096,7 @@ final class SwiftDriverTests: XCTestCase { func testWMOWithNonSourceInputFirstAndModuleOutput() throws { var driver1 = try Driver(args: [ "swiftc", "-wmo", "danger.o", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test", - "-driver-filelist-threshold=0", "-emit-module", "-emit-library" + "-driver-filelist-threshold=0", "-emit-module", "-emit-library", "-no-emit-module-separately-wmo" ]) let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 2)