@@ -1199,6 +1199,205 @@ final class SwiftDriverTests: XCTestCase {
1199
1199
let driver2 = try Driver ( args: [ " swift " , " main.swift " ] , env: env)
1200
1200
XCTAssertNoThrow ( try driver2. toolchain. getToolPath ( . dsymutil) )
1201
1201
}
1202
+
1203
+ func testPCHGeneration( ) throws {
1204
+ do {
1205
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -import-objc-header " , " TestInputHeader.h " , " foo.swift " ] )
1206
+ let plannedJobs = try driver. planBuild ( )
1207
+ XCTAssertEqual ( plannedJobs. count, 2 )
1208
+
1209
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1210
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1211
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1212
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1213
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1214
+ // TODO check outputs for pch
1215
+
1216
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1217
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1218
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1219
+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -import-objc-header " ) ) )
1220
+ // TODO check value of flag
1221
+ }
1222
+ // ^^^^^^^^^^^^^
1223
+ // RUN: %target-build-swift -typecheck -driver-print-jobs -import-objc-header %S/Inputs/bridging-header.h %s 2>&1 | %FileCheck %s -check-prefix=YESPCHJOB
1224
+ // YESPCHJOB: {{.*}}swift{{c?(\.exe)?"?}} -frontend {{.*}} -emit-pch -o {{.*}}bridging-header-{{.*}}.pch
1225
+ // YESPCHJOB: {{.*}}swift{{c?(\.exe)?"?}} -frontend {{.*}} -import-objc-header {{.*}}bridging-header-{{.*}}.pch
1226
+
1227
+ do {
1228
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -disable-bridging-pch " , " -import-objc-header " , " TestInputHeader.h " , " foo.swift " ] )
1229
+ let plannedJobs = try driver. planBuild ( )
1230
+ XCTAssertEqual ( plannedJobs. count, 1 )
1231
+
1232
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1233
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1234
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1235
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -import-objc-header " ) ) )
1236
+ }
1237
+
1238
+ do {
1239
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -index-store-path " , " idx " , " -import-objc-header " , " TestInputHeader.h " , " foo.swift " ] )
1240
+ let plannedJobs = try driver. planBuild ( )
1241
+ XCTAssertEqual ( plannedJobs. count, 2 )
1242
+
1243
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1244
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1245
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1246
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1247
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1248
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -index-store-path " ) ) )
1249
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " idx " ) ) ) )
1250
+ // TODO check outputs for pch
1251
+
1252
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1253
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1254
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1255
+ }
1256
+
1257
+ do {
1258
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " foo.swift " ] )
1259
+ let plannedJobs = try driver. planBuild ( )
1260
+ XCTAssertEqual ( plannedJobs. count, 2 )
1261
+
1262
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1263
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1264
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1265
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1266
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1267
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1268
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " /pch " ) ) ) )
1269
+ // TODO check outputs for pch
1270
+
1271
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1272
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1273
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1274
+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -pch-disable-validation " ) ) )
1275
+ }
1276
+
1277
+ do {
1278
+ var driver = try Driver ( args: [ " swiftc " , " -c " , " -embed-bitcode " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " foo.swift " ] )
1279
+ let plannedJobs = try driver. planBuild ( )
1280
+ XCTAssertEqual ( plannedJobs. count, 2 )
1281
+
1282
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1283
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1284
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1285
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1286
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1287
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1288
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " /pch " ) ) ) )
1289
+ // TODO check outputs for pch
1290
+
1291
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1292
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1293
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1294
+ // FIXME: Verify llvm-bc as output
1295
+ }
1296
+
1297
+ do {
1298
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -disable-bridging-pch " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " foo.swift " ] )
1299
+ let plannedJobs = try driver. planBuild ( )
1300
+ XCTAssertEqual ( plannedJobs. count, 1 )
1301
+
1302
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1303
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1304
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1305
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -import-objc-header " ) ) )
1306
+ XCTAssertFalse ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1307
+ }
1308
+
1309
+ do {
1310
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -disable-bridging-pch " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " -whole-module-optimization " , " foo.swift " ] )
1311
+ let plannedJobs = try driver. planBuild ( )
1312
+ XCTAssertEqual ( plannedJobs. count, 1 )
1313
+
1314
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1315
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1316
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1317
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -import-objc-header " ) ) )
1318
+ XCTAssertFalse ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1319
+ }
1320
+
1321
+ do {
1322
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " -serialize-diagnostics " , " foo.swift " ] )
1323
+ let plannedJobs = try driver. planBuild ( )
1324
+ XCTAssertEqual ( plannedJobs. count, 2 )
1325
+
1326
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1327
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1328
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1329
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1330
+ // TODO -serialize-diagnostics-path {{.*}}bridging-header-{{.*}}.dia{{"?}}
1331
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1332
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1333
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " /pch " ) ) ) )
1334
+ // TODO check outputs for pch
1335
+
1336
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1337
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1338
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1339
+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -pch-disable-validation " ) ) )
1340
+ }
1341
+
1342
+ do {
1343
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " -serialize-diagnostics " , " foo.swift " , " -emit-module " , " -emit-module-path " , " /module-path-dir " ] )
1344
+ let plannedJobs = try driver. planBuild ( )
1345
+ XCTAssertEqual ( plannedJobs. count, 2 )
1346
+
1347
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1348
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1349
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1350
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1351
+ // TODO -serialize-diagnostics-path {{.*}}/pch/bridging-header-{{.*}}.dia{{"?}}
1352
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1353
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1354
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " /pch " ) ) ) )
1355
+ // TODO check outputs for pch
1356
+
1357
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1358
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1359
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1360
+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -pch-disable-validation " ) ) )
1361
+ }
1362
+
1363
+ do {
1364
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -import-objc-header " , " TestInputHeader.h " , " -pch-output-dir " , " /pch " , " -whole-module-optimization " , " foo.swift " ] )
1365
+ let plannedJobs = try driver. planBuild ( )
1366
+ XCTAssertEqual ( plannedJobs. count, 2 )
1367
+
1368
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1369
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1370
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1371
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1372
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1373
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -pch-output-dir " ) ) )
1374
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . path( try VirtualPath ( path: " /pch " ) ) ) )
1375
+ // TODO check outputs for pch
1376
+
1377
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1378
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1379
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1380
+ XCTAssertFalse ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -pch-disable-validation " ) ) )
1381
+ }
1382
+
1383
+ do {
1384
+ var driver = try Driver ( args: [ " swiftc " , " -typecheck " , " -O " , " -import-objc-header " , " TestInputHeader.h " , " foo.swift " ] )
1385
+ let plannedJobs = try driver. planBuild ( )
1386
+ XCTAssertEqual ( plannedJobs. count, 2 )
1387
+
1388
+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . generatePCH)
1389
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs. count, 1 )
1390
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . file, . relative( RelativePath ( " TestInputHeader.h " ) ) )
1391
+ XCTAssertEqual ( plannedJobs [ 0 ] . inputs [ 0 ] . type, . objcHeader)
1392
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -O " ) ) )
1393
+ XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -emit-pch " ) ) )
1394
+ // TODO check outputs for pch
1395
+
1396
+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1397
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs. count, 1 )
1398
+ XCTAssertEqual ( plannedJobs [ 1 ] . inputs [ 0 ] . file, try VirtualPath ( path: " foo.swift " ) )
1399
+ }
1400
+ }
1202
1401
}
1203
1402
1204
1403
func assertString(
0 commit comments