Skip to content

Commit 03841a8

Browse files
committed
Fix batch mode one partition. Previously it would make n jobs (where n is number of inputs).
1 parent c835d02 commit 03841a8

File tree

3 files changed

+35
-21
lines changed

3 files changed

+35
-21
lines changed

Sources/SwiftDriver/Jobs/CompileJob.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,7 @@ extension Driver {
7777
}
7878

7979
// Collect the set of input files that are part of the Swift compilation.
80-
let swiftInputFiles: [TypedVirtualPath] = inputFiles.compactMap { inputFile in
81-
if inputFile.type.isPartOfSwiftCompilation {
82-
return inputFile
83-
}
84-
85-
return nil
86-
}
80+
let swiftInputFiles: [TypedVirtualPath] = inputFiles.filter { $0.type.isPartOfSwiftCompilation }
8781

8882
// If we will be passing primary files via -primary-file, form a set of primary input files so
8983
// we can check more quickly.

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,14 @@ extension Driver {
372372
}
373373
let numPartitions = numberOfBatchPartitions(info, swiftInputFiles: swiftInputFiles)
374374

375-
// If there is only one partition, don't bother.
376-
if numPartitions == 1 { return nil }
375+
// If there is only one partition, fast path.
376+
if numPartitions == 1 {
377+
var assignment = [TypedVirtualPath: Int]()
378+
for input in swiftInputFiles {
379+
assignment[input] = 0
380+
}
381+
return BatchPartitions(assignment: assignment, partitions: [swiftInputFiles])
382+
}
377383

378384
// Map each input file to a partition index. Ensure that we evenly
379385
// distribute the remainder.

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -922,18 +922,32 @@ final class SwiftDriverTests: XCTestCase {
922922
}
923923

924924
func testBatchModeCompiles() throws {
925-
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-enable-batch-mode", "-driver-batch-count", "3"])
926-
let plannedJobs = try driver1.planBuild()
927-
XCTAssertEqual(plannedJobs.count, 4)
928-
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
929-
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo1.o")))
930-
XCTAssertEqual(plannedJobs[1].outputs.count, 4)
931-
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
932-
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
933-
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
934-
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
935-
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
936-
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
925+
do {
926+
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-enable-batch-mode", "-driver-batch-count", "3"])
927+
let plannedJobs = try driver1.planBuild()
928+
XCTAssertEqual(plannedJobs.count, 4)
929+
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
930+
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo1.o")))
931+
XCTAssertEqual(plannedJobs[1].outputs.count, 4)
932+
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
933+
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
934+
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
935+
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
936+
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
937+
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
938+
}
939+
940+
// Test 1 partition results in 1 job
941+
do {
942+
var driver = try Driver(args: ["swiftc", "-toolchain-stdlib-rpath", "-module-cache-path", "/tmp/clang-module-cache", "-swift-version", "4", "-Xfrontend", "-ignore-module-source-info", "-module-name", "batch", "-enable-batch-mode", "-j", "1", "-c", "main.swift", "lib.swift"])
943+
let plannedJobs = try driver.planBuild()
944+
XCTAssertEqual(plannedJobs.count, 1)
945+
var count = 0
946+
for arg in plannedJobs[0].commandLine where arg == .flag("-primary-file") {
947+
count += 1
948+
}
949+
XCTAssertEqual(count, 2)
950+
}
937951
}
938952

939953
func testSingleThreadedWholeModuleOptimizationCompiles() throws {

0 commit comments

Comments
 (0)