@@ -219,7 +219,8 @@ static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) {
219219void darwin::Linker::AddLinkArgs (Compilation &C, const ArgList &Args,
220220 ArgStringList &CmdArgs,
221221 const InputInfoList &Inputs,
222- VersionTuple Version, bool LinkerIsLLD) const {
222+ VersionTuple Version, bool LinkerIsLLD,
223+ bool UsePlatformVersion) const {
223224 const Driver &D = getToolChain ().getDriver ();
224225 const toolchains::MachO &MachOTC = getMachOToolChain ();
225226
@@ -355,7 +356,7 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
355356 Args.AddAllArgs (CmdArgs, options::OPT_init);
356357
357358 // Add the deployment target.
358- if (Version >= VersionTuple (520 ) || LinkerIsLLD)
359+ if (Version >= VersionTuple (520 ) || LinkerIsLLD || UsePlatformVersion )
359360 MachOTC.addPlatformVersionArgs (Args, CmdArgs);
360361 else
361362 MachOTC.addMinVersionArgs (Args, CmdArgs);
@@ -596,9 +597,13 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
596597 const char *Exec =
597598 Args.MakeArgString (getToolChain ().GetLinkerPath (&LinkerIsLLD));
598599
600+ // xrOS always uses -platform-version.
601+ bool UsePlatformVersion = getToolChain ().getTriple ().isXROS ();
602+
599603 // I'm not sure why this particular decomposition exists in gcc, but
600604 // 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);
602607
603608 if (willEmitRemarks (Args) &&
604609 checkRemarksOptions (getToolChain ().getDriver (), Args,
@@ -954,14 +959,21 @@ ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
954959 return ObjCRuntime (ObjCRuntime::WatchOS, TargetVersion);
955960 if (isTargetIOSBased ())
956961 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+ }
957969 if (isNonFragile)
958970 return ObjCRuntime (ObjCRuntime::MacOSX, TargetVersion);
959971 return ObjCRuntime (ObjCRuntime::FragileMacOSX, TargetVersion);
960972}
961973
962974// / Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
963975bool Darwin::hasBlocksRuntime () const {
964- if (isTargetWatchOSBased () || isTargetDriverKit ())
976+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () )
965977 return true ;
966978 else if (isTargetIOSBased ())
967979 return !isIPhoneOSVersionLT (3 , 2 );
@@ -1092,6 +1104,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
10921104 Str += " driverkit" ;
10931105 else if (isTargetIOSBased () || isTargetMacCatalyst ())
10941106 Str += " ios" ;
1107+ else if (isTargetXROS ())
1108+ Str += llvm::Triple::getOSTypeName (llvm::Triple::XROS);
10951109 else
10961110 Str += " macosx" ;
10971111 Str += getTripleTargetVersion ().getAsString ();
@@ -1174,6 +1188,8 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
11741188 // ARC runtime is supported everywhere on arm64e.
11751189 if (getTriple ().isArm64e ())
11761190 return ;
1191+ if (isTargetXROS ())
1192+ return ;
11771193
11781194 ObjCRuntime runtime = getDefaultObjCRuntime (/* nonfragile*/ true );
11791195
@@ -1309,6 +1325,8 @@ StringRef Darwin::getPlatformFamily() const {
13091325 return " Watch" ;
13101326 case DarwinPlatformKind::DriverKit:
13111327 return " DriverKit" ;
1328+ case DarwinPlatformKind::XROS:
1329+ return " XR" ;
13121330 }
13131331 llvm_unreachable (" Unsupported platform" );
13141332}
@@ -1340,6 +1358,9 @@ StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const {
13401358 case DarwinPlatformKind::WatchOS:
13411359 return TargetEnvironment == NativeEnvironment || IgnoreSim ? " watchos"
13421360 : " watchossim" ;
1361+ case DarwinPlatformKind::XROS:
1362+ return TargetEnvironment == NativeEnvironment || IgnoreSim ? " xros"
1363+ : " xrossim" ;
13431364 case DarwinPlatformKind::DriverKit:
13441365 return " driverkit" ;
13451366 }
@@ -1649,6 +1670,9 @@ struct DarwinPlatform {
16491670 case DarwinPlatformKind::WatchOS:
16501671 Opt = options::OPT_mwatchos_version_min_EQ;
16511672 break ;
1673+ case DarwinPlatformKind::XROS:
1674+ // xrOS always explicitly provides a version in the triple.
1675+ return ;
16521676 case DarwinPlatformKind::DriverKit:
16531677 // DriverKit always explicitly provides a version in the triple.
16541678 return ;
@@ -1794,6 +1818,8 @@ struct DarwinPlatform {
17941818 return DarwinPlatformKind::TvOS;
17951819 case llvm::Triple::WatchOS:
17961820 return DarwinPlatformKind::WatchOS;
1821+ case llvm::Triple::XROS:
1822+ return DarwinPlatformKind::XROS;
17971823 case llvm::Triple::DriverKit:
17981824 return DarwinPlatformKind::DriverKit;
17991825 default :
@@ -1975,6 +2001,10 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
19752001 return DarwinPlatform::createFromSDK (
19762002 Darwin::TvOS, Version,
19772003 /* 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" ));
19782008 else if (SDK.starts_with (" DriverKit" ))
19792009 return DarwinPlatform::createFromSDK (Darwin::DriverKit, Version);
19802010 return std::nullopt ;
@@ -2013,6 +2043,11 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
20132043 case llvm::Triple::WatchOS:
20142044 OsVersion = Triple.getWatchOSVersion ();
20152045 break ;
2046+ case llvm::Triple::XROS:
2047+ OsVersion = Triple.getOSVersion ();
2048+ if (!OsVersion.getMajor ())
2049+ OsVersion = OsVersion.withMajorReplaced (1 );
2050+ break ;
20162051 case llvm::Triple::DriverKit:
20172052 OsVersion = Triple.getDriverKitVersion ();
20182053 break ;
@@ -2104,6 +2139,7 @@ std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
21042139 case llvm::Triple::IOS:
21052140 case llvm::Triple::TvOS:
21062141 case llvm::Triple::WatchOS:
2142+ case llvm::Triple::XROS:
21072143 break ;
21082144 default :
21092145 TheDriver.Diag (diag::err_drv_invalid_os_in_arg)
@@ -2319,6 +2355,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
23192355 Micro >= 100 )
23202356 getDriver ().Diag (diag::err_drv_invalid_version_number)
23212357 << 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);
23222365 } else
23232366 llvm_unreachable (" unknown kind of Darwin platform" );
23242367
@@ -2641,6 +2684,10 @@ void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
26412684 llvm::sys::path::append (P, " libclang_rt.cc_kext_ios.a" );
26422685 } else if (isTargetDriverKit ()) {
26432686 // 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" );
26442691 } else {
26452692 llvm::sys::path::append (P, " libclang_rt.cc_kext.a" );
26462693 }
@@ -2855,6 +2902,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
28552902 case WatchOS: // Earlier than 4.0.
28562903 OS = llvm::Triple::WatchOS;
28572904 break ;
2905+ case XROS: // Always available.
2906+ return false ;
28582907 case DriverKit: // Always available.
28592908 return false ;
28602909 }
@@ -2876,6 +2925,8 @@ static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPl
28762925 return SDKVersion >= VersionTuple (99U );
28772926 case Darwin::WatchOS:
28782927 return SDKVersion >= VersionTuple (99U );
2928+ case Darwin::XROS:
2929+ return SDKVersion >= VersionTuple (99U );
28792930 default :
28802931 return true ;
28812932 }
@@ -2998,7 +3049,7 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
29983049 // FIXME: It would be far better to avoid inserting those -static arguments,
29993050 // but we can't check the deployment target in the translation code until
30003051 // it is set here.
3001- if (isTargetWatchOSBased () || isTargetDriverKit () ||
3052+ if (isTargetWatchOSBased () || isTargetDriverKit () || isTargetXROS () ||
30023053 (isTargetIOSBased () && !isIPhoneOSVersionLT (6 , 0 ))) {
30033054 for (ArgList::iterator it = DAL->begin (), ie = DAL->end (); it != ie; ) {
30043055 Arg *A = *it;
@@ -3092,6 +3143,8 @@ void Darwin::addMinVersionArgs(const ArgList &Args,
30923143 ArgStringList &CmdArgs) const {
30933144 VersionTuple TargetVersion = getTripleTargetVersion ();
30943145
3146+ assert (!isTargetXROS () && " xrOS always uses -platform-version" );
3147+
30953148 if (isTargetWatchOS ())
30963149 CmdArgs.push_back (" -watchos_version_min" );
30973150 else if (isTargetWatchOSSimulator ())
@@ -3151,6 +3204,8 @@ static const char *getPlatformName(Darwin::DarwinPlatformKind Platform,
31513204 return " tvos" ;
31523205 case Darwin::WatchOS:
31533206 return " watchos" ;
3207+ case Darwin::XROS:
3208+ return " xros" ;
31543209 case Darwin::DriverKit:
31553210 return " driverkit" ;
31563211 }
@@ -3347,7 +3402,7 @@ void Darwin::addStartObjectFileArgs(const ArgList &Args,
33473402}
33483403
33493404void Darwin::CheckObjCARC () const {
3350- if (isTargetIOSBased () || isTargetWatchOSBased () ||
3405+ if (isTargetIOSBased () || isTargetWatchOSBased () || isTargetXROS () ||
33513406 (isTargetMacOSBased () && !isMacosxVersionLT (10 , 6 )))
33523407 return ;
33533408 getDriver ().Diag (diag::err_arc_unsupported_on_toolchain);
0 commit comments