Skip to content

Commit f902c2a

Browse files
Merge pull request #1538 from kateinoigakukun/yt/fix-wasm-clang-linker
2 parents ef88c99 + b4fba6f commit f902c2a

6 files changed

+40
-22
lines changed

Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift

+1-7
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,7 @@ extension DarwinToolchain {
272272
from: &parsedOptions
273273
)
274274
addLinkedLibArgs(to: &commandLine, parsedOptions: &parsedOptions)
275-
// Because we invoke `clang` as the linker executable, we must still
276-
// use `-Xlinker` for linker-specific arguments.
277-
for linkerOpt in parsedOptions.arguments(for: .Xlinker) {
278-
commandLine.appendFlag(.Xlinker)
279-
commandLine.appendFlag(linkerOpt.argument.asSingle)
280-
}
281-
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
275+
try addExtraClangLinkerArgs(to: &commandLine, parsedOptions: &parsedOptions)
282276
}
283277
}
284278

Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift

+1-7
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,7 @@ extension GenericUnixToolchain {
321321
from: &parsedOptions
322322
)
323323
addLinkedLibArgs(to: &commandLine, parsedOptions: &parsedOptions)
324-
// Because we invoke `clang` as the linker executable, we must still
325-
// use `-Xlinker` for linker-specific arguments.
326-
for linkerOpt in parsedOptions.arguments(for: .Xlinker) {
327-
commandLine.appendFlag(.Xlinker)
328-
commandLine.appendFlag(linkerOpt.argument.asSingle)
329-
}
330-
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
324+
try addExtraClangLinkerArgs(to: &commandLine, parsedOptions: &parsedOptions)
331325

332326
// This should be the last option, for convenience in checking output.
333327
commandLine.appendFlag(.o)

Sources/SwiftDriver/Jobs/Toolchain+LinkerSupport.swift

+13
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ extension Toolchain {
9090
commandLine.appendFlag(match.option.spelling + match.argument.asSingle)
9191
}
9292
}
93+
94+
func addExtraClangLinkerArgs(
95+
to commandLine: inout [Job.ArgTemplate],
96+
parsedOptions: inout ParsedOptions
97+
) throws {
98+
// Because we invoke `clang` as the linker executable, we must still
99+
// use `-Xlinker` for linker-specific arguments.
100+
for linkerOpt in parsedOptions.arguments(for: .Xlinker) {
101+
commandLine.appendFlag(.Xlinker)
102+
commandLine.appendFlag(linkerOpt.argument.asSingle)
103+
}
104+
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
105+
}
93106
}
94107

95108
// MARK: - Common argument routines

Sources/SwiftDriver/Jobs/WebAssemblyToolchain+LinkerSupport.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,7 @@ extension WebAssemblyToolchain {
158158
from: &parsedOptions
159159
)
160160
addLinkedLibArgs(to: &commandLine, parsedOptions: &parsedOptions)
161-
try commandLine.appendAllArguments(.Xlinker, from: &parsedOptions)
162-
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
161+
try addExtraClangLinkerArgs(to: &commandLine, parsedOptions: &parsedOptions)
163162

164163
// This should be the last option, for convenience in checking output.
165164
commandLine.appendFlag(.o)

Sources/SwiftDriver/Jobs/WindowsToolchain+LinkerSupport.swift

+1-6
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,7 @@ extension WindowsToolchain {
197197
commandLine.appendFlag("-lclang_rt.profile")
198198
}
199199

200-
for option in parsedOptions.arguments(for: .Xlinker) {
201-
commandLine.appendFlag(.Xlinker)
202-
commandLine.appendFlag(option.argument.asSingle)
203-
}
204-
// TODO(compnerd) is there a separate equivalent to OPT_linker_option_group?
205-
try commandLine.appendAllArguments(.XclangLinker, from: &parsedOptions)
200+
try addExtraClangLinkerArgs(to: &commandLine, parsedOptions: &parsedOptions)
206201

207202
if parsedOptions.contains(.v) {
208203
commandLine.appendFlag("-v")

Tests/SwiftDriverTests/SwiftDriverTests.swift

+23
Original file line numberDiff line numberDiff line change
@@ -1906,6 +1906,29 @@ final class SwiftDriverTests: XCTestCase {
19061906
XCTAssertTrue(cmd.contains(subsequence: [.flag("-Xlinker"), .flag("-rpath=$ORIGIN"), .flag("foo")]))
19071907
}
19081908

1909+
do {
1910+
// Xlinker flags
1911+
// Ensure that Xlinker flags are passed as such to the clang linker invocation.
1912+
try withTemporaryDirectory { path in
1913+
try localFileSystem.writeFileContents(path.appending(components: "wasi", "static-executable-args.lnk")) {
1914+
$0.send("garbage")
1915+
}
1916+
var driver = try Driver(args: commonArgs + ["-emit-executable", "-L", "/tmp", "-Xlinker", "--export-all",
1917+
"-Xlinker", "-E", "-Xclang-linker", "foo",
1918+
"-resource-dir", path.pathString,
1919+
"-target", "wasm32-unknown-wasi"], env: env)
1920+
let plannedJobs = try driver.planBuild()
1921+
XCTAssertEqual(plannedJobs.count, 4)
1922+
let linkJob = plannedJobs[3]
1923+
let cmd = linkJob.commandLine
1924+
XCTAssertTrue(cmd.contains(subsequence: [
1925+
.flag("-Xlinker"), .flag("--export-all"),
1926+
.flag("-Xlinker"), .flag("-E"),
1927+
.flag("foo")
1928+
]))
1929+
}
1930+
}
1931+
19091932
do {
19101933
var driver = try Driver(args: commonArgs + ["-emit-library", "-no-toolchain-stdlib-rpath",
19111934
"-target", "aarch64-unknown-linux"], env: env)

0 commit comments

Comments
 (0)