Skip to content

Commit 7578683

Browse files
committed
Execution: special case the first two arguments in RSP mode
The second argument is often treated specially as a mode specifier for tools. This is particularly important for Windows where `-lib` or `/lib` passed to `link` or `ld.lld-link` will change the linker to the librarian. This argument may not be sunk into the response file as it is not treated as the mode specifier then. Special case the first two arguments to ensure that the mode switch parameter is always passed for any tools.
1 parent 069569e commit 7578683

File tree

2 files changed

+22
-20
lines changed

2 files changed

+22
-20
lines changed

Sources/SwiftDriver/Execution/ArgsResolver.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ public final class ArgsResolver {
216216
// Wrap all arguments in double quotes to ensure that both Unix and
217217
// Windows tools understand the response file.
218218
try fileSystem.writeFileContents(absPath) {
219-
$0.send(resolvedArguments[1...].map { quote($0) }.joined(separator: "\n"))
219+
$0.send(resolvedArguments[2...].map { quote($0) }.joined(separator: "\n"))
220220
}
221-
resolvedArguments = [resolvedArguments[0], "@\(absPath.pathString)"]
221+
resolvedArguments = [resolvedArguments[0], resolvedArguments[1], "@\(absPath.pathString)"]
222222
}
223223

224224
return true

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,11 +1613,12 @@ final class SwiftDriverTests: XCTestCase {
16131613
let interpretJob = jobs[0]
16141614
let resolver = try ArgsResolver(fileSystem: localFileSystem)
16151615
let resolvedArgs: [String] = try resolver.resolveArgumentList(for: interpretJob)
1616-
XCTAssertTrue(resolvedArgs.count == 2)
1617-
XCTAssertEqual(resolvedArgs[1].first, "@")
1618-
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[1].dropFirst()))
1616+
XCTAssertTrue(resolvedArgs.count == 3)
1617+
XCTAssertEqual(resolvedArgs[1], "-frontend")
1618+
XCTAssertEqual(resolvedArgs[2].first, "@")
1619+
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[2].dropFirst()))
16191620
let contents = try localFileSystem.readFileContents(responseFilePath).description
1620-
XCTAssertTrue(contents.hasPrefix("\"-frontend\"\n\"-interpret\"\n\"foo.swift\""))
1621+
XCTAssertTrue(contents.hasPrefix("\"-interpret\"\n\"foo.swift\""))
16211622
XCTAssertTrue(contents.contains("\"-D\"\n\"TEST_20000\""))
16221623
XCTAssertTrue(contents.contains("\"-D\"\n\"TEST_1\""))
16231624
}
@@ -1641,11 +1642,12 @@ final class SwiftDriverTests: XCTestCase {
16411642
let interpretJob = jobs[0]
16421643
let resolver = try ArgsResolver(fileSystem: localFileSystem)
16431644
let resolvedArgs: [String] = try resolver.resolveArgumentList(for: interpretJob, useResponseFiles: .forced)
1644-
XCTAssertTrue(resolvedArgs.count == 2)
1645-
XCTAssertEqual(resolvedArgs[1].first, "@")
1646-
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[1].dropFirst()))
1645+
XCTAssertTrue(resolvedArgs.count == 3)
1646+
XCTAssertEqual(resolvedArgs[1], "-frontend")
1647+
XCTAssertEqual(resolvedArgs[2].first, "@")
1648+
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[2].dropFirst()))
16471649
let contents = try localFileSystem.readFileContents(responseFilePath).description
1648-
XCTAssertTrue(contents.hasPrefix("\"-frontend\"\n\"-interpret\"\n\"foo.swift\""))
1650+
XCTAssertTrue(contents.hasPrefix("\"-interpret\"\n\"foo.swift\""))
16491651
}
16501652

16511653
// No response file
@@ -1679,16 +1681,16 @@ final class SwiftDriverTests: XCTestCase {
16791681
let emitModuleJob = try jobs.findJob(.emitModule)
16801682
let emitModuleResolvedArgs: [String] =
16811683
try resolver.resolveArgumentList(for: emitModuleJob)
1682-
XCTAssertEqual(emitModuleResolvedArgs.count, 2)
1683-
XCTAssertEqual(emitModuleResolvedArgs[1].first, "@")
1684+
XCTAssertEqual(emitModuleResolvedArgs.count, 3)
1685+
XCTAssertEqual(emitModuleResolvedArgs[2].first, "@")
16841686

16851687
let compileJobs = jobs.filter { $0.kind == .compile }
16861688
XCTAssertEqual(compileJobs.count, 2)
16871689
for compileJob in compileJobs {
16881690
let compileResolvedArgs: [String] =
16891691
try resolver.resolveArgumentList(for: compileJob)
1690-
XCTAssertEqual(compileResolvedArgs.count, 2)
1691-
XCTAssertEqual(compileResolvedArgs[1].first, "@")
1692+
XCTAssertEqual(compileResolvedArgs.count, 3)
1693+
XCTAssertEqual(compileResolvedArgs[2].first, "@")
16921694
}
16931695
}
16941696

@@ -1705,16 +1707,16 @@ final class SwiftDriverTests: XCTestCase {
17051707
let mergeModuleJob = try jobs.findJob(.mergeModule)
17061708
let mergeModuleResolvedArgs: [String] =
17071709
try resolver.resolveArgumentList(for: mergeModuleJob)
1708-
XCTAssertEqual(mergeModuleResolvedArgs.count, 2)
1709-
XCTAssertEqual(mergeModuleResolvedArgs[1].first, "@")
1710+
XCTAssertEqual(mergeModuleResolvedArgs.count, 3)
1711+
XCTAssertEqual(mergeModuleResolvedArgs[2].first, "@")
17101712

17111713
let compileJobs = jobs.filter { $0.kind == .compile }
17121714
XCTAssertEqual(compileJobs.count, 2)
17131715
for compileJob in compileJobs {
17141716
let compileResolvedArgs: [String] =
17151717
try resolver.resolveArgumentList(for: compileJob)
1716-
XCTAssertEqual(compileResolvedArgs.count, 2)
1717-
XCTAssertEqual(compileResolvedArgs[1].first, "@")
1718+
XCTAssertEqual(compileResolvedArgs.count, 3)
1719+
XCTAssertEqual(compileResolvedArgs[2].first, "@")
17181720
}
17191721
}
17201722

@@ -1730,8 +1732,8 @@ final class SwiftDriverTests: XCTestCase {
17301732
let generatePCMJob = jobs[0]
17311733
let generatePCMResolvedArgs: [String] =
17321734
try resolver.resolveArgumentList(for: generatePCMJob)
1733-
XCTAssertEqual(generatePCMResolvedArgs.count, 2)
1734-
XCTAssertEqual(generatePCMResolvedArgs[1].first, "@")
1735+
XCTAssertEqual(generatePCMResolvedArgs.count, 3)
1736+
XCTAssertEqual(generatePCMResolvedArgs[2].first, "@")
17351737
}
17361738
}
17371739

0 commit comments

Comments
 (0)