From ff2ac8b3298c30aa979d913739ccfacbff68f69f Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 29 Jan 2024 15:04:47 +0000 Subject: [PATCH 1/2] Embedded: don't link `swiftrt.o` for bare metal Currently when linking with `swiftc` for `-unknown-none-` triples, it attempts to link `swiftrt.o` runtime file, which is currently not needed and is not present for these triples. We should avoid linking it in these cases. --- .../GenericUnixToolchain+LinkerSupport.swift | 2 +- Tests/SwiftDriverTests/SwiftDriverTests.swift | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift index 3fd15847c..05f53a52f 100644 --- a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift @@ -185,7 +185,7 @@ extension GenericUnixToolchain { } } - if !parsedOptions.hasArgument(.nostartfiles) { + if !isEmbeddedEnabled && !parsedOptions.hasArgument(.nostartfiles) { let swiftrtPath = VirtualPath.lookup(targetInfo.runtimeResourcePath.path) .appending( components: targetTriple.platformName() ?? "", diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 39cc6a157..28c5b2f17 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -6549,10 +6549,12 @@ final class SwiftDriverTests: XCTestCase { let invalidPath = try VirtualPath(path: "/Tools/swift.xctoolchain/usr/lib/swift") let invalid = linkJob.commandLine.contains(.responseFilePath(invalidPath)) XCTAssertFalse(invalid) // ensure the driver does not emit invalid responseFilePaths to the clang invocation + XCTAssertFalse(linkJob.commandLine.joinedUnresolvedArguments.contains("swiftrt.o")) } + // Embedded Wasm compile job do { - var driver = try Driver(args: ["swiftc", "-target", "wasm32-none-none-wasm", "test.swift", "-enable-experimental-feature", "Embedded", "-wmo", "-o", "a.wasm"], env: env) + var driver = try Driver(args: ["swiftc", "-target", "wasm32-none-none-wasm", "test.swift", "-enable-experimental-feature", "Embedded", "-wmo", "-o", "a.wasm"], env: env) let plannedJobs = try driver.planBuild() XCTAssertEqual(plannedJobs.count, 3) let compileJob = plannedJobs[0] @@ -6563,6 +6565,20 @@ final class SwiftDriverTests: XCTestCase { XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore"))) } + + // 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) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(plannedJobs.count, 2) + let _ /*autolinkJob*/ = plannedJobs[0] + let linkJob = plannedJobs[1] + XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load"))) + XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath"))) + XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore"))) + XCTAssertFalse(linkJob.commandLine.joinedUnresolvedArguments.contains("swiftrt.o")) + } + 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) From a37cf288b118ef23c59e1ec8c315a9fa30f7afaa Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 29 Jan 2024 15:33:09 +0000 Subject: [PATCH 2/2] Embedded: pass `-nostdlib` for Embedded Wasm Embedded Wasm binaries don't have compatible compiler-rt or C stdlib available, turn it off by default. --- .../Jobs/GenericUnixToolchain+LinkerSupport.swift | 5 +++++ Tests/SwiftDriverTests/SwiftDriverTests.swift | 2 ++ 2 files changed, 7 insertions(+) diff --git a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift index 05f53a52f..502fbc563 100644 --- a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift @@ -195,6 +195,11 @@ extension GenericUnixToolchain { commandLine.appendPath(swiftrtPath) } + // Embedded Wasm binaries don't have compatible compiler-rt or C stdlib available, turn it off by default. + if isEmbeddedEnabled && (targetTriple.arch == .wasm32 || targetTriple.arch == .wasm64) { + commandLine.appendFlag("-nostdlib") + } + // If we are linking statically, we need to add all // dependencies to a library search group to resolve // potential circular dependencies diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 28c5b2f17..4cd75349d 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -6564,6 +6564,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore"))) + XCTAssertTrue(linkJob.commandLine.contains(.flag("-nostdlib"))) } // Embedded Wasm link job @@ -6576,6 +6577,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath"))) XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore"))) + XCTAssertTrue(linkJob.commandLine.contains(.flag("-nostdlib"))) XCTAssertFalse(linkJob.commandLine.joinedUnresolvedArguments.contains("swiftrt.o")) }