Skip to content

Commit 1c78d00

Browse files
committed
Handle "-internal-import-bridging-header"
Driver part of rdar://74011750.
1 parent 59fdf1b commit 1c78d00

File tree

4 files changed

+65
-28
lines changed

4 files changed

+65
-28
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,9 @@ public struct Driver {
353353
/// Original ObjC Header passed from command-line
354354
let originalObjCHeaderFile: VirtualPath.Handle?
355355

356+
/// Whether to import the bridging header as internal (vs public).
357+
let importBridgingHeaderAsInternal: Bool
358+
356359
/// Enable bridging header chaining.
357360
let bridgingHeaderChaining: Bool
358361

@@ -1165,10 +1168,12 @@ public struct Driver {
11651168
}
11661169
self.producePCHJob = maybeNeedPCH
11671170

1168-
if let objcHeaderPathArg = parsedOptions.getLastArgument(.importObjcHeader) {
1169-
self.originalObjCHeaderFile = try? VirtualPath.intern(path: objcHeaderPathArg.asSingle)
1171+
if let importBridgingHeaderOption = parsedOptions.last(for: .importBridgingHeader, .internalImportBridgingHeader) {
1172+
self.originalObjCHeaderFile = try? VirtualPath.intern(path: importBridgingHeaderOption.argument.asSingle)
1173+
self.importBridgingHeaderAsInternal = importBridgingHeaderOption.option == .internalImportBridgingHeader
11701174
} else {
11711175
self.originalObjCHeaderFile = nil
1176+
self.importBridgingHeaderAsInternal = false
11721177
}
11731178

11741179
if parsedOptions.hasFlag(positive: .autoBridgingHeaderChaining,
@@ -2059,8 +2064,8 @@ extension Driver {
20592064

20602065
// Put bridging header as first input if we have it
20612066
let allInputs: [TypedVirtualPath]
2062-
if let objcHeader = originalObjCHeaderFile {
2063-
allInputs = [TypedVirtualPath(file: objcHeader, type: .objcHeader)] + inputFiles
2067+
if let bridgingHeader = originalObjCHeaderFile {
2068+
allInputs = [TypedVirtualPath(file: bridgingHeader, type: .objcHeader)] + inputFiles
20642069
} else {
20652070
allInputs = inputFiles
20662071
}

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ extension Driver {
229229
try commandLine.appendLast(.nostdimport, from: &parsedOptions)
230230
try commandLine.appendLast(.nostdlibimport, from: &parsedOptions)
231231
try commandLine.appendLast(.parseStdlib, from: &parsedOptions)
232-
try commandLine.appendLast(.solverMemoryThreshold, from: &parsedOptions)
233232
try commandLine.appendLast(.valueRecursionThreshold, from: &parsedOptions)
234233
try commandLine.appendLast(.warnSwift3ObjcInference, from: &parsedOptions)
235234
try commandLine.appendLast(.remarkLoadingModule, from: &parsedOptions)
@@ -475,14 +474,17 @@ extension Driver {
475474
try computeCanonicalObjCHeader(explicitModulePlanner: explicitModulePlanner)
476475
let objcHeaderFile = (kind == .scanDependencies) ? originalObjCHeaderFile : importedObjCHeader
477476
if let importedObjCHeader = objcHeaderFile, bridgingHeaderHandling != .ignored {
477+
let importBridgingHeaderFlag: Option = importBridgingHeaderAsInternal
478+
? .internalImportBridgingHeader
479+
: .importObjcHeader
478480
if bridgingHeaderHandling == .precompiled, let pch = precompiledObjCHeader {
479481
// For explicit module build, we directly pass the compiled pch to
480482
// swift-frontend, rather than rely on swift-frontend to locate
481483
// the pch in the pchOutputDir and can start an implicit build in case
482484
// of a lookup failure.
483485
if parsedOptions.contains(.pchOutputDir) &&
484486
!parsedOptions.contains(.driverExplicitModuleBuild) {
485-
commandLine.appendFlag(.importObjcHeader)
487+
commandLine.appendFlag(importBridgingHeaderFlag)
486488
try addPathArgument(VirtualPath.lookup(importedObjCHeader), to:&commandLine, remap: jobNeedPathRemap)
487489
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
488490
if !compilerMode.isSingleCompilation {
@@ -491,21 +493,21 @@ extension Driver {
491493
} else {
492494
// If header chaining is enabled, pass objc header through `-import-objc-header` and
493495
// PCH file through `-import-pch`. Otherwise, pass either the PCH or header through
494-
// `-import-objc-header` option.
496+
// `-import-objc-header` option (or its internal variant).
495497
if isFrontendArgSupported(.importPch), importedObjCHeader != originalObjCHeaderFile {
496-
commandLine.appendFlag(.importPch)
498+
commandLine.appendFlag(importBridgingHeaderAsInternal ? .internalImportPch : .importPch)
497499
try addPathArgument(VirtualPath.lookup(pch), to:&commandLine, remap: jobNeedPathRemap)
498500
if let originalHeader = originalObjCHeaderFile {
499-
commandLine.appendFlag(.importObjcHeader)
501+
commandLine.appendFlag(importBridgingHeaderFlag)
500502
try addPathArgument(VirtualPath.lookup(originalHeader), to:&commandLine, remap: jobNeedPathRemap)
501503
}
502504
} else {
503-
commandLine.appendFlag(.importObjcHeader)
505+
commandLine.appendFlag(importBridgingHeaderFlag)
504506
try addPathArgument(VirtualPath.lookup(pch), to:&commandLine, remap: jobNeedPathRemap)
505507
}
506508
}
507509
} else {
508-
commandLine.appendFlag(.importObjcHeader)
510+
commandLine.appendFlag(importBridgingHeaderFlag)
509511
try addPathArgument(VirtualPath.lookup(importedObjCHeader), to:&commandLine, remap: jobNeedPathRemap)
510512
}
511513
}

Sources/SwiftDriver/Jobs/ReplJob.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ extension Driver {
1818
try addCommonFrontendOptions(commandLine: &commandLine, inputs: &inputs, kind: .repl)
1919
try addRuntimeLibraryFlags(commandLine: &commandLine)
2020

21-
try commandLine.appendLast(.importObjcHeader, from: &parsedOptions)
21+
try commandLine.appendLast(
22+
.importObjcHeader, .internalImportBridgingHeader,
23+
from: &parsedOptions
24+
)
2225
toolchain.addLinkedLibArgs(
2326
to: &commandLine,
2427
parsedOptions: &parsedOptions

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4497,6 +4497,20 @@ final class SwiftDriverTests: XCTestCase {
44974497
XCTAssert(plannedJobs[1].inputs[1].file.extension == "pch")
44984498
}
44994499

4500+
func testInternalPCHasCompileInput() throws {
4501+
var envVars = ProcessEnv.block
4502+
envVars["SWIFT_DRIVER_LD_EXEC"] = ld.nativePathString(escaped: false)
4503+
4504+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.14", "-enable-bridging-pch", "-internal-import-bridging-header", "TestInputHeader.h", "foo.swift"],
4505+
env: envVars)
4506+
let plannedJobs = try driver.planBuild()
4507+
XCTAssertEqual(plannedJobs.count, 3)
4508+
XCTAssert(plannedJobs[0].kind == .generatePCH)
4509+
XCTAssert(plannedJobs[1].kind == .compile)
4510+
XCTAssert(plannedJobs[1].inputs[0].file.extension == "swift")
4511+
XCTAssert(plannedJobs[1].inputs[1].file.extension == "pch")
4512+
}
4513+
45004514
func testEnvironmentInferenceWarning() throws {
45014515
let sdkRoot = try testInputsPath.appending(component: "SDKChecks").appending(component: "iPhoneOS.sdk")
45024516

@@ -6600,8 +6614,21 @@ final class SwiftDriverTests: XCTestCase {
66006614
}
66016615

66026616
func testPCHGeneration() throws {
6617+
try checkPCHGeneration(internalBridgingHeader: false)
6618+
6619+
let driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6620+
if driver.isFrontendArgSupported(.internalImportBridgingHeader) {
6621+
try checkPCHGeneration(internalBridgingHeader: true)
6622+
}
6623+
}
6624+
6625+
func checkPCHGeneration(internalBridgingHeader: Bool) throws {
6626+
let importHeaderFlag = internalBridgingHeader
6627+
? "-internal-import-bridging-header"
6628+
: "-import-objc-header"
6629+
66036630
do {
6604-
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6631+
var driver = try Driver(args: ["swiftc", "-typecheck", importHeaderFlag, "TestInputHeader.h", "foo.swift"])
66056632
let plannedJobs = try driver.planBuild()
66066633
XCTAssertEqual(plannedJobs.count, 2)
66076634

@@ -6620,23 +6647,23 @@ final class SwiftDriverTests: XCTestCase {
66206647
XCTAssertEqual(plannedJobs[1].kind, .compile)
66216648
XCTAssertEqual(plannedJobs[1].inputs.count, 2)
66226649
XCTAssertEqual(plannedJobs[1].inputs[0].file, try toPath("foo.swift"))
6623-
XCTAssert(plannedJobs[1].commandLine.contains(.flag("-import-objc-header")))
6650+
XCTAssert(plannedJobs[1].commandLine.contains(.flag(importHeaderFlag)))
66246651
XCTAssertTrue(commandContainsTemporaryPath(plannedJobs[1].commandLine, "TestInputHeader.pch"))
66256652
}
66266653

66276654
do {
6628-
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6655+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", importHeaderFlag, "TestInputHeader.h", "foo.swift"])
66296656
let plannedJobs = try driver.planBuild()
66306657
XCTAssertEqual(plannedJobs.count, 1)
66316658

66326659
XCTAssertEqual(plannedJobs[0].kind, .compile)
66336660
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
66346661
XCTAssertEqual(plannedJobs[0].inputs[0].file, try toPath("foo.swift"))
6635-
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
6662+
XCTAssert(plannedJobs[0].commandLine.contains(.flag(importHeaderFlag)))
66366663
}
66376664

66386665
do {
6639-
var driver = try Driver(args: ["swiftc", "-typecheck", "-index-store-path", "idx", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6666+
var driver = try Driver(args: ["swiftc", "-typecheck", "-index-store-path", "idx", importHeaderFlag, "TestInputHeader.h", "foo.swift"])
66406667
let plannedJobs = try driver.planBuild()
66416668
XCTAssertEqual(plannedJobs.count, 2)
66426669

@@ -6660,7 +6687,7 @@ final class SwiftDriverTests: XCTestCase {
66606687
}
66616688

66626689
do {
6663-
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
6690+
var driver = try Driver(args: ["swiftc", "-typecheck", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
66646691
let plannedJobs = try driver.planBuild()
66656692
XCTAssertEqual(plannedJobs.count, 2)
66666693

@@ -6683,31 +6710,31 @@ final class SwiftDriverTests: XCTestCase {
66836710
}
66846711

66856712
do {
6686-
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
6713+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
66876714
let plannedJobs = try driver.planBuild()
66886715
XCTAssertEqual(plannedJobs.count, 1)
66896716

66906717
XCTAssertEqual(plannedJobs[0].kind, .compile)
66916718
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
66926719
XCTAssertEqual(plannedJobs[0].inputs[0].file, try toPath("foo.swift"))
6693-
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
6720+
XCTAssert(plannedJobs[0].commandLine.contains(.flag(importHeaderFlag)))
66946721
XCTAssertFalse(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
66956722
}
66966723

66976724
do {
6698-
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
6725+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
66996726
let plannedJobs = try driver.planBuild()
67006727
XCTAssertEqual(plannedJobs.count, 1)
67016728

67026729
XCTAssertEqual(plannedJobs[0].kind, .compile)
67036730
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
67046731
XCTAssertEqual(plannedJobs[0].inputs[0].file, try toPath("foo.swift"))
6705-
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
6732+
XCTAssert(plannedJobs[0].commandLine.contains(.flag(importHeaderFlag)))
67066733
XCTAssertFalse(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
67076734
}
67086735

67096736
do {
6710-
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-serialize-diagnostics", "foo.swift"])
6737+
var driver = try Driver(args: ["swiftc", "-typecheck", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "-serialize-diagnostics", "foo.swift"])
67116738
let plannedJobs = try driver.planBuild()
67126739
XCTAssertEqual(plannedJobs.count, 2)
67136740

@@ -6734,7 +6761,7 @@ final class SwiftDriverTests: XCTestCase {
67346761
}
67356762

67366763
do {
6737-
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"])
6764+
var driver = try Driver(args: ["swiftc", "-typecheck", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "-serialize-diagnostics", "foo.swift", "-emit-module", "-emit-module-path", "/module-path-dir"])
67386765
let plannedJobs = try driver.planBuild()
67396766
XCTAssertEqual(plannedJobs.count, 3)
67406767

@@ -6766,7 +6793,7 @@ final class SwiftDriverTests: XCTestCase {
67666793
}
67676794

67686795
do {
6769-
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
6796+
var driver = try Driver(args: ["swiftc", "-typecheck", importHeaderFlag, "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
67706797
let plannedJobs = try driver.planBuild()
67716798
XCTAssertEqual(plannedJobs.count, 2)
67726799

@@ -6789,7 +6816,7 @@ final class SwiftDriverTests: XCTestCase {
67896816
}
67906817

67916818
do {
6792-
var driver = try Driver(args: ["swiftc", "-typecheck", "-O", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6819+
var driver = try Driver(args: ["swiftc", "-typecheck", "-O", importHeaderFlag, "TestInputHeader.h", "foo.swift"])
67936820
let plannedJobs = try driver.planBuild()
67946821
XCTAssertEqual(plannedJobs.count, 2)
67956822

@@ -6813,11 +6840,11 @@ final class SwiftDriverTests: XCTestCase {
68136840

68146841
// Immediate mode doesn't generate a pch
68156842
do {
6816-
var driver = try Driver(args: ["swift", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
6843+
var driver = try Driver(args: ["swift", importHeaderFlag, "TestInputHeader.h", "foo.swift"])
68176844
let plannedJobs = try driver.planBuild()
68186845
XCTAssertEqual(plannedJobs.count, 1)
68196846
XCTAssertEqual(plannedJobs[0].kind, .interpret)
6820-
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
6847+
XCTAssert(plannedJobs[0].commandLine.contains(.flag(importHeaderFlag)))
68216848
XCTAssert(plannedJobs[0].commandLine.contains(try toPathOption("TestInputHeader.h")))
68226849
}
68236850
}

0 commit comments

Comments
 (0)