diff --git a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift index ebf5408ea..e872f0e5a 100644 --- a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift +++ b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift @@ -420,6 +420,15 @@ extension Driver { } } + // Pass along -no-verify-emitted-module-interface only if it's effective. + // Assume verification by default as we want to know only when the user skips + // the verification. + if !parsedOptions.hasFlag(positive: .verifyEmittedModuleInterface, + negative: .noVerifyEmittedModuleInterface, + default: true) { + commandLine.appendFlag("-no-verify-emitted-module-interface") + } + // Repl Jobs shouldn't include -module-name. if compilerMode != .repl && compilerMode != .intro { commandLine.appendFlags("-module-name", moduleOutputInfo.name) diff --git a/Sources/SwiftOptions/Options.swift b/Sources/SwiftOptions/Options.swift index 73fc2797e..e74e54bb1 100644 --- a/Sources/SwiftOptions/Options.swift +++ b/Sources/SwiftOptions/Options.swift @@ -171,8 +171,10 @@ extension Option { public static let disableDeserializationSafety: Option = Option("-disable-deserialization-safety", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Don't avoid reading potentially unsafe decls in swiftmodules") public static let disableDiagnosticPasses: Option = Option("-disable-diagnostic-passes", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Don't run diagnostic passes") public static let disableEmitGenericClassRoTList: Option = Option("-disable-emit-generic-class-ro_t-list", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable emission of a section with references to class_ro_t of generic class patterns") + public static let disableExperimentalAssociatedTypeInference: Option = Option("-disable-experimental-associated-type-inference", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable experimental associated type inference improvements") public static let disableExperimentalClangImporterDiagnostics: Option = Option("-disable-experimental-clang-importer-diagnostics", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Disable experimental diagnostics when importing C, C++, and Objective-C libraries") public static let disableExperimentalOpenedExistentialTypes: Option = Option("-disable-experimental-opened-existential-types", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable experimental support for implicitly opened existentials") + public static let disableExperimentalParserRoundTrip: Option = Option("-disable-experimental-parser-round-trip", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable round trip through the new swift parser") public static let disableExperimentalStringProcessing: Option = Option("-disable-experimental-string-processing", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Disable experimental string processing") public static let disableFailOnError: Option = Option("-disable-fail-on-error", .flag, attributes: [.noDriver], helpText: "Don't exit with a nonzero status if errors are emitted") public static let disableFailOnError_: Option = Option("--disable-fail-on-error", .flag, alias: Option.disableFailOnError, attributes: [.noDriver], helpText: "Don't exit with a nonzero status if errors are emitted") @@ -377,7 +379,7 @@ extension Option { public static let enableDynamicReplacementChaining: Option = Option("-enable-dynamic-replacement-chaining", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable chaining of dynamic replacements") public static let enableEmitGenericClassRoTList: Option = Option("-enable-emit-generic-class-ro_t-list", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable emission of a section with references to class_ro_t of generic class patterns") public static let enableExperimentalAdditiveArithmeticDerivation: Option = Option("-enable-experimental-additive-arithmetic-derivation", .flag, attributes: [.frontend], helpText: "Enable experimental 'AdditiveArithmetic' derived conformances") - public static let enableExperimentalAssociatedTypeInference: Option = Option("-enable-experimental-associated-type-inference", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental associated type inference via type witness systems") + public static let enableExperimentalAssociatedTypeInference: Option = Option("-enable-experimental-associated-type-inference", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enable experimental associated type inference improvements") public static let enableAsyncDemotion: Option = Option("-enable-experimental-async-demotion", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Enables an optimization pass to demote async functions.") public static let enableExperimentalAsyncTopLevel: Option = Option("-enable-experimental-async-top-level", .flag, attributes: [.helpHidden, .frontend, .noDriver, .moduleInterface], helpText: "Enable experimental concurrency in top-level code") public static let enableExperimentalConcisePoundFile: Option = Option("-enable-experimental-concise-pound-file", .flag, attributes: [.frontend, .moduleInterface], helpText: "Enable experimental concise '#file' identifier") @@ -588,6 +590,7 @@ extension Option { public static let module: Option = Option("-module", .separate, attributes: [.noDriver], metaVar: "", helpText: "Names of modules") public static let module_: Option = Option("--module", .separate, alias: Option.module, attributes: [.noDriver], metaVar: "", helpText: "Names of modules") public static let newDriverPath: Option = Option("-new-driver-path", .separate, attributes: [.helpHidden, .frontend, .noDriver], metaVar: "", helpText: "Path of the new driver to be used") + public static let noAllocations: Option = Option("-no-allocations", .flag, attributes: [.helpHidden, .frontend], helpText: "Diagnose any code that needs to heap allocate (classes, closures, etc.)") public static let noClangIncludeTree: Option = Option("-no-clang-include-tree", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Do not use clang include tree, fallback to use CAS filesystem to build clang modules") public static let noClangModuleBreadcrumbs: Option = Option("-no-clang-module-breadcrumbs", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Don't emit DWARF skeleton CUs for imported Clang modules. Use this when building a redistributable static archive.") public static let noColorDiagnostics: Option = Option("-no-color-diagnostics", .flag, attributes: [.frontend, .doesNotAffectIncrementalBuild], helpText: "Do not print diagnostics in color") @@ -600,7 +603,7 @@ extension Option { public static let noStdlibRpath: Option = Option("-no-stdlib-rpath", .flag, attributes: [.helpHidden, .doesNotAffectIncrementalBuild], helpText: "Don't add any rpath entries.") public static let noStrictImplicitModuleContext: Option = Option("-no-strict-implicit-module-context", .flag, attributes: [.helpHidden, .frontend], helpText: "Disable the strict forwarding of compilation context to downstream implicit module dependencies") public static let noToolchainStdlibRpath: Option = Option("-no-toolchain-stdlib-rpath", .flag, attributes: [.helpHidden, .doesNotAffectIncrementalBuild], helpText: "Do not add an rpath entry for the toolchain's standard library (default)") - public static let noVerifyEmittedModuleInterface: Option = Option("-no-verify-emitted-module-interface", .flag, attributes: [.noInteractive, .doesNotAffectIncrementalBuild], helpText: "Don't check that module interfaces emitted during compilation typecheck") + public static let noVerifyEmittedModuleInterface: Option = Option("-no-verify-emitted-module-interface", .flag, attributes: [.frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Don't check that module interfaces emitted during compilation typecheck") public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Don't treat warnings as errors") public static let noWholeModuleOptimization: Option = Option("-no-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Disable optimizing input files together instead of individually") public static let driverScanDependenciesNonLib: Option = Option("-nonlib-dependency-scanner", .flag, attributes: [.helpHidden], helpText: "Use calls to `swift-frontend -scan-dependencies` instead of dedicated dependency scanning library") @@ -608,7 +611,6 @@ extension Option { public static let nostdimport: Option = Option("-nostdimport", .flag, attributes: [.frontend], helpText: "Don't search the standard library import path for modules") public static let numThreads: Option = Option("-num-threads", .separate, attributes: [.frontend, .doesNotAffectIncrementalBuild, .cacheInvariant], metaVar: "", helpText: "Enable multi-threading and specify number of threads") public static let omitExtensionBlockSymbols: Option = Option("-omit-extension-block-symbols", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .supplementaryOutput], helpText: "Directly associate members and conformances with the extended nominal when generating symbol graphs instead of emitting 'swift.extension' symbols for extensions to external types") - public static let extraClangOptionsOnly: Option = Option("-only-use-extra-clang-opts", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Options passed via -Xcc are sufficient for Clang configuration") public static let Onone: Option = Option("-Onone", .flag, attributes: [.frontend, .moduleInterface], helpText: "Compile without any optimization", group: .O) public static let Oplayground: Option = Option("-Oplayground", .flag, attributes: [.helpHidden, .frontend, .moduleInterface], helpText: "Compile with optimizations appropriate for a playground", group: .O) public static let Osize: Option = Option("-Osize", .flag, attributes: [.frontend, .moduleInterface], helpText: "Compile with optimizations and target small code size", group: .O) @@ -696,7 +698,7 @@ extension Option { public static let sanitizeAddressUseOdrIndicator: Option = Option("-sanitize-address-use-odr-indicator", .flag, attributes: [.helpHidden, .frontend, .noInteractive], helpText: "When using AddressSanitizer enable ODR indicator globals to avoid false ODR violation reports in partially sanitized programs at the cost of an increase in binary size") public static let sanitizeCoverageEQ: Option = Option("-sanitize-coverage=", .commaJoined, attributes: [.frontend, .noInteractive], metaVar: "", helpText: "Specify the type of coverage instrumentation for Sanitizers and additional options separated by commas") public static let sanitizeRecoverEQ: Option = Option("-sanitize-recover=", .commaJoined, attributes: [.frontend, .noInteractive], metaVar: "", helpText: "Specify which sanitizer runtime checks (see -sanitize=) will generate instrumentation that allows error recovery. Listed checks should be comma separated. Default behavior is to not allow error recovery.") - public static let sanitizeStableAbiEQ: Option = Option("-sanitize-stable-abi", .flag, attributes: [.frontend, .noInteractive], helpText: "ABI instrumentation for sanitizer runtime.") + public static let sanitizeStableAbiEQ: Option = Option("-sanitize-stable-abi", .flag, attributes: [.frontend, .noInteractive], helpText: "Link against the Sanitizers stable ABI.") public static let sanitizeEQ: Option = Option("-sanitize=", .commaJoined, attributes: [.frontend, .noInteractive], metaVar: "", helpText: "Turn on runtime checks for erroneous behavior.") public static let saveOptimizationRecordPasses: Option = Option("-save-optimization-record-passes", .separate, attributes: [.frontend], metaVar: "", helpText: "Only include passes which match a specified regular expression in the generated optimization record (by default, include all passes)") public static let saveOptimizationRecordPath: Option = Option("-save-optimization-record-path", .separate, attributes: [.frontend, .argumentIsPath], helpText: "Specify the file name of any generated optimization record") @@ -999,8 +1001,10 @@ extension Option { Option.disableDeserializationSafety, Option.disableDiagnosticPasses, Option.disableEmitGenericClassRoTList, + Option.disableExperimentalAssociatedTypeInference, Option.disableExperimentalClangImporterDiagnostics, Option.disableExperimentalOpenedExistentialTypes, + Option.disableExperimentalParserRoundTrip, Option.disableExperimentalStringProcessing, Option.disableFailOnError, Option.disableFailOnError_, @@ -1416,6 +1420,7 @@ extension Option { Option.module, Option.module_, Option.newDriverPath, + Option.noAllocations, Option.noClangIncludeTree, Option.noClangModuleBreadcrumbs, Option.noColorDiagnostics, @@ -1436,7 +1441,6 @@ extension Option { Option.nostdimport, Option.numThreads, Option.omitExtensionBlockSymbols, - Option.extraClangOptionsOnly, Option.Onone, Option.Oplayground, Option.Osize, diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 08e78ea12..60178ae99 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -5590,6 +5590,8 @@ final class SwiftDriverTests: XCTestCase { "-no-verify-emitted-module-interface"], env: envVars) let plannedJobs = try driver.planBuild() XCTAssertEqual(plannedJobs.count, 2) + let emitJob = try plannedJobs.findJob(.emitModule) + XCTAssertTrue(emitJob.commandLine.contains("-no-verify-emitted-module-interface")) } // Disabled by default in merge-module @@ -5628,6 +5630,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(verifyJob.inputs.count == 1) XCTAssertTrue(verifyJob.inputs[0] == emitInterfaceOutput[0]) XCTAssertTrue(verifyJob.commandLine.contains(.path(emitInterfaceOutput[0].file))) + XCTAssertFalse(emitJob.commandLine.contains("-no-verify-emitted-module-interface")) + XCTAssertFalse(emitJob.commandLine.contains("-verify-emitted-module-interface")) } // Whole-module @@ -5650,6 +5654,19 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(verifyJob.commandLine.contains(.path(emitInterfaceOutput[0].file))) } + // Test the `-no-verify-emitted-module-interface` flag with whole-module + do { + var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-module-name", + "foo", "-emit-module-interface", + "-enable-library-evolution", + "-whole-module-optimization", + "-no-verify-emitted-module-interface"], env: envVars) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(plannedJobs.count, 1) + let compileJob = try plannedJobs.findJob(.compile) + XCTAssertTrue(compileJob.commandLine.contains("-no-verify-emitted-module-interface")) + } + // Enabled by default when the library-level is api. do { var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-module-name", @@ -5672,6 +5689,8 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) + let compileJob = try plannedJobs.findJob(.compile) + XCTAssertFalse(compileJob.commandLine.contains("-no-verify-emitted-module-interface")) } // The flag -check-api-availability-only is not passed down to the verify job.