@@ -800,29 +800,63 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
800800 Diags.diagnose (SourceLoc (), diag::error_unsupported_target_os, TargetArgOS);
801801 }
802802
803- // Parse the SDK version.
804- if (Arg *A = Args.getLastArg (options::OPT_target_sdk_version)) {
805- auto vers = version::Version::parseVersionString (
806- A->getValue (), SourceLoc (), &Diags);
807- if (vers.hasValue ()) {
808- Opts.SDKVersion = *vers;
809- } else {
810- Diags.diagnose (SourceLoc (), diag::error_invalid_arg_value,
811- A->getAsString (Args), A->getValue ());
812- }
813- }
803+ // First, set up default minimum inlining target versions.
804+ auto getDefaultMinimumInliningTargetVersion =
805+ [&](const llvm::Triple &triple) -> llvm::VersionTuple {
806+ #if SWIFT_DEFAULT_TARGET_MIN_INLINING_VERSION_TO_ABI
807+ // In ABI-stable modules, default to the version where the target's ABI
808+ // was first frozen; older versions will use that one's backwards
809+ // compatibility libraries.
810+ if (FrontendOpts.EnableLibraryEvolution )
811+ if (auto abiStability = minimumABIStableOSVersionForTriple (triple))
812+ // FIXME: Should we raise it to the minimum supported OS version for
813+ // architectures which were born ABI-stable?
814+ return *abiStability;
815+ #endif
816+
817+ // In ABI-unstable modules, we will never have to interoperate with
818+ // older versions of the module, so we should default to the minimum
819+ // deployment target.
820+ unsigned major, minor, patch;
821+ if (triple.isMacOSX ())
822+ triple.getMacOSXVersion (major, minor, patch);
823+ else
824+ triple.getOSVersion (major, minor, patch);
825+ return llvm::VersionTuple (major, minor, patch);
826+ };
814827
815- // Parse the target variant SDK version.
816- if (Arg *A = Args.getLastArg (options::OPT_target_variant_sdk_version)) {
817- auto vers = version::Version::parseVersionString (
818- A->getValue (), SourceLoc (), &Diags);
819- if (vers.hasValue ()) {
820- Opts.VariantSDKVersion = *vers;
821- } else {
822- Diags.diagnose (SourceLoc (), diag::error_invalid_arg_value,
823- A->getAsString (Args), A->getValue ());
824- }
825- }
828+ Opts.MinimumInliningTargetVersion =
829+ getDefaultMinimumInliningTargetVersion (Opts.Target );
830+
831+ // Parse OS version number arguments.
832+ auto parseVersionArg = [&](OptSpecifier opt) -> Optional<llvm::VersionTuple> {
833+ Arg *A = Args.getLastArg (opt);
834+ if (!A)
835+ return None;
836+
837+ if (StringRef (A->getValue ()) == " target" )
838+ return Opts.getMinPlatformVersion ();
839+ if (StringRef (A->getValue ()) == " abi" )
840+ return minimumABIStableOSVersionForTriple (Opts.Target );
841+
842+ if (auto vers = version::Version::parseVersionString (A->getValue (),
843+ SourceLoc (), &Diags))
844+ return (llvm::VersionTuple)*vers;
845+
846+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_value,
847+ A->getAsString (Args), A->getValue ());
848+ return None;
849+ };
850+
851+ if (auto vers = parseVersionArg (OPT_min_inlining_target_version))
852+ // FIXME: Should we diagnose if it's below the default?
853+ Opts.MinimumInliningTargetVersion = *vers;
854+
855+ if (auto vers = parseVersionArg (OPT_target_sdk_version))
856+ Opts.SDKVersion = *vers;
857+
858+ if (auto vers = parseVersionArg (OPT_target_variant_sdk_version))
859+ Opts.VariantSDKVersion = *vers;
826860
827861 // Get the SDK name.
828862 if (Arg *A = Args.getLastArg (options::OPT_target_sdk_name)) {
0 commit comments