@@ -1379,6 +1379,8 @@ struct DarwinPlatform {
1379
1379
enum SourceKind {
1380
1380
// / The OS was specified using the -target argument.
1381
1381
TargetArg,
1382
+ // / The OS was specified using the -mtargetos= argument.
1383
+ MTargetOSArg,
1382
1384
// / The OS was specified using the -m<os>-version-min argument.
1383
1385
OSVersionArg,
1384
1386
// / The OS was specified using the OS_DEPLOYMENT_TARGET environment.
@@ -1430,7 +1432,8 @@ struct DarwinPlatform {
1430
1432
void addOSVersionMinArgument (DerivedArgList &Args, const OptTable &Opts) {
1431
1433
if (Argument)
1432
1434
return ;
1433
- assert (Kind != TargetArg && Kind != OSVersionArg && " Invalid kind" );
1435
+ assert (Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1436
+ " Invalid kind" );
1434
1437
options::ID Opt;
1435
1438
switch (Platform) {
1436
1439
case DarwinPlatformKind::MacOS:
@@ -1455,6 +1458,7 @@ struct DarwinPlatform {
1455
1458
std::string getAsString (DerivedArgList &Args, const OptTable &Opts) {
1456
1459
switch (Kind) {
1457
1460
case TargetArg:
1461
+ case MTargetOSArg:
1458
1462
case OSVersionArg:
1459
1463
case InferredFromSDK:
1460
1464
case InferredFromArch:
@@ -1466,40 +1470,54 @@ struct DarwinPlatform {
1466
1470
llvm_unreachable (" Unsupported Darwin Source Kind" );
1467
1471
}
1468
1472
1469
- static DarwinPlatform
1470
- createFromTarget (const llvm::Triple &TT, StringRef OSVersion, Arg *A,
1471
- const Optional<DarwinSDKInfo> &SDKInfo) {
1472
- DarwinPlatform Result (TargetArg, getPlatformFromOS (TT.getOS ()), OSVersion,
1473
- A);
1474
- unsigned Major, Minor, Micro;
1475
- TT.getOSVersion (Major, Minor, Micro);
1476
- if (Major == 0 )
1477
- Result.HasOSVersion = false ;
1478
-
1479
- switch (TT.getEnvironment ()) {
1473
+ void setEnvironment (llvm::Triple::EnvironmentType EnvType,
1474
+ const VersionTuple &OSVersion,
1475
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1476
+ switch (EnvType) {
1480
1477
case llvm::Triple::Simulator:
1481
- Result. Environment = DarwinEnvironmentKind::Simulator;
1478
+ Environment = DarwinEnvironmentKind::Simulator;
1482
1479
break ;
1483
1480
case llvm::Triple::MacABI: {
1481
+ Environment = DarwinEnvironmentKind::MacCatalyst;
1484
1482
// The minimum native macOS target for MacCatalyst is macOS 10.15.
1485
- auto NativeTargetVersion = VersionTuple (10 , 15 );
1486
- if (Result. HasOSVersion && SDKInfo) {
1483
+ NativeTargetVersion = VersionTuple (10 , 15 );
1484
+ if (HasOSVersion && SDKInfo) {
1487
1485
if (const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping (
1488
1486
DarwinSDKInfo::OSEnvPair::macCatalystToMacOSPair ())) {
1489
1487
if (auto MacOSVersion = MacCatalystToMacOSMapping->map (
1490
- VersionTuple (Major, Minor, Micro), NativeTargetVersion,
1491
- None)) {
1488
+ OSVersion, NativeTargetVersion, None)) {
1492
1489
NativeTargetVersion = *MacOSVersion;
1493
1490
}
1494
1491
}
1495
1492
}
1496
- Result.Environment = DarwinEnvironmentKind::MacCatalyst;
1497
- Result.NativeTargetVersion = NativeTargetVersion;
1498
1493
break ;
1499
1494
}
1500
1495
default :
1501
1496
break ;
1502
1497
}
1498
+ }
1499
+
1500
+ static DarwinPlatform
1501
+ createFromTarget (const llvm::Triple &TT, StringRef OSVersion, Arg *A,
1502
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1503
+ DarwinPlatform Result (TargetArg, getPlatformFromOS (TT.getOS ()), OSVersion,
1504
+ A);
1505
+ unsigned Major, Minor, Micro;
1506
+ TT.getOSVersion (Major, Minor, Micro);
1507
+ if (Major == 0 )
1508
+ Result.HasOSVersion = false ;
1509
+ Result.setEnvironment (TT.getEnvironment (),
1510
+ VersionTuple (Major, Minor, Micro), SDKInfo);
1511
+ return Result;
1512
+ }
1513
+ static DarwinPlatform
1514
+ createFromMTargetOS (llvm::Triple::OSType OS, VersionTuple OSVersion,
1515
+ llvm::Triple::EnvironmentType Environment, Arg *A,
1516
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1517
+ DarwinPlatform Result (MTargetOSArg, getPlatformFromOS (OS),
1518
+ OSVersion.getAsString (), A);
1519
+ Result.InferSimulatorFromArch = false ;
1520
+ Result.setEnvironment (Environment, OSVersion, SDKInfo);
1503
1521
return Result;
1504
1522
}
1505
1523
static DarwinPlatform createOSVersionArg (DarwinPlatformKind Platform,
@@ -1813,6 +1831,39 @@ Optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
1813
1831
Triple, OSVersion, Args.getLastArg (options::OPT_target), SDKInfo);
1814
1832
}
1815
1833
1834
+ // / Returns the deployment target that's specified using the -mtargetos option.
1835
+ Optional<DarwinPlatform>
1836
+ getDeploymentTargetFromMTargetOSArg (DerivedArgList &Args,
1837
+ const Driver &TheDriver,
1838
+ const Optional<DarwinSDKInfo> &SDKInfo) {
1839
+ auto *A = Args.getLastArg (options::OPT_mtargetos_EQ);
1840
+ if (!A)
1841
+ return None;
1842
+ llvm::Triple TT (llvm::Twine (" unknown-apple-" ) + A->getValue ());
1843
+ switch (TT.getOS ()) {
1844
+ case llvm::Triple::MacOSX:
1845
+ case llvm::Triple::IOS:
1846
+ case llvm::Triple::TvOS:
1847
+ case llvm::Triple::WatchOS:
1848
+ break ;
1849
+ default :
1850
+ TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
1851
+ << TT.getOSName () << A->getAsString (Args);
1852
+ return None;
1853
+ }
1854
+
1855
+ unsigned Major, Minor, Micro;
1856
+ TT.getOSVersion (Major, Minor, Micro);
1857
+ if (!Major) {
1858
+ TheDriver.Diag (diag::err_drv_invalid_version_number)
1859
+ << A->getAsString (Args);
1860
+ return None;
1861
+ }
1862
+ return DarwinPlatform::createFromMTargetOS (TT.getOS (),
1863
+ VersionTuple (Major, Minor, Micro),
1864
+ TT.getEnvironment (), A, SDKInfo);
1865
+ }
1866
+
1816
1867
Optional<DarwinSDKInfo> parseSDKSettings (llvm::vfs::FileSystem &VFS,
1817
1868
const ArgList &Args,
1818
1869
const Driver &TheDriver) {
@@ -1861,6 +1912,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
1861
1912
Optional<DarwinPlatform> OSTarget =
1862
1913
getDeploymentTargetFromTargetArg (Args, getTriple (), getDriver (), SDKInfo);
1863
1914
if (OSTarget) {
1915
+ // Disallow mixing -target and -mtargetos=.
1916
+ if (const auto *MTargetOSArg = Args.getLastArg (options::OPT_mtargetos_EQ)) {
1917
+ std::string TargetArgStr = OSTarget->getAsString (Args, Opts);
1918
+ std::string MTargetOSArgStr = MTargetOSArg->getAsString (Args);
1919
+ getDriver ().Diag (diag::err_drv_cannot_mix_options)
1920
+ << TargetArgStr << MTargetOSArgStr;
1921
+ }
1864
1922
Optional<DarwinPlatform> OSVersionArgTarget =
1865
1923
getDeploymentTargetFromOSVersionArg (Args, getDriver ());
1866
1924
if (OSVersionArgTarget) {
@@ -1892,6 +1950,18 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
1892
1950
}
1893
1951
}
1894
1952
}
1953
+ } else if ((OSTarget = getDeploymentTargetFromMTargetOSArg (Args, getDriver (),
1954
+ SDKInfo))) {
1955
+ // The OS target can be specified using the -mtargetos= argument.
1956
+ // Disallow mixing -mtargetos= and -m<os>version-min=.
1957
+ Optional<DarwinPlatform> OSVersionArgTarget =
1958
+ getDeploymentTargetFromOSVersionArg (Args, getDriver ());
1959
+ if (OSVersionArgTarget) {
1960
+ std::string MTargetOSArgStr = OSTarget->getAsString (Args, Opts);
1961
+ std::string OSVersionArgStr = OSVersionArgTarget->getAsString (Args, Opts);
1962
+ getDriver ().Diag (diag::err_drv_cannot_mix_options)
1963
+ << MTargetOSArgStr << OSVersionArgStr;
1964
+ }
1895
1965
} else {
1896
1966
// The OS target can be specified using the -m<os>version-min argument.
1897
1967
OSTarget = getDeploymentTargetFromOSVersionArg (Args, getDriver ());
0 commit comments