in Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift [49:300]
mutating func addCommonFrontendOptions(
commandLine: inout [Job.ArgTemplate],
inputs: inout [TypedVirtualPath],
bridgingHeaderHandling: BridgingHeaderHandling = .precompiled,
moduleDependencyGraphUse: ModuleDependencyGraphUse = .computed
) throws {
// Only pass -target to the REPL or immediate modes if it was explicitly
// specified on the command line.
switch compilerMode {
case .standardCompile, .singleCompile, .batchCompile, .compilePCM, .dumpPCM:
commandLine.appendFlag(.target)
commandLine.appendFlag(targetTriple.triple)
case .repl, .immediate:
if parsedOptions.hasArgument(.target) {
commandLine.appendFlag(.target)
commandLine.appendFlag(targetTriple.triple)
}
case .intro:
break
}
// Pass down -clang-target.
// If not specified otherwise, we should use the same triple as -target
// TODO: enable -clang-target for implicit module build as well.
if !parsedOptions.hasArgument(.disableClangTarget) &&
isFrontendArgSupported(.clangTarget) &&
parsedOptions.contains(.driverExplicitModuleBuild) {
let clangTriple = parsedOptions.getLastArgument(.clangTarget)?.asSingle ?? targetTriple.triple
commandLine.appendFlag(.clangTarget)
commandLine.appendFlag(clangTriple)
}
// If in ExplicitModuleBuild mode and the dependency graph has been computed, add module
// dependencies.
// May also be used for generation of the dependency graph itself in ExplicitModuleBuild mode.
if (parsedOptions.contains(.driverExplicitModuleBuild) &&
moduleDependencyGraphUse == .computed) {
try addExplicitModuleBuildArguments(inputs: &inputs, commandLine: &commandLine)
}
if let variant = parsedOptions.getLastArgument(.targetVariant)?.asSingle {
commandLine.appendFlag(.targetVariant)
commandLine.appendFlag(Triple(variant, normalizing: true).triple)
}
// Enable address top-byte ignored in the ARM64 backend.
if targetTriple.arch == .aarch64 {
commandLine.appendFlag(.Xllvm)
commandLine.appendFlag("-aarch64-use-tbi")
}
// Potentially unavailable enum cases are downgraded to a warning when building a
// swiftmodule, to allow building a module (or module interface) for an older
// deployment target than the framework itself.
if isFrontendArgSupported(.warnOnPotentiallyUnavailableEnumCase) {
if compilerOutputType == .swiftModule {
commandLine.appendFlag(.warnOnPotentiallyUnavailableEnumCase)
}
}
// Enable or disable ObjC interop appropriately for the platform
if targetTriple.isDarwin {
commandLine.appendFlag(.enableObjcInterop)
} else {
commandLine.appendFlag(.disableObjcInterop)
}
// Add flags for C++ interop
if parsedOptions.hasArgument(.enableExperimentalCxxInterop) {
commandLine.appendFlag(.enableCxxInterop)
}
if let stdlibVariant = parsedOptions.getLastArgument(.experimentalCxxStdlib)?.asSingle {
commandLine.appendFlag("-Xcc")
commandLine.appendFlag("-stdlib=\(stdlibVariant)")
}
// Handle the CPU and its preferences.
try commandLine.appendLast(.targetCpu, from: &parsedOptions)
if let sdkPath = frontendTargetInfo.sdkPath?.path {
commandLine.appendFlag(.sdk)
commandLine.append(.path(VirtualPath.lookup(sdkPath)))
}
try commandLine.appendAll(.I, from: &parsedOptions)
try commandLine.appendAll(.F, .Fsystem, from: &parsedOptions)
try commandLine.appendAll(.vfsoverlay, from: &parsedOptions)
try commandLine.appendLast(.AssertConfig, from: &parsedOptions)
try commandLine.appendLast(.autolinkForceLoad, from: &parsedOptions)
if let colorOption = parsedOptions.last(for: .colorDiagnostics, .noColorDiagnostics) {
commandLine.appendFlag(colorOption.option)
} else if shouldColorDiagnostics() {
commandLine.appendFlag(.colorDiagnostics)
}
try commandLine.appendLast(.fixitAll, from: &parsedOptions)
try commandLine.appendLast(.warnSwift3ObjcInferenceMinimal, .warnSwift3ObjcInferenceComplete, from: &parsedOptions)
try commandLine.appendLast(.warnImplicitOverrides, from: &parsedOptions)
try commandLine.appendLast(.typoCorrectionLimit, from: &parsedOptions)
try commandLine.appendLast(.enableAppExtension, from: &parsedOptions)
try commandLine.appendLast(.enableLibraryEvolution, from: &parsedOptions)
try commandLine.appendLast(.enableTesting, from: &parsedOptions)
try commandLine.appendLast(.enablePrivateImports, from: &parsedOptions)
try commandLine.appendLast(.enableCxxInterop, from: &parsedOptions)
try commandLine.appendLast(in: .g, from: &parsedOptions)
try commandLine.appendLast(.debugInfoFormat, from: &parsedOptions)
try commandLine.appendLast(.importUnderlyingModule, from: &parsedOptions)
try commandLine.appendLast(.moduleCachePath, from: &parsedOptions)
try commandLine.appendLast(.moduleLinkName, from: &parsedOptions)
try commandLine.appendLast(.nostdimport, from: &parsedOptions)
try commandLine.appendLast(.parseStdlib, from: &parsedOptions)
try commandLine.appendLast(.solverMemoryThreshold, from: &parsedOptions)
try commandLine.appendLast(.valueRecursionThreshold, from: &parsedOptions)
try commandLine.appendLast(.warnSwift3ObjcInference, from: &parsedOptions)
try commandLine.appendLast(.RpassEQ, from: &parsedOptions)
try commandLine.appendLast(.RpassMissedEQ, from: &parsedOptions)
try commandLine.appendLast(.suppressWarnings, from: &parsedOptions)
try commandLine.appendLast(.profileGenerate, from: &parsedOptions)
try commandLine.appendLast(.profileUse, from: &parsedOptions)
try commandLine.appendLast(.profileCoverageMapping, from: &parsedOptions)
try commandLine.appendLast(.warningsAsErrors, .noWarningsAsErrors, from: &parsedOptions)
try commandLine.appendLast(.sanitizeEQ, from: &parsedOptions)
try commandLine.appendLast(.sanitizeRecoverEQ, from: &parsedOptions)
try commandLine.appendLast(.sanitizeAddressUseOdrIndicator, from: &parsedOptions)
try commandLine.appendLast(.sanitizeCoverageEQ, from: &parsedOptions)
try commandLine.appendLast(.static, from: &parsedOptions)
try commandLine.appendLast(.swiftVersion, from: &parsedOptions)
try commandLine.appendLast(.enforceExclusivityEQ, from: &parsedOptions)
try commandLine.appendLast(.statsOutputDir, from: &parsedOptions)
try commandLine.appendLast(.traceStatsEvents, from: &parsedOptions)
try commandLine.appendLast(.profileStatsEvents, from: &parsedOptions)
try commandLine.appendLast(.profileStatsEntities, from: &parsedOptions)
try commandLine.appendLast(.solverShrinkUnsolvedThreshold, from: &parsedOptions)
try commandLine.appendLast(in: .O, from: &parsedOptions)
try commandLine.appendLast(.RemoveRuntimeAsserts, from: &parsedOptions)
try commandLine.appendLast(.AssumeSingleThreaded, from: &parsedOptions)
try commandLine.appendLast(.packageDescriptionVersion, from: &parsedOptions)
try commandLine.appendLast(.serializeDiagnosticsPath, from: &parsedOptions)
try commandLine.appendLast(.debugDiagnosticNames, from: &parsedOptions)
try commandLine.appendLast(.scanDependencies, from: &parsedOptions)
try commandLine.appendLast(.enableExperimentalConcisePoundFile, from: &parsedOptions)
try commandLine.appendLast(.printEducationalNotes, from: &parsedOptions)
try commandLine.appendLast(.diagnosticStyle, from: &parsedOptions)
try commandLine.appendLast(.locale, from: &parsedOptions)
try commandLine.appendLast(.localizationPath, from: &parsedOptions)
try commandLine.appendLast(.requireExplicitAvailability, from: &parsedOptions)
try commandLine.appendLast(.requireExplicitAvailabilityTarget, from: &parsedOptions)
try commandLine.appendLast(.libraryLevel, from: &parsedOptions)
try commandLine.appendLast(.lto, from: &parsedOptions)
try commandLine.appendLast(.accessNotesPath, from: &parsedOptions)
try commandLine.appendLast(.enableActorDataRaceChecks, .disableActorDataRaceChecks, from: &parsedOptions)
try commandLine.appendAll(.D, from: &parsedOptions)
try commandLine.appendAll(.debugPrefixMap, from: &parsedOptions)
try commandLine.appendAllArguments(.Xfrontend, from: &parsedOptions)
try commandLine.appendAll(.coveragePrefixMap, from: &parsedOptions)
try commandLine.appendLast(.warnConcurrency, from: &parsedOptions)
try commandLine.appendAll(.moduleAlias, from: &parsedOptions)
// Expand the -experimental-hermetic-seal-at-link flag
if parsedOptions.hasArgument(.experimentalHermeticSealAtLink) {
commandLine.appendFlag("-enable-llvm-vfe")
commandLine.appendFlag("-enable-llvm-wme")
commandLine.appendFlag("-conditional-runtime-records")
commandLine.appendFlag("-internalize-at-link")
}
// Pass down -user-module-version if we are working with a compiler that
// supports it.
if let ver = parsedOptions.getLastArgument(.userModuleVersion)?.asSingle,
isFrontendArgSupported(.userModuleVersion) {
commandLine.appendFlag(.userModuleVersion)
commandLine.appendFlag(ver)
}
if let workingDirectory = workingDirectory {
// Add -Xcc -working-directory before any other -Xcc options to ensure it is
// overridden by an explicit -Xcc -working-directory, although having a
// different working directory is probably incorrect.
commandLine.appendFlag(.Xcc)
commandLine.appendFlag(.workingDirectory)
commandLine.appendFlag(.Xcc)
commandLine.appendPath(.absolute(workingDirectory))
}
// Resource directory.
commandLine.appendFlag(.resourceDir)
commandLine.appendPath(VirtualPath.lookup(frontendTargetInfo.runtimeResourcePath.path))
if self.useStaticResourceDir {
commandLine.appendFlag("-use-static-resource-dir")
}
// -g implies -enable-anonymous-context-mangled-names, because the extra
// metadata aids debugging.
if parsedOptions.getLast(in: .g) != nil {
// But don't add the option in optimized builds: it would prevent dead code
// stripping of unused metadata.
let shouldSupportAnonymousContextMangledNames: Bool
if let opt = parsedOptions.getLast(in: .O), opt.option != .Onone {
shouldSupportAnonymousContextMangledNames = false
} else {
shouldSupportAnonymousContextMangledNames = true
}
if shouldSupportAnonymousContextMangledNames {
commandLine.appendFlag(.enableAnonymousContextMangledNames)
}
// TODO: Should we support -fcoverage-compilation-dir?
try commandLine.appendAll(.fileCompilationDir, from: &parsedOptions)
}
// Pass through any subsystem flags.
try commandLine.appendAll(.Xllvm, from: &parsedOptions)
try commandLine.appendAll(.Xcc, from: &parsedOptions)
if let importedObjCHeader = importedObjCHeader,
bridgingHeaderHandling != .ignored {
commandLine.appendFlag(.importObjcHeader)
if bridgingHeaderHandling == .precompiled,
let pch = bridgingPrecompiledHeader {
if parsedOptions.contains(.pchOutputDir) {
commandLine.appendPath(VirtualPath.lookup(importedObjCHeader))
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
if !compilerMode.isSingleCompilation {
commandLine.appendFlag(.pchDisableValidation)
}
} else {
commandLine.appendPath(VirtualPath.lookup(pch))
}
} else {
commandLine.appendPath(VirtualPath.lookup(importedObjCHeader))
}
}
// Repl Jobs shouldn't include -module-name.
if compilerMode != .repl && compilerMode != .intro {
commandLine.appendFlags("-module-name", moduleOutputInfo.name)
}
// Enable frontend Parseable-output, if needed.
if parsedOptions.contains(.useFrontendParseableOutput) {
commandLine.appendFlag("-frontend-parseable-output")
}
try toolchain.addPlatformSpecificCommonFrontendOptions(commandLine: &commandLine,
inputs: &inputs,
frontendTargetInfo: frontendTargetInfo,
driver: self)
}