Skip to content

Commit 5cf3e27

Browse files
authored
Merge pull request #1306 from zoecarver/make-options-cxx-interop-mode
[cxx-interop] Re-run `makeOptions` to generate `-cxx-compatibility-mode`.
2 parents 679b324 + e433bf0 commit 5cf3e27

File tree

6 files changed

+40
-14
lines changed

6 files changed

+40
-14
lines changed

Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,13 @@ extension DarwinToolchain {
234234
}
235235

236236
// On Darwin, we only support libc++.
237-
if parsedOptions.contains(.enableExperimentalCxxInterop) {
237+
var cxxCompatEnabled = parsedOptions.hasArgument(.enableExperimentalCxxInterop)
238+
if let cxxInteropMode = parsedOptions.getLastArgument(.cxxInteroperabilityMode) {
239+
if cxxInteropMode.asSingle == "swift-5.9" {
240+
cxxCompatEnabled = true
241+
}
242+
}
243+
if cxxCompatEnabled {
238244
commandLine.appendFlag("-lc++")
239245
}
240246

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ extension Driver {
124124

125125
// Add flags for C++ interop
126126
try commandLine.appendLast(.enableExperimentalCxxInterop, from: &parsedOptions)
127+
try commandLine.appendLast(.cxxInteroperabilityMode, from: &parsedOptions)
127128
if let stdlibVariant = parsedOptions.getLastArgument(.experimentalCxxStdlib)?.asSingle {
128129
commandLine.appendFlag("-Xcc")
129130
commandLine.appendFlag("-stdlib=\(stdlibVariant)")

Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,21 @@ extension GenericUnixToolchain {
118118
// Windows rather than msvcprt). When C++ interop is enabled, we will need to
119119
// surface this via a driver flag. For now, opt for the simpler approach of
120120
// just using `clang` and avoid a dependency on the C++ runtime.
121-
let clangTool: Tool =
122-
parsedOptions.hasArgument(.enableExperimentalCxxInterop) ? .clangxx : .clang
121+
var cxxCompatEnabled = parsedOptions.hasArgument(.enableExperimentalCxxInterop)
122+
if let cxxInteropMode = parsedOptions.getLastArgument(.cxxInteroperabilityMode) {
123+
if cxxInteropMode.asSingle == "swift-5.9" {
124+
cxxCompatEnabled = true
125+
}
126+
}
127+
128+
let clangTool: Tool = cxxCompatEnabled ? .clangxx : .clang
123129
var clangPath = try getToolPath(clangTool)
124130
if let toolsDirPath = parsedOptions.getLastArgument(.toolsDirectory) {
125131
// FIXME: What if this isn't an absolute path?
126132
let toolsDir = try AbsolutePath(validating: toolsDirPath.asSingle)
127133

128134
// If there is a clang in the toolchain folder, use that instead.
129-
if let tool = lookupExecutablePath(filename: parsedOptions.hasArgument(.enableExperimentalCxxInterop)
135+
if let tool = lookupExecutablePath(filename: cxxCompatEnabled
130136
? "clang++" : "clang",
131137
searchPaths: [toolsDir]) {
132138
clangPath = tool

Sources/SwiftDriver/Jobs/WindowsToolchain+LinkerSupport.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,13 @@ extension WindowsToolchain {
6262
return try resolvedTool(.staticLinker(lto), pathOverride: lookup(executable: librarian))
6363
}
6464

65-
let clangTool: Tool =
66-
parsedOptions.hasArgument(.enableExperimentalCxxInterop) ? .clangxx : .clang
65+
var cxxCompatEnabled = parsedOptions.hasArgument(.enableExperimentalCxxInterop)
66+
if let cxxInteropMode = parsedOptions.getLastArgument(.cxxInteroperabilityMode) {
67+
if cxxInteropMode.asSingle == "swift-5.9" {
68+
cxxCompatEnabled = true
69+
}
70+
}
71+
let clangTool: Tool = cxxCompatEnabled ? .clangxx : .clang
6772
var clang = try getToolPath(clangTool)
6873

6974
let targetTriple = targetInfo.target.triple

Sources/SwiftOptions/Options.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ extension Option {
7171
public static let CrossModuleOptimization: Option = Option("-cross-module-optimization", .flag, attributes: [.helpHidden, .frontend], helpText: "Perform cross-module optimization")
7272
public static let crosscheckUnqualifiedLookup: Option = Option("-crosscheck-unqualified-lookup", .flag, attributes: [.frontend, .noDriver], helpText: "Compare legacy DeclContext- to ASTScope-based unqualified name lookup (for debugging)")
7373
public static let cxxInteropGettersSettersAsProperties: Option = Option("-cxx-interop-getters-setters-as-properties", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Import getters and setters as computed properties in Swift")
74+
public static let cxxInteroperabilityMode: Option = Option("-cxx-interoperability-mode=", .joined, attributes: [.frontend, .moduleInterface], helpText: "Enables C++ interoperability; requires compatbility version to be specified.")
7475
public static let c: Option = Option("-c", .flag, alias: Option.emitObject, attributes: [.frontend, .noInteractive], group: .modes)
7576
public static let debugAssertAfterParse: Option = Option("-debug-assert-after-parse", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Force an assertion failure after parsing", group: .debugCrash)
7677
public static let debugAssertImmediately: Option = Option("-debug-assert-immediately", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Force an assertion failure immediately", group: .debugCrash)
@@ -145,6 +146,7 @@ extension Option {
145146
public static let disableFailOnError: Option = Option("-disable-fail-on-error", .flag, attributes: [.noDriver], helpText: "Don't exit with a nonzero status if errors are emitted")
146147
public static let disableFailOnError_: Option = Option("--disable-fail-on-error", .flag, alias: Option.disableFailOnError, attributes: [.noDriver], helpText: "Don't exit with a nonzero status if errors are emitted")
147148
public static let disableGenericMetadataPrespecialization: Option = Option("-disable-generic-metadata-prespecialization", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Do not statically specialize metadata for generic types at types that are known to be used in source.")
149+
public static let disableImplicitBacktracingModuleImport: Option = Option("-disable-implicit-backtracing-module-import", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable the implicit import of the _Backtracing module.")
148150
public static let disableImplicitConcurrencyModuleImport: Option = Option("-disable-implicit-concurrency-module-import", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable the implicit import of the _Concurrency module.")
149151
public static let disableImplicitStringProcessingModuleImport: Option = Option("-disable-implicit-string-processing-module-import", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable the implicit import of the _StringProcessing module.")
150152
public static let disableImplicitSwiftModules: Option = Option("-disable-implicit-swift-modules", .flag, attributes: [.frontend, .noDriver], helpText: "Disable building Swift modules implicitly by the compiler")
@@ -339,8 +341,7 @@ extension Option {
339341
public static let enableExperimentalAsyncTopLevel: Option = Option("-enable-experimental-async-top-level", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental concurrency in top-level code")
340342
public static let enableExperimentalConcisePoundFile: Option = Option("-enable-experimental-concise-pound-file", .flag, attributes: [.frontend, .moduleInterface], helpText: "Enable experimental concise '#file' identifier")
341343
public static let enableExperimentalConcurrency: Option = Option("-enable-experimental-concurrency", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental concurrency model")
342-
public static let enableExperimentalCxxInteropInClangHeader: Option = Option("-enable-experimental-cxx-interop-in-clang-header", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental Swift to C++ interop code generation in generated Clang header")
343-
public static let enableExperimentalCxxInterop: Option = Option("-enable-experimental-cxx-interop", .flag, attributes: [.helpHidden, .frontend, .moduleInterface], helpText: "Enable experimental C++ interop code generation and config directives")
344+
public static let enableExperimentalCxxInterop: Option = Option("-enable-experimental-cxx-interop", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental C++ interop code generation and config directives")
344345
public static let enableExperimentalDistributed: Option = Option("-enable-experimental-distributed", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental 'distributed' actors and functions")
345346
public static let enableExperimentalEagerClangModuleDiagnostics: Option = Option("-enable-experimental-eager-clang-module-diagnostics", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental eager diagnostics reporting on the importability of all referenced C, C++, and Objective-C libraries")
346347
public static let enableExperimentalFeature: Option = Option("-enable-experimental-feature", .separate, attributes: [.frontend], helpText: "Enable an experimental feature")
@@ -354,6 +355,7 @@ extension Option {
354355
public static let enableExperimentalStaticAssert: Option = Option("-enable-experimental-static-assert", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental #assert")
355356
public static let enableExperimentalStringProcessing: Option = Option("-enable-experimental-string-processing", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental string processing")
356357
public static let enableExplicitExistentialTypes: Option = Option("-enable-explicit-existential-types", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental support for explicit existential types")
358+
public static let enableImplicitBacktracingModuleImport: Option = Option("-enable-implicit-backtracing-module-import", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable the implicit import of the _Backtracing module.")
357359
public static let enableImplicitDynamic: Option = Option("-enable-implicit-dynamic", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Add 'dynamic' to all declarations")
358360
public static let enableImportPtrauthFieldFunctionPointers: Option = Option("-enable-import-ptrauth-field-function-pointers", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable import of custom ptrauth qualified field function pointers")
359361
public static let enableIncrementalImports: Option = Option("-enable-incremental-imports", .flag, attributes: [.frontend], helpText: "Enable cross-module incremental build metadata and driver scheduling for Swift modules")
@@ -375,6 +377,7 @@ extension Option {
375377
public static let enableObjcInterop: Option = Option("-enable-objc-interop", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable Objective-C interop code generation and config directives")
376378
public static let enableOnlyOneDependencyFile: Option = Option("-enable-only-one-dependency-file", .flag, attributes: [.doesNotAffectIncrementalBuild], helpText: "Enables incremental build optimization that only produces one dependencies file")
377379
public static let enableOperatorDesignatedTypes: Option = Option("-enable-operator-designated-types", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable operator designated types")
380+
public static let enableOssaCompleteLifetimes: Option = Option("-enable-ossa-complete-lifetimes", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Require linear OSSA lifetimes after SILGen")
378381
public static let enableOssaModules: Option = Option("-enable-ossa-modules", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Always serialize SIL in ossa form. If this flag is not passed in, when optimizing ownership will be lowered before serializing SIL")
379382
public static let enablePrivateImports: Option = Option("-enable-private-imports", .flag, attributes: [.helpHidden, .frontend, .noInteractive], helpText: "Allows this module's internal and private API to be accessed")
380383
public static let enableRelativeProtocolWitnessTables: Option = Option("-enable-relative-protocol-witness-tables", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable relative protocol witness tables")
@@ -654,6 +657,7 @@ extension Option {
654657
public static let silVerifyNone: Option = Option("-sil-verify-none", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Completely disable SIL verification")
655658
public static let skipImportInPublicInterface: Option = Option("-skip-import-in-public-interface", .separate, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Skip the import statement corresponding to a module name when printing the public interface.")
656659
public static let skipInheritedDocs: Option = Option("-skip-inherited-docs", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .supplementaryOutput], helpText: "Skip emitting doc comments for members inherited through classes or default implementations")
660+
public static let skipProtocolImplementations: Option = Option("-skip-protocol-implementations", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .supplementaryOutput], helpText: "Skip emitting symbols that are implementations of protocol requirements or inherited from protocl extensions")
657661
public static let skipSynthesizedMembers: Option = Option("-skip-synthesized-members", .flag, attributes: [.noDriver], helpText: "Skip members inherited through classes or default implementations")
658662
public static let solverDisableShrink: Option = Option("-solver-disable-shrink", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable the shrink phase of expression type checking")
659663
public static let solverExpressionTimeThresholdEQ: Option = Option("-solver-expression-time-threshold=", .joined, attributes: [.helpHidden, .frontend, .noDriver])
@@ -824,6 +828,7 @@ extension Option {
824828
Option.CrossModuleOptimization,
825829
Option.crosscheckUnqualifiedLookup,
826830
Option.cxxInteropGettersSettersAsProperties,
831+
Option.cxxInteroperabilityMode,
827832
Option.c,
828833
Option.debugAssertAfterParse,
829834
Option.debugAssertImmediately,
@@ -898,6 +903,7 @@ extension Option {
898903
Option.disableFailOnError,
899904
Option.disableFailOnError_,
900905
Option.disableGenericMetadataPrespecialization,
906+
Option.disableImplicitBacktracingModuleImport,
901907
Option.disableImplicitConcurrencyModuleImport,
902908
Option.disableImplicitStringProcessingModuleImport,
903909
Option.disableImplicitSwiftModules,
@@ -1092,7 +1098,6 @@ extension Option {
10921098
Option.enableExperimentalAsyncTopLevel,
10931099
Option.enableExperimentalConcisePoundFile,
10941100
Option.enableExperimentalConcurrency,
1095-
Option.enableExperimentalCxxInteropInClangHeader,
10961101
Option.enableExperimentalCxxInterop,
10971102
Option.enableExperimentalDistributed,
10981103
Option.enableExperimentalEagerClangModuleDiagnostics,
@@ -1107,6 +1112,7 @@ extension Option {
11071112
Option.enableExperimentalStaticAssert,
11081113
Option.enableExperimentalStringProcessing,
11091114
Option.enableExplicitExistentialTypes,
1115+
Option.enableImplicitBacktracingModuleImport,
11101116
Option.enableImplicitDynamic,
11111117
Option.enableImportPtrauthFieldFunctionPointers,
11121118
Option.enableIncrementalImports,
@@ -1128,6 +1134,7 @@ extension Option {
11281134
Option.enableObjcInterop,
11291135
Option.enableOnlyOneDependencyFile,
11301136
Option.enableOperatorDesignatedTypes,
1137+
Option.enableOssaCompleteLifetimes,
11311138
Option.enableOssaModules,
11321139
Option.enablePrivateImports,
11331140
Option.enableRelativeProtocolWitnessTables,
@@ -1407,6 +1414,7 @@ extension Option {
14071414
Option.silVerifyNone,
14081415
Option.skipImportInPublicInterface,
14091416
Option.skipInheritedDocs,
1417+
Option.skipProtocolImplementations,
14101418
Option.skipSynthesizedMembers,
14111419
Option.solverDisableShrink,
14121420
Option.solverExpressionTimeThresholdEQ,

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6043,24 +6043,24 @@ final class SwiftDriverTests: XCTestCase {
60436043

60446044
func testCXXInteropOptions() throws {
60456045
do {
6046-
var driver = try Driver(args: ["swiftc", "-enable-experimental-cxx-interop", "foo.swift"])
6046+
var driver = try Driver(args: ["swiftc", "-cxx-interoperability-mode=swift-5.9", "foo.swift"])
60476047
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
60486048
XCTAssertEqual(plannedJobs.count, 2)
60496049
let compileJob = plannedJobs[0]
60506050
let linkJob = plannedJobs[1]
6051-
XCTAssertTrue(compileJob.commandLine.contains(.flag("-enable-experimental-cxx-interop")))
6051+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-cxx-interoperability-mode=swift-5.9")))
60526052
if driver.targetTriple.isDarwin {
60536053
XCTAssertTrue(linkJob.commandLine.contains(.flag("-lc++")))
60546054
}
60556055
}
60566056
do {
6057-
var driver = try Driver(args: ["swiftc", "-enable-experimental-cxx-interop",
6057+
var driver = try Driver(args: ["swiftc", "-cxx-interoperability-mode=swift-5.9",
60586058
"-experimental-cxx-stdlib", "libc++", "foo.swift"])
60596059
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
60606060
XCTAssertEqual(plannedJobs.count, 2)
60616061
let compileJob = plannedJobs[0]
60626062
let linkJob = plannedJobs[1]
6063-
XCTAssertTrue(compileJob.commandLine.contains(.flag("-enable-experimental-cxx-interop")))
6063+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-cxx-interoperability-mode=swift-5.9")))
60646064
XCTAssertTrue(compileJob.commandLine.contains(.flag("-stdlib=libc++")))
60656065
if driver.targetTriple.isDarwin {
60666066
XCTAssertTrue(linkJob.commandLine.contains(.flag("-lc++")))
@@ -6640,7 +6640,7 @@ final class SwiftDriverTests: XCTestCase {
66406640
#else
66416641
VirtualPath.resetTemporaryFileStore()
66426642
var driver = try Driver(args: [
6643-
"swiftc", "-enable-experimental-cxx-interop", "-emit-library", "-o", "library.dll", "library.obj"
6643+
"swiftc", "-cxx-interoperability-mode=swift-5.9", "-emit-library", "-o", "library.dll", "library.obj"
66446644
])
66456645
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
66466646
XCTAssertEqual(jobs.count, 1)

0 commit comments

Comments
 (0)