Skip to content

Commit f64c512

Browse files
committed
Building object files using -c with -lto should respect the output file path (-o) if present
1 parent 9769aad commit f64c512

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

Sources/SwiftDriver/Jobs/CompileJob.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ extension Driver {
7979
case .object:
8080
return (linkerOutputType == nil)
8181
case .llvmBitcode:
82+
if linkerOutputType == nil {
83+
return true
84+
}
85+
8286
if compilerOutputType != .llvmBitcode {
8387
// The compiler output isn't bitcode, so bitcode isn't top-level (-embed-bitcode).
8488
return false

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,27 @@ final class SwiftDriverTests: XCTestCase {
313313
XCTAssertEqual(driver6.compilerOutputType, .llvmBitcode)
314314
}
315315

316+
func testLtoOutputPath() throws {
317+
var driver1 = try Driver(args: ["swiftc", "foo.swift", "-lto=llvm-full",
318+
"-c", "-target", "x86_64-apple-macosx10.9"])
319+
XCTAssertEqual(driver1.compilerOutputType, .llvmBitcode)
320+
XCTAssertEqual(driver1.linkerOutputType, nil)
321+
let jobs1 = try driver1.planBuild()
322+
XCTAssertEqual(jobs1.count, 1)
323+
XCTAssertEqual(jobs1[0].outputs.count, 1)
324+
XCTAssertEqual(jobs1[0].outputs[0].file.basename, "foo.bc")
325+
326+
var driver2 = try Driver(args: ["swiftc", "foo.swift", "-lto=llvm-full",
327+
"-c", "-target", "x86_64-apple-macosx10.9",
328+
"-o", "foo.o"])
329+
XCTAssertEqual(driver2.compilerOutputType, .llvmBitcode)
330+
XCTAssertEqual(driver2.linkerOutputType, nil)
331+
let jobs2 = try driver2.planBuild()
332+
XCTAssertEqual(jobs2.count, 1)
333+
XCTAssertEqual(jobs2[0].outputs.count, 1)
334+
XCTAssertEqual(jobs2[0].outputs[0].file.basename, "foo.o")
335+
}
336+
316337
func testPrimaryOutputKindsDiagnostics() throws {
317338
try assertDriverDiagnostics(args: "swift", "-i") {
318339
$1.expect(.error("the flag '-i' is no longer required and has been removed; use 'swift input-filename'"))
@@ -4261,7 +4282,7 @@ final class SwiftDriverTests: XCTestCase {
42614282
XCTAssertEqual(plannedJobs[1].inputs.count, 2)
42624283
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
42634284
XCTAssertEqual(plannedJobs[1].outputs.count, 1)
4264-
XCTAssertTrue(matchTemporary(plannedJobs[1].outputs[0].file, "foo.bc"))
4285+
XCTAssertEqual(plannedJobs[1].outputs[0].file, try VirtualPath(path: "foo.bc"))
42654286

42664287
XCTAssertEqual(plannedJobs[2].kind, .backend)
42674288
}
@@ -4541,11 +4562,11 @@ final class SwiftDriverTests: XCTestCase {
45414562
XCTAssertEqual(compileJob.inputs.count, 1)
45424563
XCTAssertEqual(compileJob.inputs[0].file, .relative(RelativePath("embed-bitcode.swift")))
45434564
XCTAssertEqual(compileJob.outputs.count, 1)
4544-
XCTAssertTrue(matchTemporary(compileJob.outputs[0].file, "embed-bitcode.bc"))
4565+
XCTAssertEqual(compileJob.outputs[0].file, .relative(RelativePath("embed-bitcode.bc")))
45454566

45464567
let backendJob = plannedJobs.first(where: {$0.kind == .backend})!
45474568
XCTAssertEqual(backendJob.inputs.count, 1)
4548-
XCTAssertTrue(matchTemporary(backendJob.inputs[0].file, "embed-bitcode.bc"))
4569+
XCTAssertEqual(backendJob.inputs[0].file, .relative(RelativePath("embed-bitcode.bc")))
45494570
XCTAssertEqual(backendJob.outputs.count, 1)
45504571
XCTAssertEqual(backendJob.outputs[0].file, .relative(RelativePath("embed-bitcode.o")))
45514572

@@ -4588,21 +4609,21 @@ final class SwiftDriverTests: XCTestCase {
45884609

45894610
XCTAssertEqual(plannedJobs[1].kind, .compile)
45904611
XCTAssertEqual(plannedJobs[1].outputs.count, 1)
4591-
XCTAssertTrue(matchTemporary(plannedJobs[1].outputs[0].file, "embed-bitcode.bc"))
4612+
XCTAssertEqual(plannedJobs[1].outputs[0].file, .relative(RelativePath("embed-bitcode.bc")))
45924613

45934614
XCTAssertEqual(plannedJobs[2].kind, .backend)
45944615
XCTAssertEqual(plannedJobs[2].inputs.count, 1)
4595-
XCTAssertTrue(matchTemporary(plannedJobs[2].inputs[0].file, "embed-bitcode.bc"))
4616+
XCTAssertEqual(plannedJobs[2].inputs[0].file, .relative(RelativePath("embed-bitcode.bc")))
45964617
XCTAssertEqual(plannedJobs[2].outputs.count, 1)
45974618
XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("embed-bitcode.o")))
45984619

45994620
XCTAssertEqual(plannedJobs[3].kind, .compile)
46004621
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
4601-
XCTAssertTrue(matchTemporary(plannedJobs[3].outputs[0].file, "empty.bc"))
4622+
XCTAssertEqual(plannedJobs[3].outputs[0].file, .relative(RelativePath("empty.bc")))
46024623

46034624
XCTAssertEqual(plannedJobs[4].kind, .backend)
46044625
XCTAssertEqual(plannedJobs[4].inputs.count, 1)
4605-
XCTAssertTrue(matchTemporary(plannedJobs[4].inputs[0].file, "empty.bc"))
4626+
XCTAssertEqual(plannedJobs[4].inputs[0].file, .relative(RelativePath("empty.bc")))
46064627

46074628
XCTAssertEqual(plannedJobs[4].outputs.count, 1)
46084629
XCTAssertEqual(plannedJobs[4].outputs[0].file, .relative(RelativePath("empty.o")))
@@ -4627,11 +4648,11 @@ final class SwiftDriverTests: XCTestCase {
46274648
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
46284649
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("embed-bitcode.swift")))
46294650
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
4630-
XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "Swift.bc"))
4651+
XCTAssertEqual(plannedJobs[0].outputs[0].file, .relative(RelativePath("Swift.bc")))
46314652

46324653
XCTAssertEqual(plannedJobs[1].kind, .backend)
46334654
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
4634-
XCTAssertTrue(matchTemporary(plannedJobs[1].inputs[0].file, "Swift.bc"))
4655+
XCTAssertEqual(plannedJobs[1].inputs[0].file, .relative(RelativePath("Swift.bc")))
46354656
XCTAssertEqual(plannedJobs[1].outputs.count, 1)
46364657
XCTAssertEqual(plannedJobs[1].outputs[0].file, .relative(RelativePath("Swift.o")))
46374658
}
@@ -5162,9 +5183,9 @@ final class SwiftDriverTests: XCTestCase {
51625183
return
51635184
}
51645185
XCTAssertTrue(outputs.count == 3)
5165-
XCTAssertTrue(matchTemporary(outputs[0], "a.bc"))
5166-
XCTAssertTrue(matchTemporary(outputs[1], "b.bc"))
5167-
XCTAssertTrue(matchTemporary(outputs[2], "c.bc"))
5186+
XCTAssertEqual(outputs[0], try VirtualPath(path: "a.bc"))
5187+
XCTAssertEqual(outputs[1], try VirtualPath(path: "b.bc"))
5188+
XCTAssertEqual(outputs[2], try VirtualPath(path: "c.bc"))
51685189
}
51695190

51705191
do {

0 commit comments

Comments
 (0)