@@ -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