Skip to content

Commit e1e6378

Browse files
authored
Merge pull request #201 from owenv/object-format-fix
Infer object format when it can't be determined from a triple's successfully parsed environment
2 parents 2169113 + f65f94c commit e1e6378

File tree

4 files changed

+98
-51
lines changed

4 files changed

+98
-51
lines changed

Sources/SwiftDriver/Utilities/Triple.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ public struct Triple {
167167
if let parsedEnv = parsedEnv {
168168
self.environment = parsedEnv.value.environment
169169
self.objectFormat = parsedEnv.value.objectFormat
170+
?? ObjectFormat.infer(arch: parsedArch?.value.arch,
171+
os: parsedOS?.value)
170172
}
171173
else {
172174
self.environment = Environment.infer(archName: parsedArch?.substring)

Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ final class ExplicitModuleBuildTests: XCTestCase {
322322
case .relative(RelativePath("main")):
323323
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
324324
XCTAssertEqual(job.kind, .link)
325+
326+
case .temporary(RelativePath("main.autolink")):
327+
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
328+
XCTAssertEqual(job.kind, .autolinkExtract)
329+
325330
default:
326331
XCTFail("Unexpected module dependency build job output: \(job.outputs[0].file)")
327332
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 88 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ final class SwiftDriverTests: XCTestCase {
240240
// Test the combination of -c and -o includes the base output path.
241241
do {
242242
var driver = try Driver(args: ["swiftc", "-c", "foo.swift", "-o", "/some/output/path/bar.o"])
243-
let plannedJobs = try driver.planBuild()
243+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
244244
XCTAssertEqual(plannedJobs.count, 1)
245245
XCTAssertEqual(plannedJobs[0].kind, .compile)
246246
XCTAssertTrue(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/some/output/path/bar.o"))))
@@ -410,7 +410,7 @@ final class SwiftDriverTests: XCTestCase {
410410

411411
func testStandardCompileJobs() throws {
412412
var driver1 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test"])
413-
let plannedJobs = try driver1.planBuild()
413+
let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs()
414414
XCTAssertEqual(plannedJobs.count, 3)
415415
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
416416
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo.o")))
@@ -1129,7 +1129,7 @@ final class SwiftDriverTests: XCTestCase {
11291129
func testBatchModeCompiles() throws {
11301130
do {
11311131
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-enable-batch-mode", "-driver-batch-count", "3"])
1132-
let plannedJobs = try driver1.planBuild()
1132+
let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs()
11331133
XCTAssertEqual(plannedJobs.count, 4)
11341134
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
11351135
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo1.o")))
@@ -1145,7 +1145,7 @@ final class SwiftDriverTests: XCTestCase {
11451145
// Test 1 partition results in 1 job
11461146
do {
11471147
var driver = try Driver(args: ["swiftc", "-toolchain-stdlib-rpath", "-module-cache-path", "/tmp/clang-module-cache", "-swift-version", "4", "-Xfrontend", "-ignore-module-source-info", "-module-name", "batch", "-enable-batch-mode", "-j", "1", "-c", "main.swift", "lib.swift"])
1148-
let plannedJobs = try driver.planBuild()
1148+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
11491149
XCTAssertEqual(plannedJobs.count, 1)
11501150
var count = 0
11511151
for arg in plannedJobs[0].commandLine where arg == .flag("-primary-file") {
@@ -1176,7 +1176,7 @@ final class SwiftDriverTests: XCTestCase {
11761176
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift",
11771177
"-module-name", "Test", "-num-threads", "4"
11781178
])
1179-
let plannedJobs = try driver1.planBuild()
1179+
let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs()
11801180
XCTAssertEqual(plannedJobs.count, 2)
11811181
XCTAssertEqual(plannedJobs[0].kind, .compile)
11821182
XCTAssertEqual(plannedJobs[0].outputs.count, 3)
@@ -1191,7 +1191,7 @@ final class SwiftDriverTests: XCTestCase {
11911191
// emit-module
11921192
do {
11931193
var driver = try Driver(args: ["swiftc", "-module-name=ThisModule", "-wmo", "-num-threads", "4", "main.swift", "multi-threaded.swift", "-emit-module", "-o", "test.swiftmodule"])
1194-
let plannedJobs = try driver.planBuild()
1194+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
11951195
XCTAssertEqual(plannedJobs.count, 1)
11961196
XCTAssertEqual(plannedJobs[0].kind, .compile)
11971197
XCTAssertEqual(plannedJobs[0].inputs.count, 2)
@@ -1218,7 +1218,7 @@ final class SwiftDriverTests: XCTestCase {
12181218
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
12191219
"-num-threads", "4", "-output-file-map", file.path.pathString, "-emit-module-interface"
12201220
])
1221-
let plannedJobs = try driver1.planBuild()
1221+
let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs()
12221222
XCTAssertEqual(plannedJobs.count, 2)
12231223
XCTAssertEqual(plannedJobs[0].kind, .compile)
12241224
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
@@ -1310,52 +1310,49 @@ final class SwiftDriverTests: XCTestCase {
13101310
}
13111311

13121312
func testModuleWrapJob() throws {
1313+
// FIXME: These tests will fail when run on macOS, because
1314+
// swift-autolink-extract is not present
1315+
#if os(Linux)
13131316
do {
13141317
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "-g", "foo.swift"])
13151318
let plannedJobs = try driver.planBuild()
1316-
XCTAssertEqual(plannedJobs.count, 4)
1317-
// FIXME: There should also be an autolink-extract job. It looks like our
1318-
// triple parsing code is not detecting the object file format correctly.
1319-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .moduleWrap, .link])
1320-
XCTAssertEqual(plannedJobs[2].inputs.count, 1)
1321-
XCTAssertEqual(plannedJobs[2].inputs.count, 1)
1322-
XCTAssertTrue(plannedJobs[2].commandLine.contains(subsequence: ["-target", "x86_64-unknown-linux-gnu"]))
1323-
XCTAssertTrue(plannedJobs[1].outputs.contains(plannedJobs[2].inputs.first!))
1324-
XCTAssertTrue(plannedJobs[3].inputs.contains(plannedJobs[2].outputs.first!))
1325-
}
1326-
1327-
// dsymutil won't be found on other platforms
1328-
#if os(macOS)
1329-
do {
1330-
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift"])
1331-
let plannedJobs = try driver.planBuild()
1332-
XCTAssertEqual(plannedJobs.count, 4)
1333-
// No module wrapping with Mach-O.
1334-
// FIXME: There should also be an autolink-extract job. It looks like our
1335-
// triple parsing code is not detecting the object file format correctly.
1336-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link, .generateDSYM])
1319+
XCTAssertEqual(plannedJobs.count, 5)
1320+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .autolinkExtract, .moduleWrap, .link])
1321+
XCTAssertEqual(plannedJobs[3].inputs.count, 1)
1322+
XCTAssertEqual(plannedJobs[3].inputs.count, 1)
1323+
XCTAssertTrue(plannedJobs[3].commandLine.contains(subsequence: ["-target", "x86_64-unknown-linux-gnu"]))
1324+
XCTAssertTrue(plannedJobs[1].outputs.contains(plannedJobs[3].inputs.first!))
1325+
XCTAssertTrue(plannedJobs[4].inputs.contains(plannedJobs[3].outputs.first!))
13371326
}
1338-
#endif
13391327

13401328
do {
13411329
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "foo.swift"])
13421330
let plannedJobs = try driver.planBuild()
1343-
XCTAssertEqual(plannedJobs.count, 2)
1331+
XCTAssertEqual(plannedJobs.count, 3)
13441332
// No merge module/module wrap jobs.
1345-
// FIXME: There should also be an autolink-extract job. It looks like our
1346-
// triple parsing code is not detecting the object file format correctly.
1347-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .link])
1333+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .autolinkExtract, .link])
13481334
}
13491335

13501336
do {
13511337
var driver = try Driver(args: ["swiftc", "-target", "x86_64-unknown-linux-gnu", "-gdwarf-types", "foo.swift"])
13521338
let plannedJobs = try driver.planBuild()
1353-
XCTAssertEqual(plannedJobs.count, 3)
1339+
XCTAssertEqual(plannedJobs.count, 4)
13541340
// Merge module, but no module wrapping.
1341+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .autolinkExtract, .link])
1342+
}
1343+
#endif
1344+
// dsymutil won't be found on other platforms
1345+
#if os(macOS)
1346+
do {
1347+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift"])
1348+
let plannedJobs = try driver.planBuild()
1349+
XCTAssertEqual(plannedJobs.count, 4)
1350+
// No module wrapping with Mach-O.
13551351
// FIXME: There should also be an autolink-extract job. It looks like our
13561352
// triple parsing code is not detecting the object file format correctly.
1357-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link])
1353+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link, .generateDSYM])
13581354
}
1355+
#endif
13591356
}
13601357

13611358
func testRepl() throws {
@@ -1617,7 +1614,7 @@ final class SwiftDriverTests: XCTestCase {
16171614
do {
16181615
// No dSYM generation (no -g)
16191616
var driver = try Driver(args: commonArgs)
1620-
let plannedJobs = try driver.planBuild()
1617+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
16211618

16221619
XCTAssertEqual(plannedJobs.count, 3)
16231620
XCTAssertFalse(plannedJobs.contains { $0.kind == .generateDSYM })
@@ -1626,7 +1623,7 @@ final class SwiftDriverTests: XCTestCase {
16261623
do {
16271624
// No dSYM generation (-gnone)
16281625
var driver = try Driver(args: commonArgs + ["-gnone"])
1629-
let plannedJobs = try driver.planBuild()
1626+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
16301627

16311628
XCTAssertEqual(plannedJobs.count, 3)
16321629
XCTAssertFalse(plannedJobs.contains { $0.kind == .generateDSYM })
@@ -1644,7 +1641,7 @@ final class SwiftDriverTests: XCTestCase {
16441641
XCTAssertEqual(plannedJobs.count, 5)
16451642
XCTAssertEqual(generateDSYMJob.outputs.last?.file, try VirtualPath(path: "Test.dSYM"))
16461643
} else {
1647-
XCTAssertEqual(plannedJobs.count, 5)
1644+
XCTAssertEqual(plannedJobs.count, 6)
16481645
XCTAssertFalse(plannedJobs.map { $0.kind }.contains(.generateDSYM))
16491646
}
16501647

@@ -1661,23 +1658,23 @@ final class SwiftDriverTests: XCTestCase {
16611658
// No dSYM generation (no -g), therefore no verification
16621659
try assertDriverDiagnostics(args: commonArgs) { driver, verifier in
16631660
verifier.expect(.warning("ignoring '-verify-debug-info'; no debug info is being generated"))
1664-
let plannedJobs = try driver.planBuild()
1661+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
16651662
XCTAssertEqual(plannedJobs.count, 3)
16661663
XCTAssertFalse(plannedJobs.contains { $0.kind == .verifyDebugInfo })
16671664
}
16681665

16691666
// No dSYM generation (-gnone), therefore no verification
16701667
try assertDriverDiagnostics(args: commonArgs + ["-gnone"]) { driver, verifier in
16711668
verifier.expect(.warning("ignoring '-verify-debug-info'; no debug info is being generated"))
1672-
let plannedJobs = try driver.planBuild()
1669+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
16731670
XCTAssertEqual(plannedJobs.count, 3)
16741671
XCTAssertFalse(plannedJobs.contains { $0.kind == .verifyDebugInfo })
16751672
}
16761673

16771674
do {
16781675
// dSYM generation and verification (-g + -verify-debug-info)
16791676
var driver = try Driver(args: commonArgs + ["-g"])
1680-
let plannedJobs = try driver.planBuild()
1677+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
16811678

16821679
let verifyDebugInfoJob = plannedJobs.last!
16831680
let cmd = verifyDebugInfoJob.commandLine
@@ -1707,6 +1704,36 @@ final class SwiftDriverTests: XCTestCase {
17071704
serializer.writeDOT(to: &output)
17081705

17091706
let dynamicLinker = driver.targetTriple.isDarwin ? "ld" : "clang"
1707+
#if os(Linux)
1708+
XCTAssertEqual(output,
1709+
"""
1710+
digraph Jobs {
1711+
"compile (swift-frontend)" [style=bold];
1712+
"test.swift" [fontsize=12];
1713+
"test.swift" -> "compile (swift-frontend)" [color=blue];
1714+
"test.o" [fontsize=12];
1715+
"compile (swift-frontend)" -> "test.o" [color=green];
1716+
"test.swiftmodule" [fontsize=12];
1717+
"compile (swift-frontend)" -> "test.swiftmodule" [color=green];
1718+
"test.swiftdoc" [fontsize=12];
1719+
"compile (swift-frontend)" -> "test.swiftdoc" [color=green];
1720+
"mergeModule (swift-frontend)" [style=bold];
1721+
"test.swiftmodule" -> "mergeModule (swift-frontend)" [color=blue];
1722+
"mergeModule (swift-frontend)" -> "test.swiftmodule" [color=green];
1723+
"mergeModule (swift-frontend)" -> "test.swiftdoc" [color=green];
1724+
"autolinkExtract (swift-autolink-extract)" [style=bold];
1725+
"test.o" -> "autolinkExtract (swift-autolink-extract)" [color=blue];
1726+
"test.autolink" [fontsize=12];
1727+
"autolinkExtract (swift-autolink-extract)" -> "test.autolink" [color=green];
1728+
"link (clang)" [style=bold];
1729+
"test.o" -> "link (clang)" [color=blue];
1730+
"test.autolink" -> "link (clang)" [color=blue];
1731+
"test" [fontsize=12];
1732+
"link (clang)" -> "test" [color=green];
1733+
}
1734+
1735+
""")
1736+
#else
17101737
XCTAssertEqual(output,
17111738
"""
17121739
digraph Jobs {
@@ -1730,6 +1757,7 @@ final class SwiftDriverTests: XCTestCase {
17301757
}
17311758
17321759
""")
1760+
#endif
17331761
}
17341762

17351763
func testRegressions() throws {
@@ -2008,7 +2036,7 @@ final class SwiftDriverTests: XCTestCase {
20082036

20092037
do {
20102038
var driver = try Driver(args: ["swiftc", "-c", "-embed-bitcode", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
2011-
let plannedJobs = try driver.planBuild()
2039+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
20122040
XCTAssertEqual(plannedJobs.count, 3)
20132041

20142042
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
@@ -2189,7 +2217,7 @@ final class SwiftDriverTests: XCTestCase {
21892217
func testEmbedBitcode() throws {
21902218
do {
21912219
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "embed-bitcode.swift"])
2192-
let plannedJobs = try driver.planBuild()
2220+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
21932221
XCTAssertEqual(plannedJobs.count, 3)
21942222

21952223
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2211,7 +2239,7 @@ final class SwiftDriverTests: XCTestCase {
22112239

22122240
do {
22132241
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "main.swift", "hi.swift"])
2214-
let plannedJobs = try driver.planBuild()
2242+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22152243
XCTAssertEqual(plannedJobs.count, 5)
22162244

22172245
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2245,7 +2273,7 @@ final class SwiftDriverTests: XCTestCase {
22452273

22462274
do {
22472275
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-c", "-emit-module", "embed-bitcode.swift"])
2248-
let plannedJobs = try driver.planBuild()
2276+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22492277
XCTAssertEqual(plannedJobs.count, 3)
22502278

22512279
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2274,7 +2302,7 @@ final class SwiftDriverTests: XCTestCase {
22742302

22752303
do {
22762304
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-wmo", "embed-bitcode.swift"])
2277-
let plannedJobs = try driver.planBuild()
2305+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22782306
XCTAssertEqual(plannedJobs.count, 3)
22792307

22802308
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2296,7 +2324,7 @@ final class SwiftDriverTests: XCTestCase {
22962324

22972325
do {
22982326
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-c", "-parse-as-library", "-emit-module", "embed-bitcode.swift", "empty.swift", "-module-name", "ABC"])
2299-
let plannedJobs = try driver.planBuild()
2327+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
23002328
XCTAssertEqual(plannedJobs.count, 5)
23012329

23022330
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2331,7 +2359,7 @@ final class SwiftDriverTests: XCTestCase {
23312359

23322360
do {
23332361
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-c", "-parse-as-library", "-emit-module", "-whole-module-optimization", "embed-bitcode.swift", "-parse-stdlib", "-module-name", "Swift"])
2334-
let plannedJobs = try driver.planBuild()
2362+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
23352363
XCTAssertEqual(plannedJobs.count, 2)
23362364

23372365
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2513,7 +2541,7 @@ final class SwiftDriverTests: XCTestCase {
25132541
func testVFSOverlay() throws {
25142542
do {
25152543
var driver = try Driver(args: ["swiftc", "-c", "-vfsoverlay", "overlay.yaml", "foo.swift"])
2516-
let plannedJobs = try driver.planBuild()
2544+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
25172545
XCTAssertEqual(plannedJobs.count, 1)
25182546
XCTAssertEqual(plannedJobs[0].kind, .compile)
25192547
XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(RelativePath("overlay.yaml")))]))
@@ -2522,7 +2550,7 @@ final class SwiftDriverTests: XCTestCase {
25222550
// Verify that the overlays are passed to the frontend in the same order.
25232551
do {
25242552
var driver = try Driver(args: ["swiftc", "-c", "-vfsoverlay", "overlay1.yaml", "-vfsoverlay", "overlay2.yaml", "-vfsoverlay", "overlay3.yaml", "foo.swift"])
2525-
let plannedJobs = try driver.planBuild()
2553+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
25262554
XCTAssertEqual(plannedJobs.count, 1)
25272555
XCTAssertEqual(plannedJobs[0].kind, .compile)
25282556
print(plannedJobs[0].commandLine)
@@ -2628,3 +2656,13 @@ fileprivate extension Array where Element: Equatable {
26282656
return false
26292657
}
26302658
}
2659+
2660+
fileprivate extension Array where Element == Job {
2661+
// Utility to drop autolink-extract jobs, which helps avoid introducing
2662+
// platform-specific conditionals in tests unrelated to autolinking.
2663+
func removingAutolinkExtractJobs() -> Self {
2664+
var filtered = self
2665+
filtered.removeAll(where: { $0.kind == .autolinkExtract })
2666+
return filtered
2667+
}
2668+
}

Tests/SwiftDriverTests/TripleTests.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,9 @@ final class TripleTests: XCTestCase {
10081008
}
10091009

10101010
func testFileFormat() {
1011-
// XCTAssertEqual(.elf, Triple("i686-unknown-linux-gnu").objectFormat)
1011+
XCTAssertEqual(.elf, Triple("i686-unknown-linux-gnu").objectFormat)
1012+
XCTAssertEqual(.elf, Triple("x86_64-unknown-linux-gnu").objectFormat)
1013+
XCTAssertEqual(.elf, Triple("x86_64-gnu-linux").objectFormat)
10121014
XCTAssertEqual(.elf, Triple("i686-unknown-freebsd").objectFormat)
10131015
XCTAssertEqual(.elf, Triple("i686-unknown-netbsd").objectFormat)
10141016
XCTAssertEqual(.elf, Triple("i686--win32-elf").objectFormat)

0 commit comments

Comments
 (0)