Skip to content

Commit 892db06

Browse files
authored
Merge pull request #649 from xymus/emit-module-verify-5.5
[5.5] Verify module interfaces generated from emit-module jobs
2 parents 69863e6 + 9fefa95 commit 892db06

File tree

2 files changed

+61
-10
lines changed

2 files changed

+61
-10
lines changed

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ extension Driver {
139139

140140
try addPrecompileModuleDependenciesJobs(addJob: addJobBeforeCompiles)
141141
try addPrecompileBridgingHeaderJob(addJob: addJobBeforeCompiles)
142-
try addEmitModuleJob(addJob: addJobBeforeCompiles)
142+
try addEmitModuleJob(addJobBeforeCompiles: addJobBeforeCompiles, addJobAfterCompiles: addJobAfterCompiles)
143143
let linkerInputs = try addJobsFeedingLinker(
144144
addJobBeforeCompiles: addJobBeforeCompiles,
145145
addCompileJobGroup: addCompileJobGroup,
@@ -175,9 +175,11 @@ extension Driver {
175175
)
176176
}
177177

178-
private mutating func addEmitModuleJob(addJob: (Job) -> Void) throws {
178+
private mutating func addEmitModuleJob(addJobBeforeCompiles: (Job) -> Void, addJobAfterCompiles: (Job) -> Void) throws {
179179
if shouldCreateEmitModuleJob {
180-
addJob( try emitModuleJob() )
180+
let emitModuleJob = try emitModuleJob()
181+
addJobBeforeCompiles(emitModuleJob)
182+
try addVerifyJobs(emitModuleJob: emitModuleJob, addJob: addJobAfterCompiles)
181183
}
182184
}
183185

@@ -213,9 +215,11 @@ extension Driver {
213215
}
214216
}
215217

216-
try addSingleCompileJobs(addJob: addJobBeforeCompiles,
218+
if let compileJob = try addSingleCompileJobs(addJob: addJobBeforeCompiles,
217219
addJobOutputs: addJobOutputs,
218-
emitModuleTrace: loadedModuleTracePath != nil)
220+
emitModuleTrace: loadedModuleTracePath != nil) {
221+
try addVerifyJobs(emitModuleJob: compileJob, addJob: addJobAfterCompiles)
222+
}
219223

220224
try addJobsForPrimaryInputs(
221225
addCompileJobGroup: addCompileJobGroup,
@@ -231,7 +235,7 @@ extension Driver {
231235
moduleInputs: moduleInputs,
232236
moduleInputsFromJobOutputs: moduleInputsFromJobOutputs) {
233237
addJobAfterCompiles(mergeJob)
234-
try addVerifyJobs(mergeJob: mergeJob, addJob: addJobAfterCompiles)
238+
try addVerifyJobs(emitModuleJob: mergeJob, addJob: addJobAfterCompiles)
235239
try addWrapJobOrMergeOutputs(
236240
mergeJob: mergeJob,
237241
debugInfo: debugInfo,
@@ -241,13 +245,15 @@ extension Driver {
241245
return linkerInputs
242246
}
243247

248+
/// When in single compile, add one compile job and possiblity multiple backend jobs.
249+
/// Return the compile job if one was created.
244250
private mutating func addSingleCompileJobs(
245251
addJob: (Job) -> Void,
246252
addJobOutputs: ([TypedVirtualPath]) -> Void,
247253
emitModuleTrace: Bool
248-
) throws {
254+
) throws -> Job? {
249255
guard case .singleCompile = compilerMode
250-
else { return }
256+
else { return nil }
251257

252258
if parsedOptions.hasArgument(.embedBitcode),
253259
inputFiles.allSatisfy({ $0.type.isPartOfSwiftCompilation }) {
@@ -262,6 +268,7 @@ extension Driver {
262268
: nil
263269
}
264270
backendJobs.forEach(addJob)
271+
return compile
265272
} else {
266273
// We can skip the compile jobs if all we want is a module when it's
267274
// built separately.
@@ -270,6 +277,7 @@ extension Driver {
270277
addJobOutputs: addJobOutputs,
271278
emitModuleTrace: emitModuleTrace)
272279
addJob(compile)
280+
return compile
273281
}
274282
}
275283

@@ -387,7 +395,7 @@ extension Driver {
387395
return try mergeModuleJob(inputs: moduleInputs, inputsFromOutputs: moduleInputsFromJobOutputs)
388396
}
389397

390-
private mutating func addVerifyJobs(mergeJob: Job, addJob: (Job) -> Void )
398+
private mutating func addVerifyJobs(emitModuleJob: Job, addJob: (Job) -> Void )
391399
throws {
392400
guard
393401
parsedOptions.hasArgument(.enableLibraryEvolution),
@@ -405,7 +413,7 @@ extension Driver {
405413

406414
let outputType: FileType =
407415
forPrivate ? .privateSwiftInterface : .swiftInterface
408-
let mergeInterfaceOutputs = mergeJob.outputs.filter { $0.type == outputType }
416+
let mergeInterfaceOutputs = emitModuleJob.outputs.filter { $0.type == outputType }
409417
assert(mergeInterfaceOutputs.count == 1,
410418
"Merge module job should only have one swiftinterface output")
411419
let job = try verifyModuleInterfaceJob(interfaceInput: mergeInterfaceOutputs[0])

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3592,13 +3592,56 @@ final class SwiftDriverTests: XCTestCase {
35923592
XCTAssertTrue(verifyJob.outputs.isEmpty)
35933593
XCTAssertTrue(verifyJob.commandLine.contains(.path(mergeInterfaceOutputs[0].file)))
35943594
}
3595+
35953596
// No Evolution
35963597
do {
35973598
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-module-name",
35983599
"foo", "-emit-module-interface", "-verify-emitted-module-interface"])
35993600
let plannedJobs = try driver.planBuild()
36003601
XCTAssertEqual(plannedJobs.count, 2)
36013602
}
3603+
3604+
// Emit-module separately
3605+
do {
3606+
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-module-name",
3607+
"foo", "-emit-module-interface",
3608+
"-verify-emitted-module-interface",
3609+
"-enable-library-evolution",
3610+
"-experimental-emit-module-separately"])
3611+
let plannedJobs = try driver.planBuild()
3612+
XCTAssertEqual(plannedJobs.count, 2)
3613+
let emitJob = plannedJobs[0]
3614+
let verifyJob = plannedJobs[1]
3615+
XCTAssertEqual(emitJob.kind, .emitModule)
3616+
let emitInterfaceOutput = emitJob.outputs.filter { $0.type == .swiftInterface }
3617+
XCTAssertTrue(emitInterfaceOutput.count == 1,
3618+
"Emit module job should only have one swiftinterface output")
3619+
XCTAssertEqual(verifyJob.kind, .verifyModuleInterface)
3620+
XCTAssertTrue(verifyJob.inputs.count == 1)
3621+
XCTAssertTrue(verifyJob.inputs[0] == emitInterfaceOutput[0])
3622+
XCTAssertTrue(verifyJob.commandLine.contains(.path(emitInterfaceOutput[0].file)))
3623+
}
3624+
3625+
// Whole-module
3626+
do {
3627+
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-module-name",
3628+
"foo", "-emit-module-interface",
3629+
"-verify-emitted-module-interface",
3630+
"-enable-library-evolution",
3631+
"-whole-module-optimization"])
3632+
let plannedJobs = try driver.planBuild()
3633+
XCTAssertEqual(plannedJobs.count, 2)
3634+
let emitJob = plannedJobs[0]
3635+
let verifyJob = plannedJobs[1]
3636+
XCTAssertEqual(emitJob.kind, .compile)
3637+
let emitInterfaceOutput = emitJob.outputs.filter { $0.type == .swiftInterface }
3638+
XCTAssertTrue(emitInterfaceOutput.count == 1,
3639+
"Emit module job should only have one swiftinterface output")
3640+
XCTAssertEqual(verifyJob.kind, .verifyModuleInterface)
3641+
XCTAssertTrue(verifyJob.inputs.count == 1)
3642+
XCTAssertTrue(verifyJob.inputs[0] == emitInterfaceOutput[0])
3643+
XCTAssertTrue(verifyJob.commandLine.contains(.path(emitInterfaceOutput[0].file)))
3644+
}
36023645
}
36033646

36043647
func testPCHGeneration() throws {

0 commit comments

Comments
 (0)