From efb128132e1ff5aa8bf84842c89bfe4e571abbcf Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Tue, 15 Nov 2022 17:06:41 -0800 Subject: [PATCH] Revert "Revert "Only add '-fobjc-link-runtime' to the linker invocation when the driver is invoked with '-link-objc-runtime'"" This reverts commit 2dbaf861ac9cfc0f3affe8d5d13f5f34c931a499. --- .../Jobs/DarwinToolchain+LinkerSupport.swift | 9 +++-- Tests/SwiftDriverTests/SwiftDriverTests.swift | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift index 39a8a3411..f37d80bbc 100644 --- a/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift @@ -214,9 +214,14 @@ extension DarwinToolchain { commandLine.appendPath(VirtualPath.lookup(sdkPath)) } + // -link-objc-runtime also implies -fobjc-link-runtime + if parsedOptions.hasFlag(positive: .linkObjcRuntime, + negative: .noLinkObjcRuntime, + default: false) { + commandLine.appendFlag("-fobjc-link-runtime") + } + commandLine.appendFlags( - "-fobjc-link-runtime", - "-lobjc", "-lSystem" ) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 19db3d932..8a8328a23 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -1653,6 +1653,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertFalse(cmd.contains(.flag("-static"))) XCTAssertFalse(cmd.contains(.flag("-shared"))) + // Handling of '-lobjc' is now in the Clang linker driver. + XCTAssertFalse(cmd.contains(.flag("-lobjc"))) } do { @@ -1728,6 +1730,39 @@ final class SwiftDriverTests: XCTestCase { XCTAssertFalse(cmd.contains(.flag("-shared"))) } + do { + // -fobjc-link-runtime default + var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15"], env: env) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(3, plannedJobs.count) + let linkJob = plannedJobs[2] + XCTAssertEqual(linkJob.kind, .link) + let cmd = linkJob.commandLine + XCTAssertFalse(cmd.contains(.flag("-fobjc-link-runtime"))) + } + + do { + // -fobjc-link-runtime enable + var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15", "-link-objc-runtime"], env: env) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(3, plannedJobs.count) + let linkJob = plannedJobs[2] + XCTAssertEqual(linkJob.kind, .link) + let cmd = linkJob.commandLine + XCTAssertTrue(cmd.contains(.flag("-fobjc-link-runtime"))) + } + + do { + // -fobjc-link-runtime disable override + var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15", "-link-objc-runtime", "-no-link-objc-runtime"], env: env) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(3, plannedJobs.count) + let linkJob = plannedJobs[2] + XCTAssertEqual(linkJob.kind, .link) + let cmd = linkJob.commandLine + XCTAssertFalse(cmd.contains(.flag("-fobjc-link-runtime"))) + } + do { // Xlinker flags // Ensure that Xlinker flags are passed as such to the clang linker invocation.