Skip to content

Commit a62bc1a

Browse files
authored
Merge pull request #184 from Nikhil0487/SR-13255-Fix
Validate C++ and ObjC related args for Darwin toolchain
2 parents 20990f3 + 1824325 commit a62bc1a

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,8 @@ public struct Driver {
311311
Self.validateCoverageArgs(&parsedOptions, diagnosticsEngine: diagnosticEngine)
312312
try toolchain.validateArgs(&parsedOptions,
313313
targetTriple: self.frontendTargetInfo.target.triple,
314-
targetVariantTriple: self.frontendTargetInfo.targetVariant?.triple)
314+
targetVariantTriple: self.frontendTargetInfo.targetVariant?.triple,
315+
diagnosticsEngine: diagnosticEngine)
315316

316317
// Compute debug information output.
317318
self.debugInfo = Self.computeDebugInfo(&parsedOptions, diagnosticsEngine: diagnosticEngine)

Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import TSCBasic
1313
import SwiftOptions
1414

1515
extension DarwinToolchain {
16-
private func findARCLiteLibPath() throws -> AbsolutePath? {
16+
internal func findARCLiteLibPath() throws -> AbsolutePath? {
1717
let path = try getToolPath(.swiftCompiler)
1818
.parentDirectory // 'swift'
1919
.parentDirectory // 'bin'

Sources/SwiftDriver/Toolchains/DarwinToolchain.swift

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ public final class DarwinToolchain: Toolchain {
123123

124124
public enum ToolchainValidationError: Error, DiagnosticData {
125125
case osVersionBelowMinimumDeploymentTarget(String)
126+
case argumentNotSupported(String)
126127
case iOSVersionAboveMaximumDeploymentTarget(Int)
127128
case unsupportedTargetVariant(variant: Triple)
129+
case darwinOnlySupportsLibCxx
128130

129131
public var description: String {
130132
switch self {
@@ -134,24 +136,38 @@ public final class DarwinToolchain: Toolchain {
134136
return "iOS \(version) does not support 32-bit programs"
135137
case .unsupportedTargetVariant(variant: let variant):
136138
return "unsupported '\(variant.isiOS ? "-target" : "-target-variant")' value '\(variant)'; use 'ios-macabi' instead"
139+
case .argumentNotSupported(let argument):
140+
return "\(argument) is no longer supported for Apple platforms"
141+
case .darwinOnlySupportsLibCxx:
142+
return "The only C++ standard library supported on Apple platforms is libc++"
137143
}
138144
}
139145
}
140146

141147
public func validateArgs(_ parsedOptions: inout ParsedOptions,
142148
targetTriple: Triple,
143-
targetVariantTriple: Triple?) throws {
144-
// TODO: Validating arclite library path when link-objc-runtime.
145-
149+
targetVariantTriple: Triple?,
150+
diagnosticsEngine: DiagnosticsEngine) throws {
151+
// Validating arclite library path when link-objc-runtime.
152+
validateLinkObjcRuntimeARCLiteLib(&parsedOptions,
153+
targetTriple: targetTriple,
154+
diagnosticsEngine: diagnosticsEngine)
146155
// Validating apple platforms deployment targets.
147156
try validateDeploymentTarget(&parsedOptions, targetTriple: targetTriple)
148157
if let targetVariantTriple = targetVariantTriple,
149158
!targetTriple.isValidForZipperingWithTriple(targetVariantTriple) {
150159
throw ToolchainValidationError.unsupportedTargetVariant(variant: targetVariantTriple)
151160
}
152-
153-
// TODO: Validating darwin unsupported -static-stdlib argument.
154-
// TODO: If a C++ standard library is specified, it has to be libc++.
161+
// Validating darwin unsupported -static-stdlib argument.
162+
if parsedOptions.hasArgument(.staticStdlib) {
163+
throw ToolchainValidationError.argumentNotSupported("-static-stdlib")
164+
}
165+
// If a C++ standard library is specified, it has to be libc++.
166+
if let cxxLib = parsedOptions.getLastArgument(.experimentalCxxStdlib) {
167+
if cxxLib.asSingle != "libc++" {
168+
throw ToolchainValidationError.darwinOnlySupportsLibCxx
169+
}
170+
}
155171
}
156172

157173
func validateDeploymentTarget(_ parsedOptions: inout ParsedOptions,
@@ -178,4 +194,24 @@ public final class DarwinToolchain: Toolchain {
178194
throw ToolchainValidationError.osVersionBelowMinimumDeploymentTarget("watchOS 2.0")
179195
}
180196
}
197+
198+
func validateLinkObjcRuntimeARCLiteLib(_ parsedOptions: inout ParsedOptions,
199+
targetTriple: Triple,
200+
diagnosticsEngine: DiagnosticsEngine) {
201+
if parsedOptions.hasFlag(positive: .linkObjcRuntime, negative: .noLinkObjcRuntime, default: targetTriple.supports(.compatibleObjCRuntime)) {
202+
guard let _ = try? findARCLiteLibPath() else {
203+
diagnosticsEngine.emit(.warn_arclite_not_found_when_link_objc_runtime)
204+
return
205+
}
206+
}
207+
}
208+
}
209+
210+
extension Diagnostic.Message {
211+
static var warn_arclite_not_found_when_link_objc_runtime: Diagnostic.Message {
212+
.warning(
213+
"unable to find Objective-C runtime support library 'arclite'; " +
214+
"pass '-no-link-objc-runtime' to silence this warning"
215+
)
216+
}
181217
}

Sources/SwiftDriver/Toolchains/Toolchain.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public protocol Toolchain {
5656
/// Perform platform-specific argument validation.
5757
func validateArgs(_ parsedOptions: inout ParsedOptions,
5858
targetTriple: Triple,
59-
targetVariantTriple: Triple?) throws
59+
targetVariantTriple: Triple?, diagnosticsEngine: DiagnosticsEngine) throws
6060

6161
/// Adds platform-specific linker flags to the provided command line
6262
func addPlatformSpecificLinkerArgs(
@@ -155,7 +155,7 @@ extension Toolchain {
155155

156156
public func validateArgs(_ parsedOptions: inout ParsedOptions,
157157
targetTriple: Triple,
158-
targetVariantTriple: Triple?) {}
158+
targetVariantTriple: Triple?, diagnosticsEngine: DiagnosticsEngine) {}
159159
}
160160

161161
public enum ToolchainError: Swift.Error {

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,23 @@ final class SwiftDriverTests: XCTestCase {
15401540
return
15411541
}
15421542
}
1543+
1544+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-static-stdlib", "-target", "x86_64-apple-macosx10.14",
1545+
"foo.swift"])) { error in
1546+
guard case DarwinToolchain.ToolchainValidationError.argumentNotSupported("-static-stdlib") = error else {
1547+
XCTFail()
1548+
return
1549+
}
1550+
}
1551+
1552+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "x86_64-apple-macosx10.14", "-experimental-cxx-stdlib", "libstdc++",
1553+
"foo.swift"])) { error in
1554+
guard case DarwinToolchain.ToolchainValidationError.darwinOnlySupportsLibCxx = error else {
1555+
XCTFail()
1556+
return
1557+
}
1558+
}
1559+
try assertNoDriverDiagnostics(args: "swiftc", "-c", "-target", "x86_64-apple-macosx10.14", "-link-objc-runtime", "foo.swift")
15431560
}
15441561

15451562
func testDSYMGeneration() throws {

0 commit comments

Comments
 (0)