@@ -4911,6 +4911,10 @@ final class SwiftDriverTests: XCTestCase {
49114911 $1. expect ( . error( Driver . Error. missingProfilingData ( try toPath ( " profile.profdata " ) . name) ) )
49124912 }
49134913
4914+ try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -ir-profile-use=profile.profdata " ] ) {
4915+ $1. expect ( . error( Driver . Error. missingProfilingData ( try toPath ( " profile.profdata " ) . name) ) )
4916+ }
4917+
49144918 try withTemporaryDirectory { path in
49154919 try localFileSystem. writeFileContents ( path. appending ( component: " profile.profdata " ) , bytes: . init( ) )
49164920 try assertNoDriverDiagnostics ( args: " swiftc " , " -working-directory " , path. pathString, " foo.swift " , " -profile-use=profile.profdata " )
@@ -4934,15 +4938,40 @@ final class SwiftDriverTests: XCTestCase {
49344938 $1. expect ( . error( Driver . Error. conflictingOptions ( . profileGenerate, . irProfileGenerate) ) )
49354939 }
49364940
4941+ try withTemporaryDirectory { directoryPath in
4942+ try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -profile-generate " , " -ir-profile-generate= \( directoryPath) " ] ) {
4943+ $1. expect ( . error( Driver . Error. conflictingOptions ( . profileGenerate, . irProfileGenerateEQ) ) )
4944+ }
4945+ }
4946+
49374947 try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -ir-profile-generate " , " -cs-profile-generate " ] ) {
49384948 $1. expect ( . error( Driver . Error. conflictingOptions ( . irProfileGenerate, . csProfileGenerate) ) )
49394949 }
49404950
49414951 try withTemporaryDirectory { directoryPath in
49424952 try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -ir-profile-generate " , " -cs-profile-generate= \( directoryPath) " ] ) {
4943- $1. expect ( . error( Driver . Error. conflictingOptions ( . irProfileGenerate, . csProfileGenerateEq) ) )
4953+ $1. expect ( . error( Driver . Error. conflictingOptions ( . irProfileGenerate, . csProfileGenerateEQ) ) )
4954+ }
4955+ }
4956+
4957+ try withTemporaryDirectory { directoryPath in
4958+ try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -ir-profile-generate= \( directoryPath) " , " -cs-profile-generate= \( directoryPath) " ] ) {
4959+ $1. expect ( . error( Driver . Error. conflictingOptions ( . irProfileGenerateEQ, . csProfileGenerateEQ) ) )
4960+ }
4961+ }
4962+
4963+ try withTemporaryDirectory { directoryPath in
4964+ try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -cs-profile-generate " , " -cs-profile-generate= \( directoryPath) " ] ) {
4965+ $1. expect ( . error( Driver . Error. conflictingOptions ( . csProfileGenerate, . csProfileGenerateEQ) ) )
4966+ }
4967+ }
4968+
4969+ try withTemporaryDirectory { directoryPath in
4970+ try assertDriverDiagnostics ( args: [ " swiftc " , " foo.swift " , " -ir-profile-generate " , " -ir-profile-generate= \( directoryPath) " ] ) {
4971+ $1. expect ( . error( Driver . Error. conflictingOptions ( . irProfileGenerate, . irProfileGenerateEQ) ) )
49444972 }
49454973 }
4974+
49464975 }
49474976
49484977 func testProfileSampleUseFrontendFlags( ) throws {
@@ -5356,6 +5385,195 @@ final class SwiftDriverTests: XCTestCase {
53565385 }
53575386 }
53585387
5388+ func testIRProfileEqLinkerArgs( ) throws {
5389+ var envVars = ProcessEnv . block
5390+ envVars [ " SWIFT_DRIVER_LD_EXEC " ] = ld. nativePathString ( escaped: false )
5391+ try withTemporaryDirectory { directoryPath in
5392+ do {
5393+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " x86_64-apple-macosx10.9 " , " test.swift " ] ,
5394+ env: envVars)
5395+ let plannedJobs = try driver. planBuild ( )
5396+
5397+ XCTAssertEqual ( plannedJobs. count, 2 )
5398+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5399+
5400+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5401+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5402+ }
5403+
5404+ do {
5405+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " x86_64-apple-ios7.1-simulator " , " test.swift " ] ,
5406+ env: envVars)
5407+ let plannedJobs = try driver. planBuild ( )
5408+
5409+ XCTAssertEqual ( plannedJobs. count, 2 )
5410+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5411+
5412+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5413+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5414+ }
5415+
5416+ do {
5417+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " arm64-apple-ios7.1 " , " test.swift " ] ,
5418+ env: envVars)
5419+ let plannedJobs = try driver. planBuild ( )
5420+
5421+ XCTAssertEqual ( plannedJobs. count, 2 )
5422+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5423+
5424+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5425+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5426+ }
5427+
5428+ do {
5429+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " x86_64-apple-tvos9.0-simulator " , " test.swift " ] ,
5430+ env: envVars)
5431+ let plannedJobs = try driver. planBuild ( )
5432+
5433+ XCTAssertEqual ( plannedJobs. count, 2 )
5434+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5435+
5436+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5437+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5438+ }
5439+
5440+ do {
5441+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " arm64-apple-tvos9.0 " , " test.swift " ] ,
5442+ env: envVars)
5443+ let plannedJobs = try driver. planBuild ( )
5444+
5445+ XCTAssertEqual ( plannedJobs. count, 2 )
5446+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5447+
5448+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5449+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5450+ }
5451+
5452+ do {
5453+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " i386-apple-watchos2.0-simulator " , " test.swift " ] ,
5454+ env: envVars)
5455+ let plannedJobs = try driver. planBuild ( )
5456+
5457+ XCTAssertEqual ( plannedJobs. count, 2 )
5458+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5459+
5460+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5461+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5462+ }
5463+
5464+ do {
5465+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " armv7k-apple-watchos2.0 " , " test.swift " ] ,
5466+ env: envVars)
5467+ let plannedJobs = try driver. planBuild ( )
5468+
5469+ XCTAssertEqual ( plannedJobs. count, 2 )
5470+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5471+
5472+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5473+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains ( . flag( " -fprofile-generate= \( directoryPath) " ) ) )
5474+ }
5475+
5476+ // FIXME: This will fail when run on macOS, because
5477+ // swift-autolink-extract is not present
5478+ #if os(Linux) || os(Android) || os(Windows)
5479+ for triple in [ " aarch64-unknown-linux-android " , " x86_64-unknown-linux-gnu " ] {
5480+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , triple, " test.swift " ] )
5481+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
5482+
5483+ XCTAssertEqual ( plannedJobs. count, 2 )
5484+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5485+
5486+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5487+ if triple == " aarch64-unknown-linux-android " {
5488+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile-aarch64-android.a " ) )
5489+ } else {
5490+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile-x86_64.a " ) )
5491+ }
5492+ XCTAssert ( plannedJobs [ 1 ] . commandLine. contains { $0 == . flag( " -u__llvm_profile_runtime " ) } )
5493+ }
5494+ #endif
5495+
5496+ // -ir-profile-generate should add libclang_rt.profile for WebAssembly targets
5497+ try withTemporaryDirectory { resourceDir in
5498+ try localFileSystem. writeFileContents ( resourceDir. appending ( components: " wasi " , " static-executable-args.lnk " ) ) {
5499+ $0. send ( " garbage " )
5500+ }
5501+
5502+ var env = ProcessEnv . block
5503+ env [ " SWIFT_DRIVER_SWIFT_AUTOLINK_EXTRACT_EXEC " ] = " //bin/swift-autolink-extract "
5504+
5505+ for triple in [ " wasm32-unknown-wasi " , " wasm32-unknown-wasip1-threads " ] {
5506+ var driver = try Driver ( args: [
5507+ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , triple, " test.swift " ,
5508+ " -resource-dir " , resourceDir. pathString
5509+ ] , env: env)
5510+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
5511+
5512+ XCTAssertEqual ( plannedJobs. count, 2 )
5513+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5514+
5515+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5516+ XCTAssert ( plannedJobs [ 1 ] . commandLine. containsPathWithBasename ( " libclang_rt.profile-wasm32.a " ) )
5517+ }
5518+ }
5519+
5520+ for explicitUseLd in [ true , false ] {
5521+ var args = [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -target " , " x86_64-unknown-windows-msvc " , " test.swift " ]
5522+ if explicitUseLd {
5523+ // Explicitly passing '-use-ld=lld' should still result in '-lld-allow-duplicate-weak'.
5524+ args. append ( " -use-ld=lld " )
5525+ }
5526+ var driver = try Driver ( args: args)
5527+ let plannedJobs = try driver. planBuild ( )
5528+
5529+ XCTAssertEqual ( plannedJobs. count, 2 )
5530+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5531+
5532+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5533+
5534+ let linkCmds = plannedJobs [ 1 ] . commandLine
5535+
5536+ // rdar://131295678 - Make sure we force the use of lld and pass
5537+ // '-lld-allow-duplicate-weak'.
5538+ XCTAssert ( linkCmds. contains ( . flag( " -fuse-ld=lld " ) ) )
5539+ XCTAssert ( linkCmds. contains ( [ . flag( " -Xlinker " ) , . flag( " -lld-allow-duplicate-weak " ) ] ) )
5540+ }
5541+
5542+ // rdar://131295678 - Make sure we force the use of lld and pass
5543+ // '-lld-allow-duplicate-weak' even if the user requests something else.
5544+ do {
5545+ var driver = try Driver ( args: [ " swiftc " , " -ir-profile-generate= \( directoryPath) " , " -use-ld=link " , " -target " , " x86_64-unknown-windows-msvc " , " test.swift " ] )
5546+ let plannedJobs = try driver. planBuild ( )
5547+
5548+ XCTAssertEqual ( plannedJobs. count, 2 )
5549+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5550+
5551+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5552+
5553+ let linkCmds = plannedJobs [ 1 ] . commandLine
5554+
5555+ XCTAssertFalse ( linkCmds. contains ( . flag( " -fuse-ld=link " ) ) )
5556+ XCTAssertTrue ( linkCmds. contains ( . flag( " -fuse-ld=lld " ) ) )
5557+ XCTAssertTrue ( linkCmds. contains ( . flag( " -lld-allow-duplicate-weak " ) ) )
5558+ }
5559+
5560+ do {
5561+ // If we're not building for profiling, don't add '-lld-allow-duplicate-weak'.
5562+ var driver = try Driver ( args: [ " swiftc " , " -use-ld=lld " , " -target " , " x86_64-unknown-windows-msvc " , " test.swift " ] )
5563+ let plannedJobs = try driver. planBuild ( )
5564+
5565+ XCTAssertEqual ( plannedJobs. count, 2 )
5566+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
5567+
5568+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
5569+
5570+ let linkCmds = plannedJobs [ 1 ] . commandLine
5571+ XCTAssertTrue ( linkCmds. contains ( . flag( " -fuse-ld=lld " ) ) )
5572+ XCTAssertFalse ( linkCmds. contains ( . flag( " -lld-allow-duplicate-weak " ) ) )
5573+ }
5574+ }
5575+ }
5576+
53595577 func testCSProfileLinkerArgs( ) throws {
53605578 var envVars = ProcessEnv . block
53615579 envVars [ " SWIFT_DRIVER_LD_EXEC " ] = ld. nativePathString ( escaped: false )
0 commit comments