Skip to content

Commit c55c52f

Browse files
committed
[Explicit Module Builds][Target Variant] Refactor build planning to allow for a second, separte emit-module task for the target variant
This change allows builds that specify a variant triple and which must emit a target variant module to do so from within a single `swiftc` invocation when using Explicit Module Builds. This is an extensive refactor of the build planning procedure with respect to Explicit Module Builds: - Remove 'ExplicitDependencyBuildPlanner' global state from the 'Driver' instance - Instantiate a 'ExplicitDependencyBuildPlanner' instance at the beginning if build planning and propagate/thread this instance to all the required compilation task creation routines, all the way to 'addCommonFrontendOptions' - For '-target-variant' builds which emit a variant triple module, instantiate a whole separate explicit build planner, including performing a secondary dependency scan using the variant triple. Using this information: - Schedule variant triple module pre-compile dependency tasks - Schedule a variant triple PCH compilation task, if necessary - Schedule the variant emit-module task - Schedule the variant textual module verification task, if necessary
1 parent 6f91afb commit c55c52f

24 files changed

+483
-723
lines changed

Sources/SwiftDriver/Driver/Driver.swift

+7-50
Original file line numberDiff line numberDiff line change
@@ -341,38 +341,15 @@ public struct Driver {
341341
/// Original ObjC Header passed from command-line
342342
let originalObjCHeaderFile: VirtualPath.Handle?
343343

344-
345344
/// Enable bridging header chaining.
346345
let bridgingHeaderChaining: Bool
347346

348-
/// The path to the imported Objective-C header.
349-
lazy var importedObjCHeader: VirtualPath.Handle? = {
350-
assert(explicitDependencyBuildPlanner != nil ||
351-
!parsedOptions.hasArgument(.driverExplicitModuleBuild) ||
352-
!inputFiles.contains { $0.type == .swift },
353-
"should not be queried before scanning")
354-
let chainedBridgingHeader = try? explicitDependencyBuildPlanner?.getChainedBridgingHeaderFile()
355-
return try? computeImportedObjCHeader(&parsedOptions, compilerMode: compilerMode,
356-
chainedBridgingHeader: chainedBridgingHeader) ?? originalObjCHeaderFile
357-
}()
358-
359347
/// The directory to emit PCH file.
360348
lazy var bridgingPrecompiledHeaderOutputDir: VirtualPath? = {
361349
return try? computePrecompiledBridgingHeaderDir(&parsedOptions,
362350
compilerMode: compilerMode)
363351
}()
364352

365-
/// The path to the pch for the imported Objective-C header.
366-
lazy var bridgingPrecompiledHeader: VirtualPath.Handle? = {
367-
let contextHash = try? explicitDependencyBuildPlanner?.getMainModuleContextHash()
368-
return computeBridgingPrecompiledHeader(&parsedOptions,
369-
compilerMode: compilerMode,
370-
importedObjCHeader: importedObjCHeader,
371-
outputFileMap: outputFileMap,
372-
outputDirectory: bridgingPrecompiledHeaderOutputDir,
373-
contextHash: contextHash)
374-
}()
375-
376353
/// Path to the dependencies file.
377354
let dependenciesFilePath: VirtualPath.Handle?
378355

@@ -621,14 +598,6 @@ public struct Driver {
621598
/// The mode the API digester should run in.
622599
let digesterMode: DigesterMode
623600

624-
// FIXME: We should soon be able to remove this from being in the Driver's state.
625-
// Its only remaining use outside of actual dependency build planning is in
626-
// command-line input option generation for the explicit main module compile job.
627-
/// Planner for constructing module build jobs using Explicit Module Builds.
628-
/// Constructed during the planning phase only when all module dependencies will be prebuilt and treated
629-
/// as explicit inputs by the various compilation jobs.
630-
@_spi(Testing) public var explicitDependencyBuildPlanner: ExplicitDependencyBuildPlanner? = nil
631-
632601
/// A reference to the instance of libSwiftScan which is shared with the driver's
633602
/// `InterModuleDependencyOracle`, but also used for non-scanning tasks, such as target info
634603
/// and supported compiler feature queries
@@ -1365,9 +1334,9 @@ public struct Driver {
13651334
}
13661335

13671336
public mutating func planBuild() throws -> [Job] {
1368-
let (jobs, incrementalCompilationState, intermoduleDependencyGraph) = try planPossiblyIncrementalBuild()
1337+
let (jobs, incrementalCompilationState, explicitModulePlanner) = try planPossiblyIncrementalBuild()
13691338
self.incrementalCompilationState = incrementalCompilationState
1370-
self.intermoduleDependencyGraph = intermoduleDependencyGraph
1339+
self.intermoduleDependencyGraph = explicitModulePlanner?.dependencyGraph
13711340
return jobs
13721341
}
13731342
}
@@ -1756,11 +1725,9 @@ extension Diagnostic.Message {
17561725
}
17571726

17581727
extension Driver {
1759-
func explainModuleDependency(_ explainModuleName: String, allPaths: Bool) throws {
1760-
guard let dependencyPlanner = explicitDependencyBuildPlanner else {
1761-
fatalError("Cannot explain dependency without Explicit Build Planner")
1762-
}
1763-
guard let dependencyPaths = try dependencyPlanner.explainDependency(explainModuleName, allPaths: allPaths) else {
1728+
func explainModuleDependency(_ explainModuleName: String, allPaths: Bool,
1729+
moduleDependencyGraph: InterModuleDependencyGraph) throws {
1730+
guard let dependencyPaths = try moduleDependencyGraph.explainDependency(explainModuleName, allPaths: allPaths) else {
17641731
diagnosticEngine.emit(.remark("No such module dependency found: '\(explainModuleName)'"))
17651732
return
17661733
}
@@ -1832,13 +1799,6 @@ extension Driver {
18321799
return
18331800
}
18341801

1835-
// If we're only supposed to explain a dependency on a given module, do so now.
1836-
if let explainModuleName = parsedOptions.getLastArgument(.explainModuleDependencyDetailed) {
1837-
try explainModuleDependency(explainModuleName.asSingle, allPaths: true)
1838-
} else if let explainModuleNameDetailed = parsedOptions.getLastArgument(.explainModuleDependency) {
1839-
try explainModuleDependency(explainModuleNameDetailed.asSingle, allPaths: false)
1840-
}
1841-
18421802
if parsedOptions.contains(.driverPrintOutputFileMap) {
18431803
if let outputFileMap = self.outputFileMap {
18441804
stderrStream.send(outputFileMap.description)
@@ -2031,7 +1991,7 @@ extension Driver {
20311991

20321992
// Put bridging header as first input if we have it
20331993
let allInputs: [TypedVirtualPath]
2034-
if let objcHeader = importedObjCHeader, bridgingPrecompiledHeader != nil {
1994+
if let objcHeader = originalObjCHeaderFile {
20351995
allInputs = [TypedVirtualPath(file: objcHeader, type: .objcHeader)] + inputFiles
20361996
} else {
20371997
allInputs = inputFiles
@@ -2056,10 +2016,7 @@ extension Driver {
20562016
// All input action IDs for this action.
20572017
var inputIds = [UInt]()
20582018

2059-
var jobInputs = job.primaryInputs.isEmpty ? job.inputs : job.primaryInputs
2060-
if let pchPath = bridgingPrecompiledHeader, job.kind == .compile {
2061-
jobInputs.append(TypedVirtualPath(file: pchPath, type: .pch))
2062-
}
2019+
let jobInputs = job.primaryInputs.isEmpty ? job.inputs : job.primaryInputs
20632020
// Collect input job IDs.
20642021
for input in jobInputs {
20652022
if let id = inputIdMap[input] {

0 commit comments

Comments
 (0)