Skip to content

Commit 2615e52

Browse files
committed
Loosen restriction for building deprecated iOS targets
This patch loosens the restriction for building deprecated iOS targets to only when the user attempts to compile a binary or emit IR. This allows the compiler to continue building swift modules and interfaces for newer deployment targets. The error message is also slightly modified to allow the same message to apply to different platforms. resolves: <rdar://87898177>
1 parent 6b348db commit 2615e52

File tree

5 files changed

+31
-12
lines changed

5 files changed

+31
-12
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ public struct Driver {
603603
try toolchain.validateArgs(&parsedOptions,
604604
targetTriple: self.frontendTargetInfo.target.triple,
605605
targetVariantTriple: self.frontendTargetInfo.targetVariant?.triple,
606+
compilerOutputType: self.compilerOutputType,
606607
diagnosticsEngine: diagnosticEngine)
607608

608609
// Compute debug information output.

Sources/SwiftDriver/Toolchains/DarwinToolchain.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,17 @@ public final class DarwinToolchain: Toolchain {
143143
public enum ToolchainValidationError: Error, DiagnosticData {
144144
case osVersionBelowMinimumDeploymentTarget(String)
145145
case argumentNotSupported(String)
146-
case iOSVersionAboveMaximumDeploymentTarget(Int)
146+
case invalidDeploymentTargetForIR(String)
147147
case unsupportedTargetVariant(variant: Triple)
148148
case darwinOnlySupportsLibCxx
149149

150150
public var description: String {
151151
switch self {
152152
case .osVersionBelowMinimumDeploymentTarget(let target):
153153
return "Swift requires a minimum deployment target of \(target)"
154-
case .iOSVersionAboveMaximumDeploymentTarget(let version):
155-
return "iOS \(version) does not support 32-bit programs"
154+
case .invalidDeploymentTargetForIR(let target):
155+
return
156+
"\(target) and above does not support emitting binaries or IR for 32-bit programs"
156157
case .unsupportedTargetVariant(variant: let variant):
157158
return "unsupported '\(variant.isiOS ? "-target-variant" : "-target")' value '\(variant.triple)'; use 'ios-macabi' instead"
158159
case .argumentNotSupported(let argument):
@@ -166,6 +167,7 @@ public final class DarwinToolchain: Toolchain {
166167
public func validateArgs(_ parsedOptions: inout ParsedOptions,
167168
targetTriple: Triple,
168169
targetVariantTriple: Triple?,
170+
compilerOutputType: FileType?,
169171
diagnosticsEngine: DiagnosticsEngine) throws {
170172
// On non-darwin hosts, libArcLite won't be found and a warning will be emitted
171173
// Guard for the sake of tests running on all platforms
@@ -176,7 +178,8 @@ public final class DarwinToolchain: Toolchain {
176178
diagnosticsEngine: diagnosticsEngine)
177179
#endif
178180
// Validating apple platforms deployment targets.
179-
try validateDeploymentTarget(&parsedOptions, targetTriple: targetTriple)
181+
try validateDeploymentTarget(&parsedOptions, targetTriple: targetTriple,
182+
compilerOutputType: compilerOutputType)
180183
if let targetVariantTriple = targetVariantTriple,
181184
!targetTriple.isValidForZipperingWithTriple(targetVariantTriple) {
182185
throw ToolchainValidationError.unsupportedTargetVariant(variant: targetVariantTriple)
@@ -198,7 +201,7 @@ public final class DarwinToolchain: Toolchain {
198201
}
199202

200203
func validateDeploymentTarget(_ parsedOptions: inout ParsedOptions,
201-
targetTriple: Triple) throws {
204+
targetTriple: Triple, compilerOutputType: FileType?) throws {
202205
// Check minimum supported OS versions.
203206
if targetTriple.isMacOSX,
204207
targetTriple.version(for: .macOS) < Triple.Version(10, 9, 0) {
@@ -213,8 +216,11 @@ public final class DarwinToolchain: Toolchain {
213216
throw ToolchainValidationError.osVersionBelowMinimumDeploymentTarget("iOS 7")
214217
}
215218
if targetTriple.arch?.is32Bit == true,
216-
targetTriple.version(for: .iOS(.device)) >= Triple.Version(11, 0, 0) {
217-
throw ToolchainValidationError.iOSVersionAboveMaximumDeploymentTarget(targetTriple.version(for: .iOS(.device)).major)
219+
targetTriple.version(for: .iOS(.device)) >= Triple.Version(11, 0, 0),
220+
compilerOutputType != .swiftModule {
221+
throw
222+
ToolchainValidationError
223+
.invalidDeploymentTargetForIR("iOS 11")
218224
}
219225
} else if targetTriple.isWatchOS,
220226
targetTriple.version(for: .watchOS(.device)) < Triple.Version(2, 0, 0) {

Sources/SwiftDriver/Toolchains/Toolchain.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ public protocol Toolchain {
6666
/// Perform platform-specific argument validation.
6767
func validateArgs(_ parsedOptions: inout ParsedOptions,
6868
targetTriple: Triple,
69-
targetVariantTriple: Triple?, diagnosticsEngine: DiagnosticsEngine) throws
69+
targetVariantTriple: Triple?,
70+
compilerOutputType: FileType?,
71+
diagnosticsEngine: DiagnosticsEngine) throws
7072

7173
/// Adds platform-specific linker flags to the provided command line
7274
func addPlatformSpecificLinkerArgs(
@@ -214,8 +216,9 @@ extension Toolchain {
214216
}
215217

216218
public func validateArgs(_ parsedOptions: inout ParsedOptions,
217-
targetTriple: Triple,
218-
targetVariantTriple: Triple?, diagnosticsEngine: DiagnosticsEngine) {}
219+
targetTriple: Triple, targetVariantTriple: Triple?,
220+
compilerOutputType: FileType?,
221+
diagnosticsEngine: DiagnosticsEngine) {}
219222

220223
public func addPlatformSpecificCommonFrontendOptions(
221224
commandLine: inout [Job.ArgTemplate],

Sources/SwiftDriver/Toolchains/WindowsToolchain.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ extension WindowsToolchain.ToolchainValidationError {
138138

139139
public func validateArgs(_ parsedOptions: inout ParsedOptions,
140140
targetTriple: Triple, targetVariantTriple: Triple?,
141+
compilerOutputType: FileType?,
141142
diagnosticEngine: DiagnosticsEngine) throws {
142143
// TODO(compnerd) validate any options we can
143144
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3133,14 +3133,22 @@ final class SwiftDriverTests: XCTestCase {
31333133
}
31343134
}
31353135

3136-
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "armv7-apple-ios12.0",
3136+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "armv7-apple-ios12.1",
31373137
"foo.swift"])) { error in
3138-
guard case DarwinToolchain.ToolchainValidationError.iOSVersionAboveMaximumDeploymentTarget(12) = error else {
3138+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11") = error else {
31393139
XCTFail()
31403140
return
31413141
}
31423142
}
31433143

3144+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-emit-module", "-c", "-target",
3145+
"armv7-apple-ios12.0", "foo.swift"])) { error in
3146+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11") = error else {
3147+
XCTFail()
3148+
return
3149+
}
3150+
}
3151+
31443152
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "x86_64-apple-ios13.0",
31453153
"-target-variant", "x86_64-apple-macosx10.14",
31463154
"foo.swift"])) { error in

0 commit comments

Comments
 (0)