Skip to content

Commit e31e98f

Browse files
[ExplicitModule] Support direct cc1 flag for all explicit module build jobs
Update swift-driver to support directly instantiate clang importer in all jobs with cc1 flags. In the new mode, swift dependency scanner will return all the cc1 flags to the actual compilation doesn't need to run clang driver again. In this mode, swift-driver should avoid forwarding Xcc command-line options since those are expected to be clang driver args, not cc1 args.
1 parent 6bf6442 commit e31e98f

File tree

2 files changed

+48
-20
lines changed

2 files changed

+48
-20
lines changed

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

+21-7
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ extension Driver {
101101
jobNeedPathRemap = false
102102
}
103103

104+
// Check if dependency scanner has put the job into direct clang cc1 mode.
105+
// If dependency scanner put us into direct cc1 mode, avoid adding `-Xcc` options, since
106+
// dependency scanner already adds needed flags and -Xcc options known by swift-driver are
107+
// clang driver flags but not it requires cc1 flags.
108+
let directModuleCC1Mode = commandLine.contains(Job.ArgTemplate.flag("-direct-clang-cc1-module-build"))
109+
func appendXccFlag(_ flag: String) {
110+
guard !directModuleCC1Mode else { return }
111+
commandLine.appendFlag(.Xcc)
112+
commandLine.appendFlag(flag)
113+
}
114+
104115
if let variant = parsedOptions.getLastArgument(.targetVariant)?.asSingle {
105116
commandLine.appendFlag(.targetVariant)
106117
commandLine.appendFlag(Triple(variant, normalizing: true).triple)
@@ -125,8 +136,7 @@ extension Driver {
125136
try commandLine.appendLast(.enableExperimentalCxxInterop, from: &parsedOptions)
126137
try commandLine.appendLast(.cxxInteroperabilityMode, from: &parsedOptions)
127138
if let stdlibVariant = parsedOptions.getLastArgument(.experimentalCxxStdlib)?.asSingle {
128-
commandLine.appendFlag("-Xcc")
129-
commandLine.appendFlag("-stdlib=\(stdlibVariant)")
139+
appendXccFlag("-stdlib=\(stdlibVariant)")
130140
}
131141

132142
if isEmbeddedEnabled && parsedOptions.hasArgument(.enableLibraryEvolution) {
@@ -173,8 +183,7 @@ extension Driver {
173183
try commandLine.appendAll(.vfsoverlay, from: &parsedOptions)
174184

175185
if let gccToolchain = parsedOptions.getLastArgument(.gccToolchain) {
176-
commandLine.appendFlag(.Xcc)
177-
commandLine.appendFlag("--gcc-toolchain=\(gccToolchain.asSingle)")
186+
appendXccFlag("--gcc-toolchain=\(gccToolchain.asSingle)")
178187
}
179188

180189
try commandLine.appendLast(.AssertConfig, from: &parsedOptions)
@@ -272,6 +281,11 @@ extension Driver {
272281
if isFrontendArgSupported(.strictConcurrency) {
273282
try commandLine.appendLast(.strictConcurrency, from: &parsedOptions)
274283
}
284+
if kind == .scanDependencies,
285+
isFrontendArgSupported(.experimentalClangImporterDirectCc1Scan) {
286+
try commandLine.appendAll(
287+
.experimentalClangImporterDirectCc1Scan, from: &parsedOptions)
288+
}
275289

276290
// Expand the -experimental-hermetic-seal-at-link flag
277291
if parsedOptions.hasArgument(.experimentalHermeticSealAtLink) {
@@ -332,7 +346,7 @@ extension Driver {
332346
try commandLine.appendLast(.disableSandbox, from: &parsedOptions)
333347
}
334348

335-
if !(isCachingEnabled && useClangIncludeTree), let workingDirectory = workingDirectory {
349+
if !directModuleCC1Mode, let workingDirectory = workingDirectory {
336350
// Add -Xcc -working-directory before any other -Xcc options to ensure it is
337351
// overridden by an explicit -Xcc -working-directory, although having a
338352
// different working directory is probably incorrect.
@@ -402,8 +416,8 @@ extension Driver {
402416
// Pass through any subsystem flags.
403417
try commandLine.appendAll(.Xllvm, from: &parsedOptions)
404418

405-
// If using clang-include-tree, `-Xcc` should only be passed to scanDependencies job.
406-
if (kind == .scanDependencies) || !(isCachingEnabled && useClangIncludeTree) {
419+
// Pass through all -Xcc flags if not under directModuleCC1Mode.
420+
if !directModuleCC1Mode {
407421
try commandLine.appendAll(.Xcc, from: &parsedOptions)
408422
}
409423

0 commit comments

Comments
 (0)