Skip to content

Commit a79b6ff

Browse files
Fix LTO support for WebAssembly targets (#1710)
It seems .bc input file handling and `-flto` clang linker driver option were forgotten to be ported.
1 parent 2a49cfe commit a79b6ff

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift

+11
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ extension WebAssemblyToolchain {
106106
return .responseFilePath(input.file)
107107
} else if input.type == .object {
108108
return .path(input.file)
109+
} else if lto != nil && input.type == .llvmBitcode {
110+
return .path(input.file)
109111
} else {
110112
return nil
111113
}
@@ -162,6 +164,15 @@ extension WebAssemblyToolchain {
162164
throw Error.profilingUnsupportedForTarget(targetTriple.triple)
163165
}
164166

167+
if let lto = lto {
168+
switch lto {
169+
case .llvmFull:
170+
commandLine.appendFlag("-flto=full")
171+
case .llvmThin:
172+
commandLine.appendFlag("-flto=thin")
173+
}
174+
}
175+
165176
// Run clang++ in verbose mode if "-v" is set
166177
try commandLine.appendLast(.v, from: &parsedOptions)
167178

Tests/SwiftDriverTests/SwiftDriverTests.swift

+21
Original file line numberDiff line numberDiff line change
@@ -2172,6 +2172,27 @@ final class SwiftDriverTests: XCTestCase {
21722172
let linkJob3 = try plannedJobs3.findJob(.link)
21732173
XCTAssertTrue(linkJob3.tool.name.contains("clang"))
21742174
XCTAssertTrue(linkJob3.commandLine.contains(.flag("-flto=full")))
2175+
2176+
try withTemporaryDirectory { path in
2177+
try localFileSystem.writeFileContents(path.appending(components: "wasi", "static-executable-args.lnk")) {
2178+
$0.send("garbage")
2179+
}
2180+
var driver4 = try Driver(args: commonArgs + [
2181+
"-emit-executable", "-target", "wasm32-unknown-wasi", "-lto=llvm-thin", "baz.bc",
2182+
"-resource-dir", path.pathString
2183+
], env: env)
2184+
let plannedJobs4 = try driver4.planBuild()
2185+
XCTAssertFalse(plannedJobs4.containsJob(.autolinkExtract))
2186+
let linkJob4 = try plannedJobs4.findJob(.link)
2187+
XCTAssertTrue(linkJob4.tool.name.contains("clang"))
2188+
XCTAssertTrue(linkJob4.commandLine.contains(.flag("-flto=thin")))
2189+
for linkBcInput in ["foo", "bar", "baz.bc"] {
2190+
XCTAssertTrue(
2191+
linkJob4.inputs.contains { $0.file.basename.hasPrefix(linkBcInput) && $0.type == .llvmBitcode },
2192+
"Missing input \(linkBcInput)"
2193+
)
2194+
}
2195+
}
21752196
}
21762197

21772198
do {

0 commit comments

Comments
 (0)