@@ -954,14 +954,21 @@ ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
954
954
return ObjCRuntime (ObjCRuntime::WatchOS, TargetVersion);
955
955
if (isTargetIOSBased ())
956
956
return ObjCRuntime (ObjCRuntime::iOS, TargetVersion);
957
+ if (isTargetXROS ()) {
958
+ // XROS uses the iOS runtime.
959
+ auto T = llvm::Triple (Twine (" arm64-apple-" ) +
960
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) +
961
+ TargetVersion.getAsString ());
962
+ return ObjCRuntime (ObjCRuntime::iOS, T.getiOSVersion ());
963
+ }
957
964
if (isNonFragile)
958
965
return ObjCRuntime (ObjCRuntime::MacOSX, TargetVersion);
959
966
return ObjCRuntime (ObjCRuntime::FragileMacOSX, TargetVersion);
960
967
}
961
968
962
969
// / Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
963
970
bool Darwin::hasBlocksRuntime () const {
964
- if (isTargetWatchOSBased () || isTargetDriverKit ())
971
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () )
965
972
return true ;
966
973
else if (isTargetIOSBased ())
967
974
return !isIPhoneOSVersionLT (3 , 2 );
@@ -1092,6 +1099,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
1092
1099
Str += " driverkit" ;
1093
1100
else if (isTargetIOSBased () || isTargetMacCatalyst ())
1094
1101
Str += " ios" ;
1102
+ else if (isTargetXROS ())
1103
+ Str += llvm::Triple::getOSTypeName (llvm::Triple::XROS);
1095
1104
else
1096
1105
Str += " macosx" ;
1097
1106
Str += getTripleTargetVersion ().getAsString ();
@@ -1174,6 +1183,8 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
1174
1183
// ARC runtime is supported everywhere on arm64e.
1175
1184
if (getTriple ().isArm64e ())
1176
1185
return ;
1186
+ if (isTargetXROS ())
1187
+ return ;
1177
1188
1178
1189
ObjCRuntime runtime = getDefaultObjCRuntime (/* nonfragile*/ true );
1179
1190
@@ -1309,6 +1320,8 @@ StringRef Darwin::getPlatformFamily() const {
1309
1320
return " Watch" ;
1310
1321
case DarwinPlatformKind::DriverKit:
1311
1322
return " DriverKit" ;
1323
+ case DarwinPlatformKind::XROS:
1324
+ return " XR" ;
1312
1325
}
1313
1326
llvm_unreachable (" Unsupported platform" );
1314
1327
}
@@ -1340,6 +1353,9 @@ StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const {
1340
1353
case DarwinPlatformKind::WatchOS:
1341
1354
return TargetEnvironment == NativeEnvironment || IgnoreSim ? " watchos"
1342
1355
: " watchossim" ;
1356
+ case DarwinPlatformKind::XROS:
1357
+ return TargetEnvironment == NativeEnvironment || IgnoreSim ? " xros"
1358
+ : " xrossim" ;
1343
1359
case DarwinPlatformKind::DriverKit:
1344
1360
return " driverkit" ;
1345
1361
}
@@ -1649,6 +1665,9 @@ struct DarwinPlatform {
1649
1665
case DarwinPlatformKind::WatchOS:
1650
1666
Opt = options::OPT_mwatchos_version_min_EQ;
1651
1667
break ;
1668
+ case DarwinPlatformKind::XROS:
1669
+ // xrOS always explicitly provides a version in the triple.
1670
+ return ;
1652
1671
case DarwinPlatformKind::DriverKit:
1653
1672
// DriverKit always explicitly provides a version in the triple.
1654
1673
return ;
@@ -1794,6 +1813,8 @@ struct DarwinPlatform {
1794
1813
return DarwinPlatformKind::TvOS;
1795
1814
case llvm::Triple::WatchOS:
1796
1815
return DarwinPlatformKind::WatchOS;
1816
+ case llvm::Triple::XROS:
1817
+ return DarwinPlatformKind::XROS;
1797
1818
case llvm::Triple::DriverKit:
1798
1819
return DarwinPlatformKind::DriverKit;
1799
1820
default :
@@ -1975,6 +1996,10 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
1975
1996
return DarwinPlatform::createFromSDK (
1976
1997
Darwin::TvOS, Version,
1977
1998
/* IsSimulator=*/ SDK.starts_with (" AppleTVSimulator" ));
1999
+ else if (SDK.starts_with (" XR" ))
2000
+ return DarwinPlatform::createFromSDK (
2001
+ Darwin::XROS, Version,
2002
+ /* IsSimulator=*/ SDK.contains (" Simulator" ));
1978
2003
else if (SDK.starts_with (" DriverKit" ))
1979
2004
return DarwinPlatform::createFromSDK (Darwin::DriverKit, Version);
1980
2005
return std::nullopt;
@@ -2013,6 +2038,11 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
2013
2038
case llvm::Triple::WatchOS:
2014
2039
OsVersion = Triple.getWatchOSVersion ();
2015
2040
break ;
2041
+ case llvm::Triple::XROS:
2042
+ OsVersion = Triple.getOSVersion ();
2043
+ if (!OsVersion.getMajor ())
2044
+ OsVersion = OsVersion.withMajorReplaced (1 );
2045
+ break ;
2016
2046
case llvm::Triple::DriverKit:
2017
2047
OsVersion = Triple.getDriverKitVersion ();
2018
2048
break ;
@@ -2104,6 +2134,7 @@ std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2104
2134
case llvm::Triple::IOS:
2105
2135
case llvm::Triple::TvOS:
2106
2136
case llvm::Triple::WatchOS:
2137
+ case llvm::Triple::XROS:
2107
2138
break ;
2108
2139
default :
2109
2140
TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
@@ -2319,6 +2350,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
2319
2350
Micro >= 100 )
2320
2351
getDriver ().Diag (diag::err_drv_invalid_version_number)
2321
2352
<< OSTarget->getAsString (Args, Opts);
2353
+ } else if (Platform == XROS) {
2354
+ if (!Driver::GetReleaseVersion (OSTarget->getOSVersion (), Major, Minor,
2355
+ Micro, HadExtra) ||
2356
+ HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2357
+ Micro >= 100 )
2358
+ getDriver ().Diag (diag::err_drv_invalid_version_number)
2359
+ << OSTarget->getAsString (Args, Opts);
2322
2360
} else
2323
2361
llvm_unreachable (" unknown kind of Darwin platform" );
2324
2362
@@ -2641,6 +2679,10 @@ void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
2641
2679
llvm::sys::path::append (P, " libclang_rt.cc_kext_ios.a" );
2642
2680
} else if (isTargetDriverKit ()) {
2643
2681
// DriverKit doesn't want extra runtime support.
2682
+ } else if (isTargetXROSDevice ()) {
2683
+ llvm::sys::path::append (
2684
+ P, llvm::Twine (" libclang_rt.cc_kext_" ) +
2685
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) + " .a" );
2644
2686
} else {
2645
2687
llvm::sys::path::append (P, " libclang_rt.cc_kext.a" );
2646
2688
}
@@ -2855,6 +2897,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
2855
2897
case WatchOS: // Earlier than 4.0.
2856
2898
OS = llvm::Triple::WatchOS;
2857
2899
break ;
2900
+ case XROS: // Always available.
2901
+ return false ;
2858
2902
case DriverKit: // Always available.
2859
2903
return false ;
2860
2904
}
@@ -2876,6 +2920,8 @@ static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPl
2876
2920
return SDKVersion >= VersionTuple (99U );
2877
2921
case Darwin::WatchOS:
2878
2922
return SDKVersion >= VersionTuple (99U );
2923
+ case Darwin::XROS:
2924
+ return SDKVersion >= VersionTuple (99U );
2879
2925
default :
2880
2926
return true ;
2881
2927
}
@@ -2998,7 +3044,7 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
2998
3044
// FIXME: It would be far better to avoid inserting those -static arguments,
2999
3045
// but we can't check the deployment target in the translation code until
3000
3046
// it is set here.
3001
- if (isTargetWatchOSBased () || isTargetDriverKit () ||
3047
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () ||
3002
3048
(isTargetIOSBased () && !isIPhoneOSVersionLT (6 , 0 ))) {
3003
3049
for (ArgList::iterator it = DAL->begin (), ie = DAL->end (); it != ie; ) {
3004
3050
Arg *A = *it;
@@ -3092,6 +3138,8 @@ void Darwin::addMinVersionArgs(const ArgList &Args,
3092
3138
ArgStringList &CmdArgs) const {
3093
3139
VersionTuple TargetVersion = getTripleTargetVersion ();
3094
3140
3141
+ assert (!isTargetXROS () && " xrOS always uses -platform-version" );
3142
+
3095
3143
if (isTargetWatchOS ())
3096
3144
CmdArgs.push_back (" -watchos_version_min" );
3097
3145
else if (isTargetWatchOSSimulator ())
@@ -3151,6 +3199,8 @@ static const char *getPlatformName(Darwin::DarwinPlatformKind Platform,
3151
3199
return " tvos" ;
3152
3200
case Darwin::WatchOS:
3153
3201
return " watchos" ;
3202
+ case Darwin::XROS:
3203
+ return " xros" ;
3154
3204
case Darwin::DriverKit:
3155
3205
return " driverkit" ;
3156
3206
}
@@ -3347,7 +3397,7 @@ void Darwin::addStartObjectFileArgs(const ArgList &Args,
3347
3397
}
3348
3398
3349
3399
void Darwin::CheckObjCARC () const {
3350
- if (isTargetIOSBased () || isTargetWatchOSBased () ||
3400
+ if (isTargetIOSBased () || isTargetWatchOSBased () || isTargetXROS () ||
3351
3401
(isTargetMacOSBased () && !isMacosxVersionLT (10 , 6 )))
3352
3402
return ;
3353
3403
getDriver ().Diag (diag::err_arc_unsupported_on_toolchain);
0 commit comments