@@ -222,7 +222,8 @@ static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) {
222
222
void darwin::Linker::AddLinkArgs (Compilation &C, const ArgList &Args,
223
223
ArgStringList &CmdArgs,
224
224
const InputInfoList &Inputs,
225
- VersionTuple Version, bool LinkerIsLLD) const {
225
+ VersionTuple Version, bool LinkerIsLLD,
226
+ bool UsePlatformVersion) const {
226
227
const Driver &D = getToolChain ().getDriver ();
227
228
const toolchains::MachO &MachOTC = getMachOToolChain ();
228
229
@@ -358,7 +359,7 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
358
359
Args.AddAllArgs (CmdArgs, options::OPT_init);
359
360
360
361
// Add the deployment target.
361
- if (Version >= VersionTuple (520 ) || LinkerIsLLD)
362
+ if (Version >= VersionTuple (520 ) || LinkerIsLLD || UsePlatformVersion )
362
363
MachOTC.addPlatformVersionArgs (Args, CmdArgs);
363
364
else
364
365
MachOTC.addMinVersionArgs (Args, CmdArgs);
@@ -701,9 +702,13 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
701
702
const char *Exec =
702
703
Args.MakeArgString (getToolChain ().GetLinkerPath (&LinkerIsLLD));
703
704
705
+ // xrOS always uses -platform-version.
706
+ bool UsePlatformVersion = getToolChain ().getTriple ().isXROS ();
707
+
704
708
// I'm not sure why this particular decomposition exists in gcc, but
705
709
// we follow suite for ease of comparison.
706
- AddLinkArgs (C, Args, CmdArgs, Inputs, Version, LinkerIsLLD);
710
+ AddLinkArgs (C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
711
+ UsePlatformVersion);
707
712
708
713
if (willEmitRemarks (Args) &&
709
714
checkRemarksOptions (getToolChain ().getDriver (), Args,
@@ -1075,14 +1080,21 @@ ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
1075
1080
return ObjCRuntime (ObjCRuntime::WatchOS, TargetVersion);
1076
1081
if (isTargetIOSBased ())
1077
1082
return ObjCRuntime (ObjCRuntime::iOS, TargetVersion);
1083
+ if (isTargetXROS ()) {
1084
+ // XROS uses the iOS runtime.
1085
+ auto T = llvm::Triple (Twine (" arm64-apple-" ) +
1086
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) +
1087
+ TargetVersion.getAsString ());
1088
+ return ObjCRuntime (ObjCRuntime::iOS, T.getiOSVersion ());
1089
+ }
1078
1090
if (isNonFragile)
1079
1091
return ObjCRuntime (ObjCRuntime::MacOSX, TargetVersion);
1080
1092
return ObjCRuntime (ObjCRuntime::FragileMacOSX, TargetVersion);
1081
1093
}
1082
1094
1083
1095
// / Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
1084
1096
bool Darwin::hasBlocksRuntime () const {
1085
- if (isTargetWatchOSBased () || isTargetDriverKit ())
1097
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () )
1086
1098
return true ;
1087
1099
else if (isTargetIOSBased ())
1088
1100
return !isIPhoneOSVersionLT (3 , 2 );
@@ -1213,6 +1225,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
1213
1225
Str += " driverkit" ;
1214
1226
else if (isTargetIOSBased () || isTargetMacCatalyst ())
1215
1227
Str += " ios" ;
1228
+ else if (isTargetXROS ())
1229
+ Str += llvm::Triple::getOSTypeName (llvm::Triple::XROS);
1216
1230
else
1217
1231
Str += " macosx" ;
1218
1232
Str += getTripleTargetVersion ().getAsString ();
@@ -1358,6 +1372,8 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
1358
1372
// ARC runtime is supported everywhere on arm64e.
1359
1373
if (getTriple ().isArm64e ())
1360
1374
return ;
1375
+ if (isTargetXROS ())
1376
+ return ;
1361
1377
1362
1378
ObjCRuntime runtime = getDefaultObjCRuntime (/* nonfragile*/ true );
1363
1379
@@ -1493,6 +1509,8 @@ StringRef Darwin::getPlatformFamily() const {
1493
1509
return " Watch" ;
1494
1510
case DarwinPlatformKind::DriverKit:
1495
1511
return " DriverKit" ;
1512
+ case DarwinPlatformKind::XROS:
1513
+ return " XR" ;
1496
1514
}
1497
1515
llvm_unreachable (" Unsupported platform" );
1498
1516
}
@@ -1524,6 +1542,9 @@ StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const {
1524
1542
case DarwinPlatformKind::WatchOS:
1525
1543
return TargetEnvironment == NativeEnvironment || IgnoreSim ? " watchos"
1526
1544
: " watchossim" ;
1545
+ case DarwinPlatformKind::XROS:
1546
+ return TargetEnvironment == NativeEnvironment || IgnoreSim ? " xros"
1547
+ : " xrossim" ;
1527
1548
case DarwinPlatformKind::DriverKit:
1528
1549
return " driverkit" ;
1529
1550
}
@@ -1829,6 +1850,9 @@ struct DarwinPlatform {
1829
1850
case DarwinPlatformKind::WatchOS:
1830
1851
Opt = options::OPT_mwatchos_version_min_EQ;
1831
1852
break ;
1853
+ case DarwinPlatformKind::XROS:
1854
+ // xrOS always explicitly provides a version in the triple.
1855
+ return ;
1832
1856
case DarwinPlatformKind::DriverKit:
1833
1857
// DriverKit always explicitly provides a version in the triple.
1834
1858
return ;
@@ -1974,6 +1998,8 @@ struct DarwinPlatform {
1974
1998
return DarwinPlatformKind::TvOS;
1975
1999
case llvm::Triple::WatchOS:
1976
2000
return DarwinPlatformKind::WatchOS;
2001
+ case llvm::Triple::XROS:
2002
+ return DarwinPlatformKind::XROS;
1977
2003
case llvm::Triple::DriverKit:
1978
2004
return DarwinPlatformKind::DriverKit;
1979
2005
default :
@@ -2153,8 +2179,12 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
2153
2179
else if (SDK.startswith (" AppleTVOS" ) || SDK.startswith (" AppleTVSimulator" ))
2154
2180
return DarwinPlatform::createFromSDK (
2155
2181
Darwin::TvOS, Version,
2156
- /* IsSimulator=*/ SDK.startswith (" AppleTVSimulator" ));
2157
- else if (SDK.startswith (" DriverKit" ))
2182
+ /* IsSimulator=*/ SDK.starts_with (" AppleTVSimulator" ));
2183
+ else if (SDK.starts_with (" XR" ))
2184
+ return DarwinPlatform::createFromSDK (
2185
+ Darwin::XROS, Version,
2186
+ /* IsSimulator=*/ SDK.contains (" Simulator" ));
2187
+ else if (SDK.starts_with (" DriverKit" ))
2158
2188
return DarwinPlatform::createFromSDK (Darwin::DriverKit, Version);
2159
2189
return std::nullopt;
2160
2190
};
@@ -2192,6 +2222,11 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
2192
2222
case llvm::Triple::WatchOS:
2193
2223
OsVersion = Triple.getWatchOSVersion ();
2194
2224
break ;
2225
+ case llvm::Triple::XROS:
2226
+ OsVersion = Triple.getOSVersion ();
2227
+ if (!OsVersion.getMajor ())
2228
+ OsVersion = OsVersion.withMajorReplaced (1 );
2229
+ break ;
2195
2230
case llvm::Triple::DriverKit:
2196
2231
OsVersion = Triple.getDriverKitVersion ();
2197
2232
break ;
@@ -2283,6 +2318,7 @@ std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2283
2318
case llvm::Triple::IOS:
2284
2319
case llvm::Triple::TvOS:
2285
2320
case llvm::Triple::WatchOS:
2321
+ case llvm::Triple::XROS:
2286
2322
break ;
2287
2323
default :
2288
2324
TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
@@ -2498,6 +2534,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
2498
2534
Micro >= 100 )
2499
2535
getDriver ().Diag (diag::err_drv_invalid_version_number)
2500
2536
<< OSTarget->getAsString (Args, Opts);
2537
+ } else if (Platform == XROS) {
2538
+ if (!Driver::GetReleaseVersion (OSTarget->getOSVersion (), Major, Minor,
2539
+ Micro, HadExtra) ||
2540
+ HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2541
+ Micro >= 100 )
2542
+ getDriver ().Diag (diag::err_drv_invalid_version_number)
2543
+ << OSTarget->getAsString (Args, Opts);
2501
2544
} else
2502
2545
llvm_unreachable (" unknown kind of Darwin platform" );
2503
2546
@@ -2802,6 +2845,10 @@ void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
2802
2845
llvm::sys::path::append (P, " libclang_rt.cc_kext_ios.a" );
2803
2846
} else if (isTargetDriverKit ()) {
2804
2847
// DriverKit doesn't want extra runtime support.
2848
+ } else if (isTargetXROSDevice ()) {
2849
+ llvm::sys::path::append (
2850
+ P, llvm::Twine (" libclang_rt.cc_kext_" ) +
2851
+ llvm::Triple::getOSTypeName (llvm::Triple::XROS) + " .a" );
2805
2852
} else {
2806
2853
llvm::sys::path::append (P, " libclang_rt.cc_kext.a" );
2807
2854
}
@@ -3016,6 +3063,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
3016
3063
case WatchOS: // Earlier than 4.0.
3017
3064
OS = llvm::Triple::WatchOS;
3018
3065
break ;
3066
+ case XROS: // Always available.
3067
+ return false ;
3019
3068
case DriverKit: // Always available.
3020
3069
return false ;
3021
3070
}
@@ -3037,6 +3086,8 @@ static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPl
3037
3086
return SDKVersion >= VersionTuple (99U );
3038
3087
case Darwin::WatchOS:
3039
3088
return SDKVersion >= VersionTuple (99U );
3089
+ case Darwin::XROS:
3090
+ return SDKVersion >= VersionTuple (99U );
3040
3091
default :
3041
3092
return true ;
3042
3093
}
@@ -3159,7 +3210,7 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
3159
3210
// FIXME: It would be far better to avoid inserting those -static arguments,
3160
3211
// but we can't check the deployment target in the translation code until
3161
3212
// it is set here.
3162
- if (isTargetWatchOSBased () || isTargetDriverKit () ||
3213
+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () ||
3163
3214
(isTargetIOSBased () && !isIPhoneOSVersionLT (6 , 0 ))) {
3164
3215
for (ArgList::iterator it = DAL->begin (), ie = DAL->end (); it != ie; ) {
3165
3216
Arg *A = *it;
@@ -3253,6 +3304,8 @@ void Darwin::addMinVersionArgs(const ArgList &Args,
3253
3304
ArgStringList &CmdArgs) const {
3254
3305
VersionTuple TargetVersion = getTripleTargetVersion ();
3255
3306
3307
+ assert (!isTargetXROS () && " xrOS always uses -platform-version" );
3308
+
3256
3309
if (isTargetWatchOS ())
3257
3310
CmdArgs.push_back (" -watchos_version_min" );
3258
3311
else if (isTargetWatchOSSimulator ())
@@ -3312,6 +3365,8 @@ static const char *getPlatformName(Darwin::DarwinPlatformKind Platform,
3312
3365
return " tvos" ;
3313
3366
case Darwin::WatchOS:
3314
3367
return " watchos" ;
3368
+ case Darwin::XROS:
3369
+ return " xros" ;
3315
3370
case Darwin::DriverKit:
3316
3371
return " driverkit" ;
3317
3372
}
@@ -3508,7 +3563,7 @@ void Darwin::addStartObjectFileArgs(const ArgList &Args,
3508
3563
}
3509
3564
3510
3565
void Darwin::CheckObjCARC () const {
3511
- if (isTargetIOSBased () || isTargetWatchOSBased () ||
3566
+ if (isTargetIOSBased () || isTargetWatchOSBased () || isTargetXROS () ||
3512
3567
(isTargetMacOSBased () && !isMacosxVersionLT (10 , 6 )))
3513
3568
return ;
3514
3569
getDriver ().Diag (diag::err_arc_unsupported_on_toolchain);
0 commit comments