Skip to content

Commit afa44f3

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 48fcebd commit afa44f3

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-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: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,11 +1613,11 @@ 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[2].first, "@")
1618+
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[2].dropFirst()))
16191619
let contents = try localFileSystem.readFileContents(responseFilePath).description
1620-
XCTAssertTrue(contents.hasPrefix("\"-frontend\"\n\"-interpret\"\n\"foo.swift\""))
1620+
XCTAssertTrue(contents.hasPrefix("\"-interpret\"\n\"foo.swift\""))
16211621
XCTAssertTrue(contents.contains("\"-D\"\n\"TEST_20000\""))
16221622
XCTAssertTrue(contents.contains("\"-D\"\n\"TEST_1\""))
16231623
}
@@ -1641,11 +1641,11 @@ final class SwiftDriverTests: XCTestCase {
16411641
let interpretJob = jobs[0]
16421642
let resolver = try ArgsResolver(fileSystem: localFileSystem)
16431643
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()))
1644+
XCTAssertTrue(resolvedArgs.count == 3)
1645+
XCTAssertEqual(resolvedArgs[2].first, "@")
1646+
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[2].dropFirst()))
16471647
let contents = try localFileSystem.readFileContents(responseFilePath).description
1648-
XCTAssertTrue(contents.hasPrefix("\"-frontend\"\n\"-interpret\"\n\"foo.swift\""))
1648+
XCTAssertTrue(contents.hasPrefix("\"-interpret\"\n\"foo.swift\""))
16491649
}
16501650

16511651
// No response file
@@ -1679,16 +1679,16 @@ final class SwiftDriverTests: XCTestCase {
16791679
let emitModuleJob = try jobs.findJob(.emitModule)
16801680
let emitModuleResolvedArgs: [String] =
16811681
try resolver.resolveArgumentList(for: emitModuleJob)
1682-
XCTAssertEqual(emitModuleResolvedArgs.count, 2)
1683-
XCTAssertEqual(emitModuleResolvedArgs[1].first, "@")
1682+
XCTAssertEqual(emitModuleResolvedArgs.count, 3)
1683+
XCTAssertEqual(emitModuleResolvedArgs[2].first, "@")
16841684

16851685
let compileJobs = jobs.filter { $0.kind == .compile }
16861686
XCTAssertEqual(compileJobs.count, 2)
16871687
for compileJob in compileJobs {
16881688
let compileResolvedArgs: [String] =
16891689
try resolver.resolveArgumentList(for: compileJob)
1690-
XCTAssertEqual(compileResolvedArgs.count, 2)
1691-
XCTAssertEqual(compileResolvedArgs[1].first, "@")
1690+
XCTAssertEqual(compileResolvedArgs.count, 3)
1691+
XCTAssertEqual(compileResolvedArgs[2].first, "@")
16921692
}
16931693
}
16941694

@@ -1705,16 +1705,16 @@ final class SwiftDriverTests: XCTestCase {
17051705
let mergeModuleJob = try jobs.findJob(.mergeModule)
17061706
let mergeModuleResolvedArgs: [String] =
17071707
try resolver.resolveArgumentList(for: mergeModuleJob)
1708-
XCTAssertEqual(mergeModuleResolvedArgs.count, 2)
1709-
XCTAssertEqual(mergeModuleResolvedArgs[1].first, "@")
1708+
XCTAssertEqual(mergeModuleResolvedArgs.count, 3)
1709+
XCTAssertEqual(mergeModuleResolvedArgs[2].first, "@")
17101710

17111711
let compileJobs = jobs.filter { $0.kind == .compile }
17121712
XCTAssertEqual(compileJobs.count, 2)
17131713
for compileJob in compileJobs {
17141714
let compileResolvedArgs: [String] =
17151715
try resolver.resolveArgumentList(for: compileJob)
1716-
XCTAssertEqual(compileResolvedArgs.count, 2)
1717-
XCTAssertEqual(compileResolvedArgs[1].first, "@")
1716+
XCTAssertEqual(compileResolvedArgs.count, 3)
1717+
XCTAssertEqual(compileResolvedArgs[2].first, "@")
17181718
}
17191719
}
17201720

@@ -1730,8 +1730,8 @@ final class SwiftDriverTests: XCTestCase {
17301730
let generatePCMJob = jobs[0]
17311731
let generatePCMResolvedArgs: [String] =
17321732
try resolver.resolveArgumentList(for: generatePCMJob)
1733-
XCTAssertEqual(generatePCMResolvedArgs.count, 2)
1734-
XCTAssertEqual(generatePCMResolvedArgs[1].first, "@")
1733+
XCTAssertEqual(generatePCMResolvedArgs.count, 3)
1734+
XCTAssertEqual(generatePCMResolvedArgs[2].first, "@")
17351735
}
17361736
}
17371737

0 commit comments

Comments
 (0)