Skip to content

Commit 92a30a7

Browse files
artemcmxymus
authored andcommitted
Revert "Merge pull request swiftlang#225 from artemcm/BatchVersionedClangScan"
This reverts commit 0eb928a, reversing changes made to 2db7080.
1 parent e73a30e commit 92a30a7

File tree

5 files changed

+60
-158
lines changed

5 files changed

+60
-158
lines changed

Sources/SwiftDriver/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ add_library(SwiftDriver
1313
"Explicit Module Builds/ClangVersionedDependencyResolution.swift"
1414
"Explicit Module Builds/InterModuleDependencyGraph.swift"
1515
"Explicit Module Builds/ModuleDependencyScanning.swift"
16-
"Explicit Module Builds/SerializableModuleArtifacts.swift
16+
"Explicit Module Builds/ModuleArtifacts.swift"
1717

1818
Driver/CompilerMode.swift
1919
Driver/DebugInfo.swift

Sources/SwiftDriver/Execution/DriverExecutor.swift

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,15 @@ extension DriverExecutor {
5151
recordedInputModificationDates: recordedInputModificationDates)
5252

5353
if (result.exitStatus != .terminated(code: EXIT_SUCCESS)) {
54-
let returnCode = Self.computeReturnCode(exitStatus: result.exitStatus)
54+
let returnCode: Int
55+
switch result.exitStatus {
56+
case .terminated(let code):
57+
returnCode = Int(code)
58+
#if !os(Windows)
59+
case .signalled(let signal):
60+
returnCode = Int(signal)
61+
#endif
62+
}
5563
throw JobExecutionError.jobFailedWithNonzeroExitCode(returnCode, try result.utf8stderrOutput())
5664
}
5765
guard let outputData = try? Data(result.utf8Output().utf8) else {
@@ -60,19 +68,6 @@ extension DriverExecutor {
6068

6169
return try JSONDecoder().decode(outputType, from: outputData)
6270
}
63-
64-
static func computeReturnCode(exitStatus: ProcessResult.ExitStatus) -> Int {
65-
var returnCode: Int
66-
switch exitStatus {
67-
case .terminated(let code):
68-
returnCode = Int(code)
69-
#if !os(Windows)
70-
case .signalled(let signal):
71-
returnCode = Int(signal)
72-
#endif
73-
}
74-
return returnCode
75-
}
7671
}
7772

7873
public protocol JobExecutionDelegate {

Sources/SwiftDriver/Explicit Module Builds/ClangVersionedDependencyResolution.swift

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Foundation
14-
import TSCBasic
1514

1615
/// A map from a module identifier to a set of module dependency graphs
1716
/// Used to compute distinct graphs corresponding to different target versions for a given clang module
@@ -31,31 +30,19 @@ internal extension Driver {
3130
// to all Clang modules, and compute a set of distinct PCMArgs across all paths to a
3231
// given Clang module in the graph.
3332
let modulePCMArgsSetMap = try dependencyGraph.computePCMArgSetsForClangModules()
34-
let temporaryDirectory = try determineTempDirectory()
35-
let batchScanInputList =
36-
try modulePCMArgsSetMap.compactMap { (moduleId, pcmArgsSet) throws -> [BatchScanModuleInfo] in
37-
var moduleInfos: [BatchScanModuleInfo] = []
38-
for pcmArgs in pcmArgsSet {
39-
var hasher = Hasher()
40-
pcmArgs.forEach { hasher.combine($0) }
41-
// Generate a filepath for the output dependency graph
42-
let moduleDependencyGraphPath =
43-
temporaryDirectory.appending(component: moduleId.moduleName +
44-
String(hasher.finalize()) +
45-
"-dependencies.json")
46-
let moduleBatchInfo =
47-
BatchScanModuleInfo.clang(
48-
BatchScanClangModuleInfo(moduleName: moduleId.moduleName,
49-
pcmArgs: pcmArgs.joined(separator: " "),
50-
outputPath: moduleDependencyGraphPath.description))
51-
moduleInfos.append(moduleBatchInfo)
33+
var moduleVersionedGraphMap: [ModuleDependencyId: [InterModuleDependencyGraph]] = [:]
34+
for (moduleId, pcmArgSet) in modulePCMArgsSetMap {
35+
for pcmArgs in pcmArgSet {
36+
let pcmSpecificDepGraph = try scanClangModule(moduleId: moduleId,
37+
pcmArgs: pcmArgs)
38+
if moduleVersionedGraphMap[moduleId] != nil {
39+
moduleVersionedGraphMap[moduleId]!.append(pcmSpecificDepGraph)
40+
} else {
41+
moduleVersionedGraphMap[moduleId] = [pcmSpecificDepGraph]
5242
}
53-
return moduleInfos
54-
}.reduce([], +)
43+
}
44+
}
5545

56-
// Batch scan all clang modules for each discovered unique set of PCMArgs, per module
57-
let moduleVersionedGraphMap: [ModuleDependencyId: [InterModuleDependencyGraph]] =
58-
try performBatchDependencyScan(moduleInfos: batchScanInputList)
5946
try dependencyGraph.resolveVersionedClangModules(using: moduleVersionedGraphMap)
6047
}
6148
}

Sources/SwiftDriver/Explicit Module Builds/SerializableModuleArtifacts.swift renamed to Sources/SwiftDriver/Explicit Module Builds/ModuleArtifacts.swift

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Foundation
1616
/// - Swift Module Path
1717
/// - Swift Doc Path
1818
/// - Swift Source Info Path
19-
@_spi(Testing) public struct SwiftModuleArtifactInfo: Codable {
19+
public struct SwiftModuleArtifactInfo: Codable {
2020
/// The module's name
2121
public let moduleName: String
2222
/// The path for the module's .swiftmodule file
@@ -42,7 +42,7 @@ import Foundation
4242
/// - Clang Module (name)
4343
/// - Clang Module (PCM) Path
4444
/// - Clang Module Map Path
45-
@_spi(Testing) public struct ClangModuleArtifactInfo: Codable {
45+
public struct ClangModuleArtifactInfo {
4646
/// The module's name
4747
public let moduleName: String
4848
/// The path for the module's .pcm file
@@ -56,46 +56,3 @@ import Foundation
5656
self.moduleMapPath = moduleMapPath
5757
}
5858
}
59-
60-
/// Describes a given module's batch dependency scanning input info
61-
/// - Module Name
62-
/// - Extra PCM build arguments (for Clang modules only)
63-
/// - Dependency graph output path
64-
internal enum BatchScanModuleInfo: Encodable {
65-
case swift(BatchScanSwiftModuleInfo)
66-
case clang(BatchScanClangModuleInfo)
67-
}
68-
69-
internal struct BatchScanSwiftModuleInfo: Encodable {
70-
var swiftModuleName: String
71-
var output: String
72-
73-
init(moduleName: String, outputPath: String) {
74-
self.swiftModuleName = moduleName
75-
self.output = outputPath
76-
}
77-
}
78-
79-
internal struct BatchScanClangModuleInfo: Encodable {
80-
var clangModuleName: String
81-
var arguments: String
82-
var output: String
83-
84-
init(moduleName: String, pcmArgs: String, outputPath: String) {
85-
self.clangModuleName = moduleName
86-
self.arguments = pcmArgs
87-
self.output = outputPath
88-
}
89-
}
90-
91-
internal extension BatchScanModuleInfo {
92-
func encode(to encoder: Encoder) throws {
93-
var container = encoder.singleValueContainer()
94-
switch self {
95-
case .swift(let swiftInfo):
96-
try container.encode(swiftInfo)
97-
case .clang(let clangInfo):
98-
try container.encode(clangInfo)
99-
}
100-
}
101-
}

Sources/SwiftDriver/Explicit Module Builds/ModuleDependencyScanning.swift

Lines changed: 37 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ extension Driver {
2424
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
2525
commandLine.appendFlag("-frontend")
2626
commandLine.appendFlag("-scan-dependencies")
27+
if parsedOptions.hasArgument(.parseStdlib) {
28+
commandLine.appendFlag(.disableObjcAttrRequiresFoundationModule)
29+
}
2730
try addCommonFrontendOptions(commandLine: &commandLine, inputs: &inputs,
2831
bridgingHeaderHandling: .precompiled,
2932
moduleDependencyGraphUse: .dependencyScan)
@@ -72,105 +75,65 @@ extension Driver {
7275
return placeholderMapFilePath
7376
}
7477

75-
mutating func performBatchDependencyScan(moduleInfos: [BatchScanModuleInfo])
76-
throws -> [ModuleDependencyId: [InterModuleDependencyGraph]] {
77-
let batchScanningJob = try batchDependencyScanningJob(for: moduleInfos)
78-
let forceResponseFiles = parsedOptions.hasArgument(.driverForceResponseFiles)
79-
let batchScanResult =
80-
try self.executor.execute(job: batchScanningJob,
81-
forceResponseFiles: forceResponseFiles,
82-
recordedInputModificationDates: recordedInputModificationDates)
83-
let success = batchScanResult.exitStatus == .terminated(code: EXIT_SUCCESS)
84-
guard success else {
85-
throw JobExecutionError.jobFailedWithNonzeroExitCode(
86-
SwiftDriverExecutor.computeReturnCode(exitStatus: batchScanResult.exitStatus),
87-
try batchScanResult.utf8stderrOutput())
88-
}
89-
90-
// Decode the resulting dependency graphs and build a dictionary from a moduleId to
91-
// a set of dependency graphs that were built for it
92-
let moduleVersionedGraphMap =
93-
try moduleInfos.reduce(into: [ModuleDependencyId: [InterModuleDependencyGraph]]()) {
94-
let moduleId: ModuleDependencyId
95-
let dependencyGraphPath: VirtualPath
96-
switch $1 {
97-
case .swift(let swiftModuleBatchScanInfo):
98-
moduleId = .swift(swiftModuleBatchScanInfo.swiftModuleName)
99-
dependencyGraphPath = try VirtualPath(path: swiftModuleBatchScanInfo.output)
100-
case .clang(let clangModuleBatchScanInfo):
101-
moduleId = .clang(clangModuleBatchScanInfo.clangModuleName)
102-
dependencyGraphPath = try VirtualPath(path: clangModuleBatchScanInfo.output)
103-
}
104-
let contents = try fileSystem.readFileContents(dependencyGraphPath)
105-
let decodedGraph = try JSONDecoder().decode(InterModuleDependencyGraph.self,
106-
from: Data(contents.contents))
107-
if $0[moduleId] != nil {
108-
$0[moduleId]!.append(decodedGraph)
109-
} else {
110-
$0[moduleId] = [decodedGraph]
111-
}
112-
}
113-
return moduleVersionedGraphMap
114-
}
115-
116-
/// Precompute the dependencies for a given collection of modules using swift frontend's batch scanning mode
117-
mutating func batchDependencyScanningJob(for moduleInfos: [BatchScanModuleInfo]) throws -> Job {
78+
/// Compute the dependencies for a given Clang module, by invoking the Clang dependency scanning action
79+
/// with the given module's name and a set of arguments (including the target version)
80+
mutating func clangDependencyScanningJob(moduleId: ModuleDependencyId,
81+
pcmArgs: [String]) throws -> Job {
11882
var inputs: [TypedVirtualPath] = []
11983

12084
// Aggregate the fast dependency scanner arguments
12185
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
12286
commandLine.appendFlag("-frontend")
123-
// The dependency scanner automatically operates in batch mode if -batch-scan-input-file
124-
// is present.
125-
commandLine.appendFlag("-scan-dependencies")
87+
commandLine.appendFlag("-scan-clang-dependencies")
88+
12689
try addCommonFrontendOptions(commandLine: &commandLine, inputs: &inputs,
12790
bridgingHeaderHandling: .precompiled,
12891
moduleDependencyGraphUse: .dependencyScan)
12992

130-
let batchScanInputFilePath = try serializeBatchScanningModuleArtifacts(moduleInfos: moduleInfos)
131-
commandLine.appendFlag("-batch-scan-input-file")
132-
commandLine.appendPath(batchScanInputFilePath)
93+
// Ensure the `-target` option is inherited from the dependent Swift module's PCM args
94+
if let targetOptionIndex = pcmArgs.firstIndex(of: Option.target.spelling) {
95+
// PCM args are formulated as Clang command line options specified with:
96+
// -Xcc <option> -Xcc <option_value>
97+
assert(pcmArgs.count > targetOptionIndex + 1 && pcmArgs[targetOptionIndex + 1] == "-Xcc")
98+
let pcmArgTriple = Triple(pcmArgs[targetOptionIndex + 2])
99+
// Override the invocation's default target argument by appending the one extracted from
100+
// the pcmArgs
101+
commandLine.appendFlag(.target)
102+
commandLine.appendFlag(pcmArgTriple.triple)
103+
}
104+
105+
// Add the PCM args specific to this scan
106+
pcmArgs.forEach { commandLine.appendFlags($0) }
133107

134108
// This action does not require any input files, but all frontend actions require
135109
// at least one input so pick any input of the current compilation.
136110
let inputFile = inputFiles.first { $0.type == .swift }
137111
commandLine.appendPath(inputFile!.file)
138112
inputs.append(inputFile!)
139113

140-
// This job's outputs are defined as a set of dependency graph json files
141-
let outputs: [TypedVirtualPath] = try moduleInfos.map {
142-
switch $0 {
143-
case .swift(let swiftModuleBatchScanInfo):
144-
return TypedVirtualPath(file: try VirtualPath(path: swiftModuleBatchScanInfo.output),
145-
type: .jsonDependencies)
146-
case .clang(let clangModuleBatchScanInfo):
147-
return TypedVirtualPath(file: try VirtualPath(path: clangModuleBatchScanInfo.output),
148-
type: .jsonDependencies)
149-
}
150-
}
151-
114+
commandLine.appendFlags("-module-name", moduleId.moduleName)
152115
// Construct the scanning job.
153116
return Job(moduleName: moduleOutputInfo.name,
154-
kind: .scanDependencies,
117+
kind: .scanClangDependencies,
155118
tool: VirtualPath.absolute(try toolchain.getToolPath(.swiftCompiler)),
156119
commandLine: commandLine,
157120
displayInputs: inputs,
158121
inputs: inputs,
159-
outputs: outputs,
122+
outputs: [TypedVirtualPath(file: .standardOutput, type: .jsonDependencies)],
160123
supportsResponseFiles: true)
161124
}
162125

163-
/// Serialize a collection of modules into an input format expected by the batch module dependency scanner.
164-
func serializeBatchScanningModuleArtifacts(moduleInfos: [BatchScanModuleInfo])
165-
throws -> AbsolutePath {
166-
let temporaryDirectory = try determineTempDirectory()
167-
let batchScanInputFilePath =
168-
temporaryDirectory.appending(component: "\(moduleOutputInfo.name)-batch-module-scan.json")
126+
mutating func scanClangModule(moduleId: ModuleDependencyId, pcmArgs: [String])
127+
throws -> InterModuleDependencyGraph {
128+
let clangDependencyScannerJob = try clangDependencyScanningJob(moduleId: moduleId,
129+
pcmArgs: pcmArgs)
130+
let forceResponseFiles = parsedOptions.hasArgument(.driverForceResponseFiles)
169131

170-
let encoder = JSONEncoder()
171-
encoder.outputFormatting = [.prettyPrinted]
172-
let contents = try encoder.encode(moduleInfos)
173-
try fileSystem.writeFileContents(batchScanInputFilePath, bytes: ByteString(contents))
174-
return batchScanInputFilePath
132+
let dependencyGraph =
133+
try self.executor.execute(job: clangDependencyScannerJob,
134+
capturingJSONOutputAs: InterModuleDependencyGraph.self,
135+
forceResponseFiles: forceResponseFiles,
136+
recordedInputModificationDates: recordedInputModificationDates)
137+
return dependencyGraph
175138
}
176139
}

0 commit comments

Comments
 (0)