@@ -219,7 +219,8 @@ static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) {
219
219
void darwin::Linker::AddLinkArgs (Compilation &C, const ArgList &Args,
220
220
ArgStringList &CmdArgs,
221
221
const InputInfoList &Inputs,
222
- VersionTuple Version, bool LinkerIsLLD) const {
222
+ VersionTuple Version, bool LinkerIsLLD,
223
+ bool UsePlatformVersion) const {
223
224
const Driver &D = getToolChain ().getDriver ();
224
225
const toolchains::MachO &MachOTC = getMachOToolChain ();
225
226
@@ -355,7 +356,7 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
355
356
Args.AddAllArgs (CmdArgs, options::OPT_init);
356
357
357
358
// Add the deployment target.
358
- if (Version >= VersionTuple (520 ) || LinkerIsLLD)
359
+ if (Version >= VersionTuple (520 ) || LinkerIsLLD || UsePlatformVersion )
359
360
MachOTC.addPlatformVersionArgs (Args, CmdArgs);
360
361
else
361
362
MachOTC.addMinVersionArgs (Args, CmdArgs);
@@ -596,9 +597,13 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
596
597
const char *Exec =
597
598
Args.MakeArgString (getToolChain ().GetLinkerPath (&LinkerIsLLD));
598
599
600
+ // xrOS always uses -platform-version.
601
+ bool UsePlatformVersion = getToolChain ().getTriple ().isXROS ();
602
+
599
603
// I'm not sure why this particular decomposition exists in gcc, but
600
604
// we follow suite for ease of comparison.
601
- AddLinkArgs (C, Args, CmdArgs, Inputs, Version, LinkerIsLLD);
605
+ AddLinkArgs (C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
606
+ UsePlatformVersion);
602
607
603
608
if (willEmitRemarks (Args) &&
604
609
checkRemarksOptions (getToolChain ().getDriver (), Args,
@@ -954,14 +959,21 @@ ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
954
959
return ObjCRuntime (ObjCRuntime::WatchOS, TargetVersion);
955
960
if (isTargetIOSBased ())
956
961
return ObjCRuntime (ObjCRuntime::iOS, TargetVersion);
962
+ if (isTargetXROS ()) {
963
+ // XROS uses the iOS runtime.
964
+ auto T = llvm::Triple (Twine (" arm64-apple-" ) +
965
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) +
966
+ TargetVersion.getAsString ());
967
+ return ObjCRuntime (ObjCRuntime::iOS, T.getiOSVersion ());
968
+ }
957
969
if (isNonFragile)
958
970
return ObjCRuntime (ObjCRuntime::MacOSX, TargetVersion);
959
971
return ObjCRuntime (ObjCRuntime::FragileMacOSX, TargetVersion);
960
972
}
961
973
962
974
// / Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
963
975
bool Darwin::hasBlocksRuntime () const {
964
- if (isTargetWatchOSBased () || isTargetDriverKit ())
976
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () )
965
977
return true ;
966
978
else if (isTargetIOSBased ())
967
979
return !isIPhoneOSVersionLT (3 , 2 );
@@ -1092,6 +1104,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
1092
1104
Str += " driverkit" ;
1093
1105
else if (isTargetIOSBased () || isTargetMacCatalyst ())
1094
1106
Str += " ios" ;
1107
+ else if (isTargetXROS ())
1108
+ Str += llvm::Triple::getOSTypeName (llvm::Triple::XROS);
1095
1109
else
1096
1110
Str += " macosx" ;
1097
1111
Str += getTripleTargetVersion ().getAsString ();
@@ -1174,6 +1188,8 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
1174
1188
// ARC runtime is supported everywhere on arm64e.
1175
1189
if (getTriple ().isArm64e ())
1176
1190
return ;
1191
+ if (isTargetXROS ())
1192
+ return ;
1177
1193
1178
1194
ObjCRuntime runtime = getDefaultObjCRuntime (/* nonfragile*/ true );
1179
1195
@@ -1309,6 +1325,8 @@ StringRef Darwin::getPlatformFamily() const {
1309
1325
return " Watch" ;
1310
1326
case DarwinPlatformKind::DriverKit:
1311
1327
return " DriverKit" ;
1328
+ case DarwinPlatformKind::XROS:
1329
+ return " XR" ;
1312
1330
}
1313
1331
llvm_unreachable (" Unsupported platform" );
1314
1332
}
@@ -1340,6 +1358,9 @@ StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const {
1340
1358
case DarwinPlatformKind::WatchOS:
1341
1359
return TargetEnvironment == NativeEnvironment || IgnoreSim ? " watchos"
1342
1360
: " watchossim" ;
1361
+ case DarwinPlatformKind::XROS:
1362
+ return TargetEnvironment == NativeEnvironment || IgnoreSim ? " xros"
1363
+ : " xrossim" ;
1343
1364
case DarwinPlatformKind::DriverKit:
1344
1365
return " driverkit" ;
1345
1366
}
@@ -1649,6 +1670,9 @@ struct DarwinPlatform {
1649
1670
case DarwinPlatformKind::WatchOS:
1650
1671
Opt = options::OPT_mwatchos_version_min_EQ;
1651
1672
break ;
1673
+ case DarwinPlatformKind::XROS:
1674
+ // xrOS always explicitly provides a version in the triple.
1675
+ return ;
1652
1676
case DarwinPlatformKind::DriverKit:
1653
1677
// DriverKit always explicitly provides a version in the triple.
1654
1678
return ;
@@ -1794,6 +1818,8 @@ struct DarwinPlatform {
1794
1818
return DarwinPlatformKind::TvOS;
1795
1819
case llvm::Triple::WatchOS:
1796
1820
return DarwinPlatformKind::WatchOS;
1821
+ case llvm::Triple::XROS:
1822
+ return DarwinPlatformKind::XROS;
1797
1823
case llvm::Triple::DriverKit:
1798
1824
return DarwinPlatformKind::DriverKit;
1799
1825
default :
@@ -1975,6 +2001,10 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
1975
2001
return DarwinPlatform::createFromSDK (
1976
2002
Darwin::TvOS, Version,
1977
2003
/* IsSimulator=*/ SDK.starts_with (" AppleTVSimulator" ));
2004
+ else if (SDK.starts_with (" XR" ))
2005
+ return DarwinPlatform::createFromSDK (
2006
+ Darwin::XROS, Version,
2007
+ /* IsSimulator=*/ SDK.contains (" Simulator" ));
1978
2008
else if (SDK.starts_with (" DriverKit" ))
1979
2009
return DarwinPlatform::createFromSDK (Darwin::DriverKit, Version);
1980
2010
return std::nullopt;
@@ -2013,6 +2043,11 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
2013
2043
case llvm::Triple::WatchOS:
2014
2044
OsVersion = Triple.getWatchOSVersion ();
2015
2045
break ;
2046
+ case llvm::Triple::XROS:
2047
+ OsVersion = Triple.getOSVersion ();
2048
+ if (!OsVersion.getMajor ())
2049
+ OsVersion = OsVersion.withMajorReplaced (1 );
2050
+ break ;
2016
2051
case llvm::Triple::DriverKit:
2017
2052
OsVersion = Triple.getDriverKitVersion ();
2018
2053
break ;
@@ -2104,6 +2139,7 @@ std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2104
2139
case llvm::Triple::IOS:
2105
2140
case llvm::Triple::TvOS:
2106
2141
case llvm::Triple::WatchOS:
2142
+ case llvm::Triple::XROS:
2107
2143
break ;
2108
2144
default :
2109
2145
TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
@@ -2319,6 +2355,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
2319
2355
Micro >= 100 )
2320
2356
getDriver ().Diag (diag::err_drv_invalid_version_number)
2321
2357
<< OSTarget->getAsString (Args, Opts);
2358
+ } else if (Platform == XROS) {
2359
+ if (!Driver::GetReleaseVersion (OSTarget->getOSVersion (), Major, Minor,
2360
+ Micro, HadExtra) ||
2361
+ HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2362
+ Micro >= 100 )
2363
+ getDriver ().Diag (diag::err_drv_invalid_version_number)
2364
+ << OSTarget->getAsString (Args, Opts);
2322
2365
} else
2323
2366
llvm_unreachable (" unknown kind of Darwin platform" );
2324
2367
@@ -2641,6 +2684,10 @@ void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
2641
2684
llvm::sys::path::append (P, " libclang_rt.cc_kext_ios.a" );
2642
2685
} else if (isTargetDriverKit ()) {
2643
2686
// DriverKit doesn't want extra runtime support.
2687
+ } else if (isTargetXROSDevice ()) {
2688
+ llvm::sys::path::append (
2689
+ P, llvm::Twine (" libclang_rt.cc_kext_" ) +
2690
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) + " .a" );
2644
2691
} else {
2645
2692
llvm::sys::path::append (P, " libclang_rt.cc_kext.a" );
2646
2693
}
@@ -2855,6 +2902,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
2855
2902
case WatchOS: // Earlier than 4.0.
2856
2903
OS = llvm::Triple::WatchOS;
2857
2904
break ;
2905
+ case XROS: // Always available.
2906
+ return false ;
2858
2907
case DriverKit: // Always available.
2859
2908
return false ;
2860
2909
}
@@ -2876,6 +2925,8 @@ static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPl
2876
2925
return SDKVersion >= VersionTuple (99U );
2877
2926
case Darwin::WatchOS:
2878
2927
return SDKVersion >= VersionTuple (99U );
2928
+ case Darwin::XROS:
2929
+ return SDKVersion >= VersionTuple (99U );
2879
2930
default :
2880
2931
return true ;
2881
2932
}
@@ -2998,7 +3049,7 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
2998
3049
// FIXME: It would be far better to avoid inserting those -static arguments,
2999
3050
// but we can't check the deployment target in the translation code until
3000
3051
// it is set here.
3001
- if (isTargetWatchOSBased () || isTargetDriverKit () ||
3052
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () ||
3002
3053
(isTargetIOSBased () && !isIPhoneOSVersionLT (6 , 0 ))) {
3003
3054
for (ArgList::iterator it = DAL->begin (), ie = DAL->end (); it != ie; ) {
3004
3055
Arg *A = *it;
@@ -3092,6 +3143,8 @@ void Darwin::addMinVersionArgs(const ArgList &Args,
3092
3143
ArgStringList &CmdArgs) const {
3093
3144
VersionTuple TargetVersion = getTripleTargetVersion ();
3094
3145
3146
+ assert (!isTargetXROS () && " xrOS always uses -platform-version" );
3147
+
3095
3148
if (isTargetWatchOS ())
3096
3149
CmdArgs.push_back (" -watchos_version_min" );
3097
3150
else if (isTargetWatchOSSimulator ())
@@ -3151,6 +3204,8 @@ static const char *getPlatformName(Darwin::DarwinPlatformKind Platform,
3151
3204
return " tvos" ;
3152
3205
case Darwin::WatchOS:
3153
3206
return " watchos" ;
3207
+ case Darwin::XROS:
3208
+ return " xros" ;
3154
3209
case Darwin::DriverKit:
3155
3210
return " driverkit" ;
3156
3211
}
@@ -3347,7 +3402,7 @@ void Darwin::addStartObjectFileArgs(const ArgList &Args,
3347
3402
}
3348
3403
3349
3404
void Darwin::CheckObjCARC () const {
3350
- if (isTargetIOSBased () || isTargetWatchOSBased () ||
3405
+ if (isTargetIOSBased () || isTargetWatchOSBased () || isTargetXROS () ||
3351
3406
(isTargetMacOSBased () && !isMacosxVersionLT (10 , 6 )))
3352
3407
return ;
3353
3408
getDriver ().Diag (diag::err_arc_unsupported_on_toolchain);
0 commit comments