Skip to content

Commit da0047e

Browse files
committed
[Merge Modules] Omit merge-modules job when only one input is given.
And said input matches the expected output path.
1 parent f31c86a commit da0047e

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,16 @@ extension Driver {
392392
!(moduleInputs.isEmpty && moduleInputsFromJobOutputs.isEmpty),
393393
compilerMode.usesPrimaryFileInputs
394394
else { return nil }
395+
396+
// If there is only 1 module input to this job and its path matches that which we intend
397+
// to produce with this merge-modules job, skip it
398+
let mergeOutput = moduleOutputInfo.output!.outputPath
399+
if moduleInputs.count + moduleInputsFromJobOutputs.count == 1,
400+
let soleInput = moduleInputs.first == nil ? moduleInputsFromJobOutputs.first : moduleInputs.first,
401+
soleInput.fileHandle == mergeOutput {
402+
return nil
403+
}
404+
395405
return try mergeModuleJob(inputs: moduleInputs, inputsFromOutputs: moduleInputsFromJobOutputs)
396406
}
397407

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,23 @@ final class SwiftDriverTests: XCTestCase {
19731973
XCTAssertEqual(plannedJobs[1].inputs[0].file, .temporary(RelativePath("input.swiftmodule")))
19741974
XCTAssertEqual(plannedJobs[1].outputs[0].file, .absolute(AbsolutePath("/tmp/test.swiftmodule")))
19751975
}
1976+
1977+
do {
1978+
// -g is specified
1979+
// (partial and final product module are saved to temporary directory so merge-modules is omitted)
1980+
var driver = try Driver(args: ["swiftc", "-g", "input.swift"])
1981+
let plannedJobs = try driver.planBuild()
1982+
print(plannedJobs)
1983+
XCTAssertEqual(plannedJobs.count, 3)
1984+
// No .mergeModule job
1985+
#if os(macOS)
1986+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .link, .generateDSYM])
1987+
#endif
1988+
#if os(Linux)
1989+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .autolinkExtract, .link])
1990+
#endif
1991+
XCTAssertTrue(plannedJobs[0].outputs.contains(TypedVirtualPath(file: VirtualPath.temporary(RelativePath("input.swiftmodule")).intern(), type: .swiftModule)))
1992+
}
19761993
}
19771994

19781995
func testEmitModuleSeparately() throws {
@@ -2015,16 +2032,16 @@ final class SwiftDriverTests: XCTestCase {
20152032
// swift-autolink-extract is not present
20162033
#if os(Linux)
20172034
do {
2018-
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "-g", "foo.swift"])
2035+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "-g", "foo.swift", "bar.swift"])
20192036
let plannedJobs = try driver.planBuild()
2020-
XCTAssertEqual(plannedJobs.count, 5)
2021-
XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .mergeModule, .autolinkExtract, .moduleWrap, .link]))
2037+
XCTAssertEqual(plannedJobs.count, 6)
2038+
XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .compile, .mergeModule, .autolinkExtract, .moduleWrap, .link]))
20222039
let wrapJob = plannedJobs.filter {$0.kind == .moduleWrap} .first!
20232040
XCTAssertEqual(wrapJob.inputs.count, 1)
20242041
XCTAssertTrue(wrapJob.commandLine.contains(subsequence: ["-target", "x86_64-unknown-linux-gnu"]))
20252042
let mergeJob = plannedJobs.filter {$0.kind == .mergeModule} .first!
20262043
XCTAssertTrue(mergeJob.outputs.contains(wrapJob.inputs.first!))
2027-
XCTAssertTrue(plannedJobs[4].inputs.contains(wrapJob.outputs.first!))
2044+
XCTAssertTrue(plannedJobs[5].inputs.contains(wrapJob.outputs.first!))
20282045
}
20292046

20302047
do {
@@ -2038,19 +2055,19 @@ final class SwiftDriverTests: XCTestCase {
20382055
do {
20392056
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "-gdwarf-types", "foo.swift"])
20402057
let plannedJobs = try driver.planBuild()
2041-
XCTAssertEqual(plannedJobs.count, 4)
2042-
// Merge module, but no module wrapping.
2043-
XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .mergeModule, .autolinkExtract, .link]))
2058+
XCTAssertEqual(plannedJobs.count, 3)
2059+
// No merge module/module wrap jobs.
2060+
XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .autolinkExtract, .link]))
20442061
}
20452062
#endif
20462063
// dsymutil won't be found on other platforms
20472064
#if os(macOS)
20482065
do {
2049-
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift"])
2066+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift", "bar.swift"])
20502067
let plannedJobs = try driver.planBuild()
2051-
XCTAssertEqual(plannedJobs.count, 4)
2068+
XCTAssertEqual(plannedJobs.count, 5)
20522069
// No module wrapping with Mach-O.
2053-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link, .generateDSYM])
2070+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .compile, .mergeModule, .link, .generateDSYM])
20542071
}
20552072
#endif
20562073
}

0 commit comments

Comments
 (0)