Skip to content

Commit 18ab0ce

Browse files
authored
Merge pull request #849 from xymus/prepare-emit-module-5.5
[5.5] Bug fixes and test updates for emit-module-separately
2 parents 012962e + 5be9174 commit 18ab0ce

File tree

5 files changed

+113
-64
lines changed

5 files changed

+113
-64
lines changed

Sources/SwiftDriver/Jobs/EmitModuleJob.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,15 @@ extension Driver {
3333
addSupplementalOutput(path: objcGeneratedHeaderPath, flag: "-emit-objc-header-path", type: .objcHeader)
3434
addSupplementalOutput(path: tbdPath, flag: "-emit-tbd-path", type: .tbd)
3535

36-
if isMergeModule || shouldCreateEmitModuleJob {
36+
if isMergeModule {
3737
return
3838
}
39+
40+
// Skip files created by other jobs when emitting a module and building at the same time
41+
if shouldCreateEmitModuleJob && compilerOutputType != .swiftModule {
42+
return
43+
}
44+
3945
// Add outputs that can't be merged
4046
addSupplementalOutput(path: serializedDiagnosticsFilePath, flag: "-serialize-diagnostics-path", type: .diagnostics)
4147
if let dependenciesFilePath = dependenciesFilePath {
@@ -103,7 +109,9 @@ extension Driver {
103109

104110
/// Returns true if the -emit-module-separately is active.
105111
mutating func shouldEmitModuleSeparately() -> Bool {
106-
return parsedOptions.hasArgument(.emitModuleSeparately)
112+
return parsedOptions.hasFlag(positive: .emitModuleSeparately,
113+
negative: .noEmitModuleSeparately,
114+
default: false)
107115
&& !parsedOptions.hasFlag(positive: .wholeModuleOptimization,
108116
negative: .noWholeModuleOptimization,
109117
default: false)

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ extension Driver {
142142

143143
try addPrecompileModuleDependenciesJobs(addJob: addJobBeforeCompiles)
144144
try addPrecompileBridgingHeaderJob(addJob: addJobBeforeCompiles)
145-
try addEmitModuleJob(addJobBeforeCompiles: addJobBeforeCompiles, addJobAfterCompiles: addJobAfterCompiles)
146145
let linkerInputs = try addJobsFeedingLinker(
147146
addJobBeforeCompiles: addJobBeforeCompiles,
148147
addCompileJobGroup: addCompileJobGroup,
@@ -179,12 +178,13 @@ extension Driver {
179178
)
180179
}
181180

182-
private mutating func addEmitModuleJob(addJobBeforeCompiles: (Job) -> Void, addJobAfterCompiles: (Job) -> Void) throws {
181+
private mutating func addEmitModuleJob(addJobBeforeCompiles: (Job) -> Void) throws -> Job? {
183182
if shouldCreateEmitModuleJob {
184183
let emitJob = try emitModuleJob()
185184
addJobBeforeCompiles(emitJob)
186-
try addVerifyJobs(emitModuleJob: emitJob, addJob: addJobAfterCompiles)
185+
return emitJob
187186
}
187+
return nil
188188
}
189189

190190
private mutating func addJobsFeedingLinker(
@@ -219,10 +219,32 @@ extension Driver {
219219
}
220220
}
221221

222+
// Ensure that only one job emits the module files and insert a verify swiftinterface job
223+
var jobCreatingSwiftModule: Job? = nil
224+
func addPostModuleFilesJobs(_ emitModuleJob: Job) throws {
225+
// We should only emit module files from one job
226+
assert(jobCreatingSwiftModule == nil)
227+
jobCreatingSwiftModule = emitModuleJob
228+
229+
try addVerifyJobs(emitModuleJob: emitModuleJob, addJob: addJobAfterCompiles)
230+
}
231+
232+
// Whole-module
222233
if let compileJob = try addSingleCompileJobs(addJob: addJobBeforeCompiles,
223234
addJobOutputs: addJobOutputs,
224235
emitModuleTrace: loadedModuleTracePath != nil) {
225-
try addVerifyJobs(emitModuleJob: compileJob, addJob: addJobAfterCompiles)
236+
try addPostModuleFilesJobs(compileJob)
237+
}
238+
239+
// Emit-module-separately
240+
if let emitModuleJob = try addEmitModuleJob(addJobBeforeCompiles: addJobBeforeCompiles) {
241+
try addPostModuleFilesJobs(emitModuleJob)
242+
243+
try addWrapJobOrMergeOutputs(
244+
mergeJob: emitModuleJob,
245+
debugInfo: debugInfo,
246+
addJob: addJobAfterCompiles,
247+
addLinkerInput: addLinkerInput)
226248
}
227249

228250
try addJobsForPrimaryInputs(
@@ -235,11 +257,13 @@ extension Driver {
235257
addLinkerInput: addLinkerInput,
236258
addJob: addJobAfterCompiles)
237259

260+
// Merge-module
238261
if let mergeJob = try mergeModuleJob(
239262
moduleInputs: moduleInputs,
240263
moduleInputsFromJobOutputs: moduleInputsFromJobOutputs) {
241264
addJobAfterCompiles(mergeJob)
242-
try addVerifyJobs(emitModuleJob: mergeJob, addJob: addJobAfterCompiles)
265+
try addPostModuleFilesJobs(mergeJob)
266+
243267
try addWrapJobOrMergeOutputs(
244268
mergeJob: mergeJob,
245269
debugInfo: debugInfo,
@@ -394,7 +418,8 @@ extension Driver {
394418
) throws -> Job? {
395419
guard moduleOutputInfo.output != nil,
396420
!(moduleInputs.isEmpty && moduleInputsFromJobOutputs.isEmpty),
397-
compilerMode.usesPrimaryFileInputs
421+
compilerMode.usesPrimaryFileInputs,
422+
!shouldCreateEmitModuleJob
398423
else { return nil }
399424
return try mergeModuleJob(inputs: moduleInputs, inputsFromOutputs: moduleInputsFromJobOutputs)
400425
}

Sources/SwiftOptions/ExtraOptions.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extension Option {
1515
public static let driverScanDependenciesNonLib: Option = Option("-nonlib-dependency-scanner", .flag, attributes: [.helpHidden], helpText: "Use calls to `swift-frontend -scan-dependencies` instead of dedicated dependency scanning library")
1616
public static let driverWarnUnusedOptions: Option = Option("-driver-warn-unused-options", .flag, attributes: [.helpHidden], helpText: "Emit warnings for any provided options which are unused by the driver")
1717
public static let emitModuleSeparately: Option = Option("-experimental-emit-module-separately", .flag, attributes: [.helpHidden], helpText: "Emit module files as a distinct job")
18+
public static let noEmitModuleSeparately: Option = Option("-no-emit-module-separately", .flag, attributes: [.helpHidden], helpText: "Force using merge-module as the incremental build mode")
1819
public static let useFrontendParseableOutput: Option = Option("-use-frontend-parseable-output", .flag, attributes: [.helpHidden], helpText: "Emit parseable-output from swift-frontend jobs instead of from the driver")
1920

2021
// API digester operations
@@ -32,6 +33,7 @@ extension Option {
3233
Option.driverScanDependenciesNonLib,
3334
Option.driverWarnUnusedOptions,
3435
Option.emitModuleSeparately,
36+
Option.noEmitModuleSeparately,
3537
Option.useFrontendParseableOutput,
3638
Option.emitDigesterBaseline,
3739
Option.emitDigesterBaselinePath,

Tests/SwiftDriverTests/ParsableMessageTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ final class ParsableMessageTests: XCTestCase {
123123
try withTemporaryDirectory { path in
124124
try withHijackedBufferedErrorStream(in: path) { errorBuffer in
125125
let resolver = try ArgsResolver(fileSystem: localFileSystem)
126-
var driver = try Driver(args: ["swiftc", "-emit-module", "-o", "test.swiftmodule",
126+
var driver = try Driver(args: ["swiftc", "-o", "test.o",
127127
"main.swift", "test1.swift", "test2.swift",
128128
"-enable-batch-mode", "-driver-batch-count", "1",
129129
"-working-directory", "/WorkDir"])
@@ -201,7 +201,7 @@ final class ParsableMessageTests: XCTestCase {
201201
var toolDelegate: ToolExecutionDelegate?
202202
try withHijackedBufferedErrorStream(in: path) { errorBuffer in
203203
let resolver = try ArgsResolver(fileSystem: localFileSystem)
204-
var driver = try Driver(args: ["swiftc", "-emit-module", "-o", "test.swiftmodule",
204+
var driver = try Driver(args: ["swiftc", "-o", "test.o",
205205
"main.swift", "test1.swift", "test2.swift",
206206
"-enable-batch-mode", "-driver-batch-count", "1",
207207
"-working-directory", "/WorkDir"])
@@ -278,7 +278,7 @@ final class ParsableMessageTests: XCTestCase {
278278
var toolDelegate: ToolExecutionDelegate?
279279
try withHijackedBufferedErrorStream(in: path) { errorBuffer in
280280
let resolver = try ArgsResolver(fileSystem: localFileSystem)
281-
var driver = try Driver(args: ["swiftc", "-emit-module", "-o", "test.swiftmodule",
281+
var driver = try Driver(args: ["swiftc", "-o", "test.o",
282282
"main.swift", "test1.swift", "test2.swift",
283283
"-enable-batch-mode", "-driver-batch-count", "1",
284284
"-working-directory", "/WorkDir"])

0 commit comments

Comments
 (0)