Skip to content

Commit 4d847b9

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 4d847b9

File tree

5 files changed

+41
-12
lines changed

5 files changed

+41
-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, 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, let archName):
155+
return
156+
"\(target) and above does not support emitting binaries or IR for \(archName)"
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", targetTriple.archName)
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: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3039,6 +3039,16 @@ final class SwiftDriverTests: XCTestCase {
30393039
}
30403040
}
30413041

3042+
func testValidDeprecatedTargets() throws {
3043+
var driver = try Driver(args: ["swiftc", "-emit-module", "-target", "armv7-apple-ios13.0", "foo.swift"])
3044+
let plannedJobs = try driver.planBuild()
3045+
let emitModuleJob = plannedJobs.first(where: {$0.kind == .emitModule})
3046+
XCTAssertNotNil(emitModuleJob)
3047+
let currentJob = emitModuleJob!
3048+
XCTAssert(currentJob.commandLine.contains(.flag("-target")))
3049+
XCTAssert(currentJob.commandLine.contains(.flag("armv7-apple-ios13.0")))
3050+
}
3051+
30423052
func testClangTargetForExplicitModule() throws {
30433053
#if os(macOS)
30443054
// Check -clang-target is on by defualt when explicit module is on.
@@ -3133,14 +3143,22 @@ final class SwiftDriverTests: XCTestCase {
31333143
}
31343144
}
31353145

3136-
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "armv7-apple-ios12.0",
3146+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "armv7-apple-ios12.1",
31373147
"foo.swift"])) { error in
3138-
guard case DarwinToolchain.ToolchainValidationError.iOSVersionAboveMaximumDeploymentTarget(12) = error else {
3148+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11", "armv7") = error else {
31393149
XCTFail()
31403150
return
31413151
}
31423152
}
31433153

3154+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-emit-module", "-c", "-target",
3155+
"armv7s-apple-ios12.0", "foo.swift"])) { error in
3156+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11", "armv7s") = error else {
3157+
XCTFail()
3158+
return
3159+
}
3160+
}
3161+
31443162
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "x86_64-apple-ios13.0",
31453163
"-target-variant", "x86_64-apple-macosx10.14",
31463164
"foo.swift"])) { error in

0 commit comments

Comments
 (0)