From 36ae38dac5973ec161c22f9f61b94df907387d80 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 20 Feb 2024 19:44:55 +0000 Subject: [PATCH] Allow passing `-nostdlib` to `clang` linker driver Embedded targets may need `-nostdlib` passed to `clang` linker driver in certain situations, see https://github.com/apple/swift-driver/pull/1534 for more details. Currently, `swiftc` doesn't recognize `-nostdlib` at all, while `-Xlinker -nostdlib` passed to a `swiftc` link job from the build system will be passed verbatim to the linker and not recognized by the linker driver. We should support this flag in `swiftc` to fix this. --- Sources/SwiftOptions/Options.swift | 2 ++ Tests/SwiftDriverTests/SwiftDriverTests.swift | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Sources/SwiftOptions/Options.swift b/Sources/SwiftOptions/Options.swift index b92b3fce1..286b60310 100644 --- a/Sources/SwiftOptions/Options.swift +++ b/Sources/SwiftOptions/Options.swift @@ -608,6 +608,7 @@ extension Option { public static let driverScanDependenciesNonLib: Option = Option("-nonlib-dependency-scanner", .flag, attributes: [.helpHidden], helpText: "Use calls to `swift-frontend -scan-dependencies` instead of dedicated dependency scanning library") public static let nostartfiles: Option = Option("-nostartfiles", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Do not link in the Swift language startup routines") public static let nostdimport: Option = Option("-nostdimport", .flag, attributes: [.frontend], helpText: "Don't search the standard library import path for modules") + public static let nostdlib: Option = Option("-nostdlib", .flag, attributes: [.helpHidden], helpText: "Don't link the C and compiler runtime libraries", group: .linkerOption) public static let numThreads: Option = Option("-num-threads", .separate, attributes: [.frontend, .doesNotAffectIncrementalBuild, .cacheInvariant], metaVar: "", helpText: "Enable multi-threading and specify number of threads") public static let omitExtensionBlockSymbols: Option = Option("-omit-extension-block-symbols", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .supplementaryOutput], helpText: "Directly associate members and conformances with the extended nominal when generating symbol graphs instead of emitting 'swift.extension' symbols for extensions to external types") public static let Onone: Option = Option("-Onone", .flag, attributes: [.frontend, .moduleInterface], helpText: "Compile without any optimization", group: .O) @@ -1437,6 +1438,7 @@ extension Option { Option.driverScanDependenciesNonLib, Option.nostartfiles, Option.nostdimport, + Option.nostdlib, Option.numThreads, Option.omitExtensionBlockSymbols, Option.Onone, diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 3825962bb..fbb61c37a 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -6635,11 +6635,12 @@ final class SwiftDriverTests: XCTestCase { // Embedded Wasm link job do { - var driver = try Driver(args: ["swiftc", "-target", "wasm32-none-none-wasm", "test.o", "-enable-experimental-feature", "Embedded", "-wmo", "-o", "a.wasm"], env: env) + var driver = try Driver(args: ["swiftc", "-target", "wasm32-none-none-wasm", "test.o", "-enable-experimental-feature", "Embedded", "-wmo", "-nostdlib", "-o", "a.wasm"], env: env) let plannedJobs = try driver.planBuild() XCTAssertEqual(plannedJobs.count, 2) let _ /*autolinkJob*/ = plannedJobs[0] let linkJob = plannedJobs[1] + XCTAssertTrue(linkJob.commandLine.contains(.flag("-nostdlib"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore"))) @@ -6648,19 +6649,19 @@ final class SwiftDriverTests: XCTestCase { do { let diags = DiagnosticsEngine() - var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main", "-enable-library-evolution"], diagnosticsEngine: diags) + var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main", "-enable-library-evolution"], diagnosticsEngine: diags) _ = try driver.planBuild() XCTAssertTrue(diags.diagnostics.first!.message.text == Diagnostic.Message.error_no_library_evolution_embedded.text) } catch _ { } do { let diags = DiagnosticsEngine() - var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-o", "a.out", "-module-name", "main"], diagnosticsEngine: diags) + var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-o", "a.out", "-module-name", "main"], diagnosticsEngine: diags) _ = try driver.planBuild() XCTAssertTrue(diags.diagnostics.first!.message.text == Diagnostic.Message.error_need_wmo_embedded.text) } catch _ { } do { let diags = DiagnosticsEngine() - var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main", "-enable-objc-interop"], diagnosticsEngine: diags) + var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main", "-enable-objc-interop"], diagnosticsEngine: diags) _ = try driver.planBuild() XCTAssertTrue(diags.diagnostics.first!.message.text == Diagnostic.Message.error_no_objc_interop_embedded.text) } catch _ { }