Skip to content

Commit f65f94c

Browse files
committed
Infer object format when it can't be determined from a triple's successfully parsed environment
1 parent f92010d commit f65f94c

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 {
@@ -1977,7 +2005,7 @@ final class SwiftDriverTests: XCTestCase {
19772005

19782006
do {
19792007
var driver = try Driver(args: ["swiftc", "-c", "-embed-bitcode", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
1980-
let plannedJobs = try driver.planBuild()
2008+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
19812009
XCTAssertEqual(plannedJobs.count, 3)
19822010

19832011
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
@@ -2158,7 +2186,7 @@ final class SwiftDriverTests: XCTestCase {
21582186
func testEmbedBitcode() throws {
21592187
do {
21602188
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "embed-bitcode.swift"])
2161-
let plannedJobs = try driver.planBuild()
2189+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
21622190
XCTAssertEqual(plannedJobs.count, 3)
21632191

21642192
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2180,7 +2208,7 @@ final class SwiftDriverTests: XCTestCase {
21802208

21812209
do {
21822210
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "main.swift", "hi.swift"])
2183-
let plannedJobs = try driver.planBuild()
2211+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
21842212
XCTAssertEqual(plannedJobs.count, 5)
21852213

21862214
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2214,7 +2242,7 @@ final class SwiftDriverTests: XCTestCase {
22142242

22152243
do {
22162244
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-c", "-emit-module", "embed-bitcode.swift"])
2217-
let plannedJobs = try driver.planBuild()
2245+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22182246
XCTAssertEqual(plannedJobs.count, 3)
22192247

22202248
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2243,7 +2271,7 @@ final class SwiftDriverTests: XCTestCase {
22432271

22442272
do {
22452273
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-wmo", "embed-bitcode.swift"])
2246-
let plannedJobs = try driver.planBuild()
2274+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22472275
XCTAssertEqual(plannedJobs.count, 3)
22482276

22492277
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2265,7 +2293,7 @@ final class SwiftDriverTests: XCTestCase {
22652293

22662294
do {
22672295
var driver = try Driver(args: ["swiftc", "-embed-bitcode", "-c", "-parse-as-library", "-emit-module", "embed-bitcode.swift", "empty.swift", "-module-name", "ABC"])
2268-
let plannedJobs = try driver.planBuild()
2296+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
22692297
XCTAssertEqual(plannedJobs.count, 5)
22702298

22712299
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2300,7 +2328,7 @@ final class SwiftDriverTests: XCTestCase {
23002328

23012329
do {
23022330
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"])
2303-
let plannedJobs = try driver.planBuild()
2331+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
23042332
XCTAssertEqual(plannedJobs.count, 2)
23052333

23062334
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -2482,7 +2510,7 @@ final class SwiftDriverTests: XCTestCase {
24822510
func testVFSOverlay() throws {
24832511
do {
24842512
var driver = try Driver(args: ["swiftc", "-c", "-vfsoverlay", "overlay.yaml", "foo.swift"])
2485-
let plannedJobs = try driver.planBuild()
2513+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
24862514
XCTAssertEqual(plannedJobs.count, 1)
24872515
XCTAssertEqual(plannedJobs[0].kind, .compile)
24882516
XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(RelativePath("overlay.yaml")))]))
@@ -2491,7 +2519,7 @@ final class SwiftDriverTests: XCTestCase {
24912519
// Verify that the overlays are passed to the frontend in the same order.
24922520
do {
24932521
var driver = try Driver(args: ["swiftc", "-c", "-vfsoverlay", "overlay1.yaml", "-vfsoverlay", "overlay2.yaml", "-vfsoverlay", "overlay3.yaml", "foo.swift"])
2494-
let plannedJobs = try driver.planBuild()
2522+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
24952523
XCTAssertEqual(plannedJobs.count, 1)
24962524
XCTAssertEqual(plannedJobs[0].kind, .compile)
24972525
print(plannedJobs[0].commandLine)
@@ -2580,3 +2608,13 @@ fileprivate extension Array where Element: Equatable {
25802608
return false
25812609
}
25822610
}
2611+
2612+
fileprivate extension Array where Element == Job {
2613+
// Utility to drop autolink-extract jobs, which helps avoid introducing
2614+
// platform-specific conditionals in tests unrelated to autolinking.
2615+
func removingAutolinkExtractJobs() -> Self {
2616+
var filtered = self
2617+
filtered.removeAll(where: { $0.kind == .autolinkExtract })
2618+
return filtered
2619+
}
2620+
}

Tests/SwiftDriverTests/TripleTests.swift

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

935935
func testFileFormat() {
936-
// XCTAssertEqual(.elf, Triple("i686-unknown-linux-gnu").objectFormat)
936+
XCTAssertEqual(.elf, Triple("i686-unknown-linux-gnu").objectFormat)
937+
XCTAssertEqual(.elf, Triple("x86_64-unknown-linux-gnu").objectFormat)
938+
XCTAssertEqual(.elf, Triple("x86_64-gnu-linux").objectFormat)
937939
XCTAssertEqual(.elf, Triple("i686-unknown-freebsd").objectFormat)
938940
XCTAssertEqual(.elf, Triple("i686-unknown-netbsd").objectFormat)
939941
XCTAssertEqual(.elf, Triple("i686--win32-elf").objectFormat)

0 commit comments

Comments
 (0)