Skip to content

Commit 49c5998

Browse files
authored
Merge pull request #76 from cltnschlosser/cs_FixBatchOnePartition
Fix batch mode one partition.
2 parents 5a03c2c + 03841a8 commit 49c5998

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
@@ -78,13 +78,7 @@ extension Driver {
7878
}
7979

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

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

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,14 @@ extension Driver {
386386
}
387387
let numPartitions = numberOfBatchPartitions(info, swiftInputFiles: swiftInputFiles)
388388

389-
// If there is only one partition, don't bother.
390-
if numPartitions == 1 { return nil }
389+
// If there is only one partition, fast path.
390+
if numPartitions == 1 {
391+
var assignment = [TypedVirtualPath: Int]()
392+
for input in swiftInputFiles {
393+
assignment[input] = 0
394+
}
395+
return BatchPartitions(assignment: assignment, partitions: [swiftInputFiles])
396+
}
391397

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

Tests/SwiftDriverTests/SwiftDriverTests.swift

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

938938
func testBatchModeCompiles() throws {
939-
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"])
940-
let plannedJobs = try driver1.planBuild()
941-
XCTAssertEqual(plannedJobs.count, 4)
942-
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
943-
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo1.o")))
944-
XCTAssertEqual(plannedJobs[1].outputs.count, 4)
945-
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
946-
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
947-
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
948-
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
949-
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
950-
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
939+
do {
940+
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"])
941+
let plannedJobs = try driver1.planBuild()
942+
XCTAssertEqual(plannedJobs.count, 4)
943+
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
944+
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo1.o")))
945+
XCTAssertEqual(plannedJobs[1].outputs.count, 4)
946+
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
947+
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
948+
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
949+
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
950+
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
951+
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
952+
}
953+
954+
// Test 1 partition results in 1 job
955+
do {
956+
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"])
957+
let plannedJobs = try driver.planBuild()
958+
XCTAssertEqual(plannedJobs.count, 1)
959+
var count = 0
960+
for arg in plannedJobs[0].commandLine where arg == .flag("-primary-file") {
961+
count += 1
962+
}
963+
XCTAssertEqual(count, 2)
964+
}
951965
}
952966

953967
func testSingleThreadedWholeModuleOptimizationCompiles() throws {

0 commit comments

Comments
 (0)