@@ -2002,6 +2002,118 @@ final class SwiftDriverTests: XCTestCase {
20022002 }
20032003 }
20042004
2005+ func testProfileLinkerArgs( ) throws {
2006+ do {
2007+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " x86_64-apple-macosx10.9 " , " test.swift " ] )
2008+ let plannedJobs = try driver. planBuild ( )
2009+
2010+ XCTAssertEqual ( plannedJobs. count, 2 )
2011+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2012+
2013+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2014+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_osx.a " ) )
2015+ }
2016+
2017+ do {
2018+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " x86_64-apple-ios7.1-simulator " , " test.swift " ] )
2019+ let plannedJobs = try driver. planBuild ( )
2020+
2021+ XCTAssertEqual ( plannedJobs. count, 2 )
2022+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2023+
2024+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2025+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_ios.a " ) )
2026+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_iossim.a " ) )
2027+ }
2028+
2029+ do {
2030+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " arm64-apple-ios7.1 " , " test.swift " ] )
2031+ let plannedJobs = try driver. planBuild ( )
2032+
2033+ XCTAssertEqual ( plannedJobs. count, 2 )
2034+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2035+
2036+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2037+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_ios.a " ) )
2038+ }
2039+
2040+ do {
2041+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " x86_64-apple-tvos9.0-simulator " , " test.swift " ] )
2042+ let plannedJobs = try driver. planBuild ( )
2043+
2044+ XCTAssertEqual ( plannedJobs. count, 2 )
2045+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2046+
2047+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2048+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_tvos.a " ) )
2049+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_tvossim.a " ) )
2050+ }
2051+
2052+ do {
2053+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " arm64-apple-tvos9.0 " , " test.swift " ] )
2054+ let plannedJobs = try driver. planBuild ( )
2055+
2056+ XCTAssertEqual ( plannedJobs. count, 2 )
2057+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2058+
2059+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2060+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_tvos.a " ) )
2061+ }
2062+
2063+ do {
2064+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " i386-apple-watchos2.0-simulator " , " test.swift " ] )
2065+ let plannedJobs = try driver. planBuild ( )
2066+
2067+ XCTAssertEqual ( plannedJobs. count, 2 )
2068+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2069+
2070+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2071+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_watchos.a " ) )
2072+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_watchossim.a " ) )
2073+ }
2074+
2075+ do {
2076+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " armv7k-apple-watchos2.0 " , " test.swift " ] )
2077+ let plannedJobs = try driver. planBuild ( )
2078+
2079+ XCTAssertEqual ( plannedJobs. count, 2 )
2080+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2081+
2082+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2083+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile_watchos.a " ) )
2084+ }
2085+
2086+ // FIXME: These will fail when run on macOS, because
2087+ // swift-autolink-extract is not present
2088+ #if os(Linux)
2089+ do {
2090+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " x86_64-unknown-linux-gnu " , " test.swift " ] )
2091+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
2092+
2093+ XCTAssertEqual ( plannedJobs. count, 2 )
2094+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2095+
2096+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2097+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile-x86_64.a " ) )
2098+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains { $0 == . flag( " -u__llvm_profile_runtime " ) } )
2099+ }
2100+
2101+ do {
2102+ var driver = try Driver ( args: [ " swiftc " , " -profile-generate " , " -target " , " wasm32-unknown-wasi " , " test.swift " ] )
2103+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
2104+
2105+ XCTAssertEqual ( plannedJobs. count, 2 )
2106+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
2107+
2108+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
2109+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile-wasm32.a " ) )
2110+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains { $0 == . flag( " -u__llvm_profile_runtime " ) } )
2111+ }
2112+ #endif
2113+
2114+ // TODO: Windows
2115+ }
2116+
20052117 func testConditionalCompilationArgValidation( ) throws {
20062118 try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -DFOO=BAR " ] ) {
20072119 $1. expect ( . warning( " conditional compilation flags do not have values in Swift; they are either present or absent (rather than 'FOO=BAR') " ) )
@@ -4032,3 +4144,16 @@ where Element == Job
40324144 return filtered
40334145 }
40344146}
4147+
4148+ private extension Array where Element == Job . ArgTemplate {
4149+ func containsPathWithBasename( _ basename: String ) -> Bool {
4150+ contains {
4151+ switch $0 {
4152+ case let . path( path) :
4153+ return path. basename == basename
4154+ case . flag, . responseFilePath, . joinedOptionAndPath:
4155+ return false
4156+ }
4157+ }
4158+ }
4159+ }
0 commit comments