From a5ce1b031359bff1515241ee034a158f3fb48f78 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 9 Oct 2024 15:23:49 +0000 Subject: [PATCH] Fix LTO support for WebAssembly targets --- .../WebAssemblyToolchain+LinkerSupport.swift | 11 ++++++++++ Tests/SwiftDriverTests/SwiftDriverTests.swift | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift index 6214fee4d..a0c0a02a0 100644 --- a/Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift @@ -106,6 +106,8 @@ extension WebAssemblyToolchain { return .responseFilePath(input.file) } else if input.type == .object { return .path(input.file) + } else if lto != nil && input.type == .llvmBitcode { + return .path(input.file) } else { return nil } @@ -162,6 +164,15 @@ extension WebAssemblyToolchain { throw Error.profilingUnsupportedForTarget(targetTriple.triple) } + if let lto = lto { + switch lto { + case .llvmFull: + commandLine.appendFlag("-flto=full") + case .llvmThin: + commandLine.appendFlag("-flto=thin") + } + } + // Run clang++ in verbose mode if "-v" is set try commandLine.appendLast(.v, from: &parsedOptions) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 2c6149df1..e2e13a308 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -2172,6 +2172,27 @@ final class SwiftDriverTests: XCTestCase { let linkJob3 = try plannedJobs3.findJob(.link) XCTAssertTrue(linkJob3.tool.name.contains("clang")) XCTAssertTrue(linkJob3.commandLine.contains(.flag("-flto=full"))) + + try withTemporaryDirectory { path in + try localFileSystem.writeFileContents(path.appending(components: "wasi", "static-executable-args.lnk")) { + $0.send("garbage") + } + var driver4 = try Driver(args: commonArgs + [ + "-emit-executable", "-target", "wasm32-unknown-wasi", "-lto=llvm-thin", "baz.bc", + "-resource-dir", path.pathString + ], env: env) + let plannedJobs4 = try driver4.planBuild() + XCTAssertFalse(plannedJobs4.containsJob(.autolinkExtract)) + let linkJob4 = try plannedJobs4.findJob(.link) + XCTAssertTrue(linkJob4.tool.name.contains("clang")) + XCTAssertTrue(linkJob4.commandLine.contains(.flag("-flto=thin"))) + for linkBcInput in ["foo", "bar", "baz.bc"] { + XCTAssertTrue( + linkJob4.inputs.contains { $0.file.basename.hasPrefix(linkBcInput) && $0.type == .llvmBitcode }, + "Missing input \(linkBcInput)" + ) + } + } } do {