diff --git a/TestInputs/mock-sdk.sdk/usr/lib/swift/A.swiftmodule/arm64-apple-macos.swiftinterface b/TestInputs/mock-sdk.sdk/usr/lib/swift/A.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000..8c1aa98c7 --- /dev/null +++ b/TestInputs/mock-sdk.sdk/usr/lib/swift/A.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,4 @@ +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name A +import Swift +public func FuncA() { } diff --git a/TestInputs/mock-sdk.sdk/usr/lib/swift/E.swiftmodule/arm64-apple-macos.swiftinterface b/TestInputs/mock-sdk.sdk/usr/lib/swift/E.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000..469ccb66b --- /dev/null +++ b/TestInputs/mock-sdk.sdk/usr/lib/swift/E.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,4 @@ +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name E +import Swift +public func FuncE() { } diff --git a/TestInputs/mock-sdk.sdk/usr/lib/swift/G.swiftmodule/arm64-apple-macos.swiftinterface b/TestInputs/mock-sdk.sdk/usr/lib/swift/G.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000..1ed8633ff --- /dev/null +++ b/TestInputs/mock-sdk.sdk/usr/lib/swift/G.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,5 @@ +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name G +import Swift +import E +public func FuncG() { } diff --git a/TestInputs/mock-sdk.sdk/usr/lib/swift/H.swiftmodule/arm64-apple-macos.swiftinterface b/TestInputs/mock-sdk.sdk/usr/lib/swift/H.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000..1045b19ab --- /dev/null +++ b/TestInputs/mock-sdk.sdk/usr/lib/swift/H.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,8 @@ +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name H +import Swift +import A +import E +import F +import G +public func FuncH() { } diff --git a/TestInputs/mock-sdk.sdk/usr/lib/swift/Swift.swiftmodule/arm64-apple-macos.swiftinterface b/TestInputs/mock-sdk.sdk/usr/lib/swift/Swift.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000..7e9480780 --- /dev/null +++ b/TestInputs/mock-sdk.sdk/usr/lib/swift/Swift.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,2 @@ +// swift-interface-format-version: 1.0 +// swift-module-flags: -parse-stdlib -module-name Swift diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index c1e6cf69e..9aa5b125c 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -754,12 +754,6 @@ final class ExplicitModuleBuildTests: XCTestCase { // We only care about prebuilt modules in macOS. #if os(macOS) func testPrebuiltModuleGenerationJobs() throws { - #if arch(arm64) - // Disabled on Apple Silicon - // rdar://76609781 - throw XCTSkip() - #endif - func getInputModules(_ job: Job) -> [String] { return job.inputs.map { input in return input.file.absolutePath!.parentDirectory.basenameWithoutExt @@ -791,7 +785,6 @@ final class ExplicitModuleBuildTests: XCTestCase { job.outputs[0].file.basenameWithoutExt == basenameWithoutExt } } - let packageRootPath = URL(fileURLWithPath: #file).pathComponents .prefix(while: { $0 != "Tests" }).joined(separator: "/").dropFirst() let testInputsPath = packageRootPath + "/TestInputs" @@ -801,12 +794,12 @@ final class ExplicitModuleBuildTests: XCTestCase { let interfaceMap = try collector.collectSwiftInterfaceMap() // Check interface map always contain everything - XCTAssertTrue(interfaceMap["Swift"]!.count == 2) - XCTAssertTrue(interfaceMap["A"]!.count == 2) - XCTAssertTrue(interfaceMap["E"]!.count == 2) + XCTAssertTrue(interfaceMap["Swift"]!.count == 3) + XCTAssertTrue(interfaceMap["A"]!.count == 3) + XCTAssertTrue(interfaceMap["E"]!.count == 3) XCTAssertTrue(interfaceMap["F"]!.count == 3) - XCTAssertTrue(interfaceMap["G"]!.count == 2) - XCTAssertTrue(interfaceMap["H"]!.count == 2) + XCTAssertTrue(interfaceMap["G"]!.count == 3) + XCTAssertTrue(interfaceMap["H"]!.count == 3) try withTemporaryDirectory { path in let main = path.appending(component: "testPrebuiltModuleGenerationJobs.swift") @@ -821,7 +814,6 @@ final class ExplicitModuleBuildTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, ]) - let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, into: VirtualPath(path: "/tmp/").absolutePath!, exhaustive: true) @@ -830,22 +822,30 @@ final class ExplicitModuleBuildTests: XCTestCase { XCTAssertTrue(danglingJobs.allSatisfy { job in job.moduleName == "MissingKit" }) - XCTAssertTrue(jobs.count == 13) + XCTAssertTrue(jobs.count == 18) XCTAssertTrue(jobs.allSatisfy {$0.outputs.count == 1}) XCTAssertTrue(jobs.allSatisfy {$0.kind == .compile}) XCTAssertTrue(jobs.allSatisfy {$0.commandLine.contains(.flag("-compile-module-from-interface"))}) let HJobs = jobs.filter { $0.moduleName == "H"} - XCTAssertTrue(HJobs.count == 2) - XCTAssertTrue(getInputModules(HJobs[0]) == ["A", "E", "F", "G", "Swift"]) + XCTAssertTrue(HJobs.count == 3) + // arm64 + XCTAssertTrue(getInputModules(HJobs[0]) == ["A", "A", "E", "E", "F", "F", "G", "G", "Swift", "Swift"]) + // arm64e XCTAssertTrue(getInputModules(HJobs[1]) == ["A", "E", "F", "G", "Swift"]) + // x86_64 + XCTAssertTrue(getInputModules(HJobs[2]) == ["A", "E", "F", "G", "Swift"]) XCTAssertTrue(getOutputName(HJobs[0]) != getOutputName(HJobs[1])) + XCTAssertTrue(getOutputName(HJobs[1]) != getOutputName(HJobs[2])) checkInputOutputIntegrity(HJobs[0]) checkInputOutputIntegrity(HJobs[1]) + checkInputOutputIntegrity(HJobs[2]) let GJobs = jobs.filter { $0.moduleName == "G"} - XCTAssertTrue(GJobs.count == 2) - XCTAssertTrue(getInputModules(GJobs[0]) == ["E", "Swift"]) + XCTAssertTrue(GJobs.count == 3) + XCTAssertTrue(getInputModules(GJobs[0]) == ["E", "E", "Swift", "Swift"]) XCTAssertTrue(getInputModules(GJobs[1]) == ["E", "Swift"]) + XCTAssertTrue(getInputModules(GJobs[2]) == ["E", "Swift"]) XCTAssertTrue(getOutputName(GJobs[0]) != getOutputName(GJobs[1])) + XCTAssertTrue(getOutputName(GJobs[1]) != getOutputName(GJobs[2])) checkInputOutputIntegrity(GJobs[0]) checkInputOutputIntegrity(GJobs[1]) } @@ -857,28 +857,33 @@ final class ExplicitModuleBuildTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, ]) - let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, into: VirtualPath(path: "/tmp/").absolutePath!, exhaustive: false) XCTAssertTrue(danglingJobs.isEmpty) - XCTAssertTrue(jobs.count == 13) + XCTAssertTrue(jobs.count == 18) XCTAssertTrue(jobs.allSatisfy {$0.outputs.count == 1}) XCTAssertTrue(jobs.allSatisfy {$0.kind == .compile}) XCTAssertTrue(jobs.allSatisfy {$0.commandLine.contains(.flag("-compile-module-from-interface"))}) let HJobs = jobs.filter { $0.moduleName == "H"} - XCTAssertTrue(HJobs.count == 2) - XCTAssertTrue(getInputModules(HJobs[0]) == ["A", "E", "F", "G", "Swift"]) + XCTAssertTrue(HJobs.count == 3) + // arm64 + XCTAssertTrue(getInputModules(HJobs[0]) == ["A", "A", "E", "E", "F", "F", "G", "G", "Swift", "Swift"]) + // arm64e XCTAssertTrue(getInputModules(HJobs[1]) == ["A", "E", "F", "G", "Swift"]) + // x86_64 + XCTAssertTrue(getInputModules(HJobs[2]) == ["A", "E", "F", "G", "Swift"]) XCTAssertTrue(getOutputName(HJobs[0]) != getOutputName(HJobs[1])) checkInputOutputIntegrity(HJobs[0]) checkInputOutputIntegrity(HJobs[1]) let GJobs = jobs.filter { $0.moduleName == "G"} - XCTAssertTrue(GJobs.count == 2) - XCTAssertTrue(getInputModules(GJobs[0]) == ["E", "Swift"]) + XCTAssertTrue(GJobs.count == 3) + XCTAssertTrue(getInputModules(GJobs[0]) == ["E", "E", "Swift", "Swift"]) XCTAssertTrue(getInputModules(GJobs[1]) == ["E", "Swift"]) + XCTAssertTrue(getInputModules(GJobs[2]) == ["E", "Swift"]) XCTAssertTrue(getOutputName(GJobs[0]) != getOutputName(GJobs[1])) + XCTAssertTrue(getOutputName(GJobs[1]) != getOutputName(GJobs[2])) checkInputOutputIntegrity(GJobs[0]) checkInputOutputIntegrity(GJobs[1]) } @@ -890,13 +895,12 @@ final class ExplicitModuleBuildTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, ]) - let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, into: VirtualPath(path: "/tmp/").absolutePath!, exhaustive: false) XCTAssertTrue(danglingJobs.isEmpty) - XCTAssert(jobs.count == 2) + XCTAssert(jobs.count == 3) XCTAssert(jobs.allSatisfy { $0.moduleName == "Swift" }) } try withTemporaryDirectory { path in @@ -907,13 +911,12 @@ final class ExplicitModuleBuildTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, ]) - let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, into: VirtualPath(path: "/tmp/").absolutePath!, exhaustive: false) XCTAssertTrue(danglingJobs.isEmpty) - XCTAssertTrue(jobs.count == 7) + XCTAssertTrue(jobs.count == 9) jobs.forEach({ job in // Check we don't pull in other modules than A, F and Swift XCTAssertTrue(["A", "F", "Swift"].contains(job.moduleName)) @@ -928,7 +931,6 @@ final class ExplicitModuleBuildTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, ]) - let (jobs, _) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, into: VirtualPath(path: "/tmp/").absolutePath!, exhaustive: false) diff --git a/Tests/SwiftDriverTests/JobExecutorTests.swift b/Tests/SwiftDriverTests/JobExecutorTests.swift index 5fedcd6ae..51310bb66 100644 --- a/Tests/SwiftDriverTests/JobExecutorTests.swift +++ b/Tests/SwiftDriverTests/JobExecutorTests.swift @@ -95,13 +95,8 @@ extension DarwinToolchain { final class JobExecutorTests: XCTestCase { func testDarwinBasic() throws { - #if os(macOS) - #if arch(arm64) - // Disabled on Apple Silicon - // rdar://76609781 - throw XCTSkip() - #endif - + #if os(macOS) + let hostTriple = try Driver(args: ["swiftc", "test.swift"]).hostTriple let executor = try SwiftDriverExecutor(diagnosticsEngine: DiagnosticsEngine(), processSet: ProcessSet(), fileSystem: localFileSystem, @@ -142,7 +137,7 @@ final class JobExecutorTests: XCTestCase { "-primary-file", .path(inputs[ "foo"]!.file), .path(inputs["main"]!.file), - "-target", "x86_64-apple-darwin18.7.0", + "-target", .flag(hostTriple.triple), "-enable-objc-interop", "-sdk", .path(.absolute(try toolchain.sdk.get())), @@ -164,7 +159,7 @@ final class JobExecutorTests: XCTestCase { .path(.relative(RelativePath("foo.swift"))), "-primary-file", .path(inputs["main"]!.file), - "-target", "x86_64-apple-darwin18.7.0", + "-target", .flag(hostTriple.triple), "-enable-objc-interop", "-sdk", .path(.absolute(try toolchain.sdk.get())), @@ -185,9 +180,7 @@ final class JobExecutorTests: XCTestCase { .path(.temporary(RelativePath("main.o"))), .path(.absolute(try toolchain.clangRT.get())), "-syslibroot", .path(.absolute(try toolchain.sdk.get())), - "-lobjc", "-lSystem", "-arch", "x86_64", - "-force_load", .path(.absolute(try toolchain.compatibility50.get())), - "-force_load", .path(.absolute(try toolchain.compatibilityDynamicReplacements.get())), + "-lobjc", "-lSystem", "-arch", .flag(hostTriple.archName), "-L", .path(.absolute(try toolchain.resourcesDirectory.get())), "-L", .path(.absolute(try toolchain.sdkStdlib(sdk: toolchain.sdk.get()))), "-rpath", "/usr/lib/swift", "-macosx_version_min", "10.14.0", "-no_objc_category_merging", "-o", @@ -200,7 +193,6 @@ final class JobExecutorTests: XCTestCase { primaryInputs: [], outputs: [.init(file: VirtualPath.relative(RelativePath("main")).intern(), type: .image)] ) - let delegate = JobCollectingDelegate() let executor = MultiJobExecutor(workload: .all([compileFoo, compileMain, link]), resolver: resolver, executorDelegate: delegate, diagnosticsEngine: DiagnosticsEngine()) @@ -220,12 +212,8 @@ final class JobExecutorTests: XCTestCase { /// Ensure the executor is capable of forwarding its standard input to the compile job that requires it. func testInputForwarding() throws { -#if os(macOS) - #if arch(arm64) - // Disabled on Apple Silicon - // rdar://76609781 - throw XCTSkip() - #endif + #if os(macOS) + let hostTriple = try Driver(args: ["swiftc", "test.swift"]).hostTriple let executor = try SwiftDriverExecutor(diagnosticsEngine: DiagnosticsEngine(), processSet: ProcessSet(), fileSystem: localFileSystem, @@ -243,7 +231,7 @@ final class JobExecutorTests: XCTestCase { "-primary-file", // This compile job must read the input from STDIN "-", - "-target", "x86_64-apple-darwin18.7.0", + "-target", .flag(hostTriple.triple), "-enable-objc-interop", "-sdk", .path(.absolute(try toolchain.sdk.get())), @@ -263,9 +251,7 @@ final class JobExecutorTests: XCTestCase { .path(.temporary(RelativePath("main.o"))), .path(.absolute(try toolchain.clangRT.get())), "-syslibroot", .path(.absolute(try toolchain.sdk.get())), - "-lobjc", "-lSystem", "-arch", "x86_64", - "-force_load", .path(.absolute(try toolchain.compatibility50.get())), - "-force_load", .path(.absolute(try toolchain.compatibilityDynamicReplacements.get())), + "-lobjc", "-lSystem", "-arch", .flag(hostTriple.archName), "-L", .path(.absolute(try toolchain.resourcesDirectory.get())), "-L", .path(.absolute(try toolchain.sdkStdlib(sdk: toolchain.sdk.get()))), "-rpath", "/usr/lib/swift", "-macosx_version_min", "10.14.0", "-no_objc_category_merging", @@ -455,13 +441,16 @@ final class JobExecutorTests: XCTestCase { } } - func testSaveTemps() throws { - #if os(macOS) && arch(arm64) - // Disabled on Apple Silicon - // rdar://76609781 - throw XCTSkip() + private func getHostToolchainSdkArg(_ executor: SwiftDriverExecutor) throws -> [String] { + #if os(macOS) + let toolchain = DarwinToolchain(env: ProcessEnv.vars, executor: executor) + return try ["-sdk", toolchain.sdk.get().pathString] + #else + return [] #endif + } + func testSaveTemps() throws { do { try withTemporaryDirectory { path in let main = path.appending(component: "main.swift") @@ -476,7 +465,7 @@ final class JobExecutorTests: XCTestCase { let outputPath = path.appending(component: "finalOutput") var driver = try Driver(args: ["swiftc", main.pathString, "-driver-filelist-threshold", "0", - "-o", outputPath.pathString], + "-o", outputPath.pathString] + getHostToolchainSdkArg(executor), env: ProcessEnv.vars, diagnosticsEngine: diags, fileSystem: localFileSystem, @@ -514,7 +503,7 @@ final class JobExecutorTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-save-temps", "-driver-filelist-threshold", "0", - "-o", outputPath.pathString], + "-o", outputPath.pathString] + getHostToolchainSdkArg(executor), env: ProcessEnv.vars, diagnosticsEngine: diags, fileSystem: localFileSystem, @@ -552,7 +541,7 @@ final class JobExecutorTests: XCTestCase { var driver = try Driver(args: ["swiftc", main.pathString, "-driver-filelist-threshold", "0", "-Xfrontend", "-debug-crash-immediately", - "-o", outputPath.pathString], + "-o", outputPath.pathString] + getHostToolchainSdkArg(executor), env: ProcessEnv.vars, diagnosticsEngine: diags, fileSystem: localFileSystem, @@ -572,6 +561,5 @@ final class JobExecutorTests: XCTestCase { ) } } - } }