Skip to content

Commit eb65ca0

Browse files
committed
generatePCH: Add -frontend, reorder flags to more closely match cpp driver. compile: Add -pch-output-dir
1 parent 52eff70 commit eb65ca0

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,9 @@ extension Driver {
161161
if requestPrecompiledObjCHeader, let pch = bridgingPrecompiledHeader {
162162
if parsedOptions.contains(.pchOutputDir) {
163163
commandLine.appendPath(importedObjCHeader)
164-
switch compilerMode {
165-
case .standardCompile, .batchCompile, .repl, .immediate:
164+
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
165+
if !compilerMode.isSingleCompilation {
166166
commandLine.appendFlag(.pchDisableValidation)
167-
case .singleCompile:
168-
// Don't disable validation for single compile
169-
break
170167
}
171168
} else {
172169
commandLine.appendPath(pch)

Sources/SwiftDriver/Jobs/GeneratePCHJob.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,10 @@ extension Driver {
1919
var outputs = [TypedVirtualPath]()
2020

2121
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
22-
23-
inputs.append(input)
24-
commandLine.appendPath(input.file)
25-
commandLine.appendFlag(.emitPch)
26-
27-
outputs.append(output)
22+
23+
commandLine.appendFlag("-frontend")
2824

2925
try addCommonFrontendOptions(commandLine: &commandLine, requestPrecompiledObjCHeader: false)
30-
31-
try commandLine.appendLast(.indexStorePath, from: &parsedOptions)
3226

3327
// TODO: Should this just be pch output with extension changed?
3428
if parsedOptions.hasArgument(.serializeDiagnostics), let outputDirectory = parsedOptions.getLastArgument(.pchOutputDir)?.asSingle {
@@ -48,13 +42,21 @@ extension Driver {
4842
commandLine.appendPath(path)
4943
outputs.append(.init(file: path, type: .diagnostics))
5044
}
45+
46+
inputs.append(input)
47+
commandLine.appendPath(input.file)
48+
49+
try commandLine.appendLast(.indexStorePath, from: &parsedOptions)
50+
51+
commandLine.appendFlag(.emitPch)
5152

5253
if parsedOptions.hasArgument(.pchOutputDir) {
5354
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
5455
} else {
5556
commandLine.appendFlag(.o)
5657
commandLine.appendPath(output.file)
5758
}
59+
outputs.append(output)
5860

5961
return Job(
6062
kind: .generatePCH,

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,7 @@ final class SwiftDriverTests: XCTestCase {
12141214
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
12151215
XCTAssertEqual(plannedJobs[0].outputs[0].file, .temporary(RelativePath("TestInputHeader.pch")))
12161216
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1217+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
12171218
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
12181219
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-o")))
12191220
XCTAssert(plannedJobs[0].commandLine.contains(.path(.temporary(RelativePath("TestInputHeader.pch")))))
@@ -1248,6 +1249,7 @@ final class SwiftDriverTests: XCTestCase {
12481249
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
12491250
XCTAssertEqual(plannedJobs[0].outputs[0].file, .temporary(RelativePath("TestInputHeader.pch")))
12501251
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1252+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
12511253
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
12521254
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-index-store-path")))
12531255
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "idx"))))
@@ -1271,6 +1273,7 @@ final class SwiftDriverTests: XCTestCase {
12711273
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
12721274
XCTAssertEqual(plannedJobs[0].outputs[0].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
12731275
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1276+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
12741277
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
12751278
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
12761279
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
@@ -1293,6 +1296,7 @@ final class SwiftDriverTests: XCTestCase {
12931296
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
12941297
XCTAssertEqual(plannedJobs[0].outputs[0].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
12951298
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1299+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
12961300
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
12971301
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
12981302
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
@@ -1337,12 +1341,13 @@ final class SwiftDriverTests: XCTestCase {
13371341
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
13381342
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
13391343
XCTAssertEqual(plannedJobs[0].outputs.count, 2)
1340-
XCTAssertEqual(plannedJobs[0].outputs[0].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
1341-
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1342-
XCTAssertEqual(plannedJobs[0].outputs[1].file, .temporary(RelativePath("TestInputHeader.dia")))
1343-
XCTAssertEqual(plannedJobs[0].outputs[1].type, .diagnostics)
1344+
XCTAssertEqual(plannedJobs[0].outputs[0].file, .temporary(RelativePath("TestInputHeader.dia")))
1345+
XCTAssertEqual(plannedJobs[0].outputs[0].type, .diagnostics)
1346+
XCTAssertEqual(plannedJobs[0].outputs[1].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
1347+
XCTAssertEqual(plannedJobs[0].outputs[1].type, .pch)
13441348
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-serialize-diagnostics-path")))
13451349
XCTAssert(plannedJobs[0].commandLine.contains(.path(.temporary(RelativePath("TestInputHeader.dia")))))
1350+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
13461351
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
13471352
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
13481353
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
@@ -1363,15 +1368,16 @@ final class SwiftDriverTests: XCTestCase {
13631368
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
13641369
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
13651370
XCTAssertEqual(plannedJobs[0].outputs.count, 2)
1366-
XCTAssertEqual(plannedJobs[0].outputs[0].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
1367-
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1368-
XCTAssertNotNil(plannedJobs[0].outputs[1].file.name.range(of: #"/pch/TestInputHeader-.*.dia"#, options: .regularExpression))
1369-
XCTAssertEqual(plannedJobs[0].outputs[1].type, .diagnostics)
1371+
XCTAssertNotNil(plannedJobs[0].outputs[0].file.name.range(of: #"/pch/TestInputHeader-.*.dia"#, options: .regularExpression))
1372+
XCTAssertEqual(plannedJobs[0].outputs[0].type, .diagnostics)
1373+
XCTAssertEqual(plannedJobs[0].outputs[1].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
1374+
XCTAssertEqual(plannedJobs[0].outputs[1].type, .pch)
13701375
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-serialize-diagnostics-path")))
13711376
XCTAssert(plannedJobs[0].commandLine.contains {
13721377
guard case .path(let path) = $0 else { return false }
13731378
return path.name.range(of: #"/pch/TestInputHeader-.*.dia"#, options: .regularExpression) != nil
13741379
})
1380+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
13751381
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
13761382
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
13771383
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
@@ -1396,6 +1402,7 @@ final class SwiftDriverTests: XCTestCase {
13961402
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
13971403
XCTAssertEqual(plannedJobs[0].outputs[0].file, try VirtualPath(path: "/pch/TestInputHeader.pch"))
13981404
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
1405+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
13991406
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
14001407
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
14011408
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
@@ -1419,6 +1426,7 @@ final class SwiftDriverTests: XCTestCase {
14191426
XCTAssertEqual(plannedJobs[0].outputs[0].file, .temporary(RelativePath("TestInputHeader.pch")))
14201427
XCTAssertEqual(plannedJobs[0].outputs[0].type, .pch)
14211428
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-O")))
1429+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-frontend")))
14221430
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
14231431
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-o")))
14241432
XCTAssert(plannedJobs[0].commandLine.contains(.path(.temporary(RelativePath("TestInputHeader.pch")))))

0 commit comments

Comments
 (0)