@@ -1418,6 +1418,8 @@ struct DarwinPlatform {
1418
1418
enum SourceKind {
1419
1419
// / The OS was specified using the -target argument.
1420
1420
TargetArg,
1421
+ // / The OS was specified using the -mtargetos= argument.
1422
+ MTargetOSArg,
1421
1423
// / The OS was specified using the -m<os>-version-min argument.
1422
1424
OSVersionArg,
1423
1425
// / The OS was specified using the OS_DEPLOYMENT_TARGET environment.
@@ -1469,7 +1471,8 @@ struct DarwinPlatform {
1469
1471
void addOSVersionMinArgument (DerivedArgList &Args, const OptTable &Opts) {
1470
1472
if (Argument)
1471
1473
return ;
1472
- assert (Kind != TargetArg && Kind != OSVersionArg && " Invalid kind" );
1474
+ assert (Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1475
+ " Invalid kind" );
1473
1476
options::ID Opt;
1474
1477
switch (Platform) {
1475
1478
case DarwinPlatformKind::MacOS:
@@ -1494,6 +1497,7 @@ struct DarwinPlatform {
1494
1497
std::string getAsString (DerivedArgList &Args, const OptTable &Opts) {
1495
1498
switch (Kind) {
1496
1499
case TargetArg:
1500
+ case MTargetOSArg:
1497
1501
case OSVersionArg:
1498
1502
case InferredFromSDK:
1499
1503
case InferredFromArch:
@@ -1505,40 +1509,54 @@ struct DarwinPlatform {
1505
1509
llvm_unreachable (" Unsupported Darwin Source Kind" );
1506
1510
}
1507
1511
1508
- static DarwinPlatform
1509
- createFromTarget (const llvm::Triple &TT, StringRef OSVersion, Arg *A,
1510
- const Optional<DarwinSDKInfo> &SDKInfo) {
1511
- DarwinPlatform Result (TargetArg, getPlatformFromOS (TT.getOS ()), OSVersion,
1512
- A);
1513
- unsigned Major, Minor, Micro;
1514
- TT.getOSVersion (Major, Minor, Micro);
1515
- if (Major == 0 )
1516
- Result.HasOSVersion = false ;
1517
-
1518
- switch (TT.getEnvironment ()) {
1512
+ void setEnvironment (llvm::Triple::EnvironmentType EnvType,
1513
+ const VersionTuple &OSVersion,
1514
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1515
+ switch (EnvType) {
1519
1516
case llvm::Triple::Simulator:
1520
- Result. Environment = DarwinEnvironmentKind::Simulator;
1517
+ Environment = DarwinEnvironmentKind::Simulator;
1521
1518
break ;
1522
1519
case llvm::Triple::MacABI: {
1520
+ Environment = DarwinEnvironmentKind::MacCatalyst;
1523
1521
// The minimum native macOS target for MacCatalyst is macOS 10.15.
1524
- auto NativeTargetVersion = VersionTuple (10 , 15 );
1525
- if (Result. HasOSVersion && SDKInfo) {
1522
+ NativeTargetVersion = VersionTuple (10 , 15 );
1523
+ if (HasOSVersion && SDKInfo) {
1526
1524
if (const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping (
1527
1525
DarwinSDKInfo::OSEnvPair::macCatalystToMacOSPair ())) {
1528
1526
if (auto MacOSVersion = MacCatalystToMacOSMapping->map (
1529
- VersionTuple (Major, Minor, Micro), NativeTargetVersion,
1530
- None)) {
1527
+ OSVersion, NativeTargetVersion, None)) {
1531
1528
NativeTargetVersion = *MacOSVersion;
1532
1529
}
1533
1530
}
1534
1531
}
1535
- Result.Environment = DarwinEnvironmentKind::MacCatalyst;
1536
- Result.NativeTargetVersion = NativeTargetVersion;
1537
1532
break ;
1538
1533
}
1539
1534
default :
1540
1535
break ;
1541
1536
}
1537
+ }
1538
+
1539
+ static DarwinPlatform
1540
+ createFromTarget (const llvm::Triple &TT, StringRef OSVersion, Arg *A,
1541
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1542
+ DarwinPlatform Result (TargetArg, getPlatformFromOS (TT.getOS ()), OSVersion,
1543
+ A);
1544
+ unsigned Major, Minor, Micro;
1545
+ TT.getOSVersion (Major, Minor, Micro);
1546
+ if (Major == 0 )
1547
+ Result.HasOSVersion = false ;
1548
+ Result.setEnvironment (TT.getEnvironment (),
1549
+ VersionTuple (Major, Minor, Micro), SDKInfo);
1550
+ return Result;
1551
+ }
1552
+ static DarwinPlatform
1553
+ createFromMTargetOS (llvm::Triple::OSType OS, VersionTuple OSVersion,
1554
+ llvm::Triple::EnvironmentType Environment, Arg *A,
1555
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1556
+ DarwinPlatform Result (MTargetOSArg, getPlatformFromOS (OS),
1557
+ OSVersion.getAsString (), A);
1558
+ Result.InferSimulatorFromArch = false ;
1559
+ Result.setEnvironment (Environment, OSVersion, SDKInfo);
1542
1560
return Result;
1543
1561
}
1544
1562
static DarwinPlatform createOSVersionArg (DarwinPlatformKind Platform,
@@ -1852,6 +1870,39 @@ Optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
1852
1870
Triple, OSVersion, Args.getLastArg (options::OPT_target), SDKInfo);
1853
1871
}
1854
1872
1873
+ // / Returns the deployment target that's specified using the -mtargetos option.
1874
+ Optional<DarwinPlatform>
1875
+ getDeploymentTargetFromMTargetOSArg (DerivedArgList &Args,
1876
+ const Driver &TheDriver,
1877
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1878
+ auto *A = Args.getLastArg (options::OPT_mtargetos_EQ);
1879
+ if (!A)
1880
+ return None;
1881
+ llvm::Triple TT (llvm::Twine (" unknown-apple-" ) + A->getValue ());
1882
+ switch (TT.getOS ()) {
1883
+ case llvm::Triple::MacOSX:
1884
+ case llvm::Triple::IOS:
1885
+ case llvm::Triple::TvOS:
1886
+ case llvm::Triple::WatchOS:
1887
+ break ;
1888
+ default :
1889
+ TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
1890
+ << TT.getOSName () << A->getAsString (Args);
1891
+ return None;
1892
+ }
1893
+
1894
+ unsigned Major, Minor, Micro;
1895
+ TT.getOSVersion (Major, Minor, Micro);
1896
+ if (!Major) {
1897
+ TheDriver.Diag (diag::err_drv_invalid_version_number)
1898
+ << A->getAsString (Args);
1899
+ return None;
1900
+ }
1901
+ return DarwinPlatform::createFromMTargetOS (TT.getOS (),
1902
+ VersionTuple (Major, Minor, Micro),
1903
+ TT.getEnvironment (), A, SDKInfo);
1904
+ }
1905
+
1855
1906
Optional<DarwinSDKInfo> parseSDKSettings (llvm::vfs::FileSystem &VFS,
1856
1907
const ArgList &Args,
1857
1908
const Driver &TheDriver) {
@@ -1900,6 +1951,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
1900
1951
Optional<DarwinPlatform> OSTarget =
1901
1952
getDeploymentTargetFromTargetArg (Args, getTriple (), getDriver (), SDKInfo);
1902
1953
if (OSTarget) {
1954
+ // Disallow mixing -target and -mtargetos=.
1955
+ if (const auto *MTargetOSArg = Args.getLastArg (options::OPT_mtargetos_EQ)) {
1956
+ std::string TargetArgStr = OSTarget->getAsString (Args, Opts);
1957
+ std::string MTargetOSArgStr = MTargetOSArg->getAsString (Args);
1958
+ getDriver ().Diag (diag::err_drv_cannot_mix_options)
1959
+ << TargetArgStr << MTargetOSArgStr;
1960
+ }
1903
1961
Optional<DarwinPlatform> OSVersionArgTarget =
1904
1962
getDeploymentTargetFromOSVersionArg (Args, getDriver ());
1905
1963
if (OSVersionArgTarget) {
@@ -1931,6 +1989,18 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
1931
1989
}
1932
1990
}
1933
1991
}
1992
+ } else if ((OSTarget = getDeploymentTargetFromMTargetOSArg (Args, getDriver (),
1993
+ SDKInfo))) {
1994
+ // The OS target can be specified using the -mtargetos= argument.
1995
+ // Disallow mixing -mtargetos= and -m<os>version-min=.
1996
+ Optional<DarwinPlatform> OSVersionArgTarget =
1997
+ getDeploymentTargetFromOSVersionArg (Args, getDriver ());
1998
+ if (OSVersionArgTarget) {
1999
+ std::string MTargetOSArgStr = OSTarget->getAsString (Args, Opts);
2000
+ std::string OSVersionArgStr = OSVersionArgTarget->getAsString (Args, Opts);
2001
+ getDriver ().Diag (diag::err_drv_cannot_mix_options)
2002
+ << MTargetOSArgStr << OSVersionArgStr;
2003
+ }
1934
2004
} else {
1935
2005
// The OS target can be specified using the -m<os>version-min argument.
1936
2006
OSTarget = getDeploymentTargetFromOSVersionArg (Args, getDriver ());
0 commit comments