Skip to content

Commit a4fe6a1

Browse files
authored
[clang] Upstream XROS support in Clang (llvm#78392)
Upstream XROS support in the clang frontend and driver.
1 parent bd9e145 commit a4fe6a1

File tree

10 files changed

+140
-11
lines changed

10 files changed

+140
-11
lines changed

clang/lib/Basic/Targets/OSTargets.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
7474
this->TLSSupported = !Triple.isOSVersionLT(3);
7575
} else if (Triple.isDriverKit()) {
7676
// No TLS on DriverKit.
77-
}
77+
} else if (Triple.isXROS())
78+
this->TLSSupported = true;
7879

7980
this->MCountName = "\01mcount";
8081
}
@@ -109,6 +110,9 @@ class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
109110
case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0.
110111
MinVersion = llvm::VersionTuple(5U);
111112
break;
113+
case llvm::Triple::XROS:
114+
MinVersion = llvm::VersionTuple(0);
115+
break;
112116
default:
113117
// Conservatively return 8 bytes if OS is unknown.
114118
return 64;

clang/lib/CodeGen/CGObjC.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -3941,6 +3941,8 @@ static unsigned getBaseMachOPlatformID(const llvm::Triple &TT) {
39413941
return llvm::MachO::PLATFORM_TVOS;
39423942
case llvm::Triple::WatchOS:
39433943
return llvm::MachO::PLATFORM_WATCHOS;
3944+
case llvm::Triple::XROS:
3945+
return llvm::MachO::PLATFORM_XROS;
39443946
case llvm::Triple::DriverKit:
39453947
return llvm::MachO::PLATFORM_DRIVERKIT;
39463948
default:
@@ -4024,6 +4026,9 @@ static bool isFoundationNeededForDarwinAvailabilityCheck(
40244026
case llvm::Triple::MacOSX:
40254027
FoundationDroppedInVersion = VersionTuple(/*Major=*/10, /*Minor=*/15);
40264028
break;
4029+
case llvm::Triple::XROS:
4030+
// XROS doesn't need Foundation.
4031+
return false;
40274032
case llvm::Triple::DriverKit:
40284033
// DriverKit doesn't need Foundation.
40294034
return false;

clang/lib/Driver/Driver.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -6213,6 +6213,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
62136213
case llvm::Triple::IOS:
62146214
case llvm::Triple::TvOS:
62156215
case llvm::Triple::WatchOS:
6216+
case llvm::Triple::XROS:
62166217
case llvm::Triple::DriverKit:
62176218
TC = std::make_unique<toolchains::DarwinClang>(*this, Target, Args);
62186219
break;

clang/lib/Driver/ToolChains/Arch/AArch64.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
5353
return "apple-m1";
5454
}
5555

56+
if (Triple.isXROS()) {
57+
// The xrOS simulator runs on M1 as well, it should have been covered above.
58+
assert(!Triple.isSimulatorEnvironment() && "xrossim should be mac-like");
59+
return "apple-a12";
60+
}
5661
// arm64e requires v8.3a and only runs on apple-a12 and later CPUs.
5762
if (Triple.isArm64e())
5863
return "apple-a12";

clang/lib/Driver/ToolChains/Arch/ARM.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ arm::FloatABI arm::getDefaultFloatABI(const llvm::Triple &Triple) {
367367
case llvm::Triple::IOS:
368368
case llvm::Triple::TvOS:
369369
case llvm::Triple::DriverKit:
370+
case llvm::Triple::XROS:
370371
// Darwin defaults to "softfp" for v6 and v7.
371372
if (Triple.isWatchABI())
372373
return FloatABI::Hard;
@@ -836,8 +837,8 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D,
836837
if (A->getOption().matches(options::OPT_mlong_calls))
837838
Features.push_back("+long-calls");
838839
} else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
839-
!Triple.isWatchOS()) {
840-
Features.push_back("+long-calls");
840+
!Triple.isWatchOS() && !Triple.isXROS()) {
841+
Features.push_back("+long-calls");
841842
}
842843

843844
// Generate execute-only output (no data access to code sections).

clang/lib/Driver/ToolChains/Darwin.cpp

+61-6
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) {
219219
void 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.
963975
bool 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

33493404
void 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);

clang/lib/Driver/ToolChains/Darwin.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
6565
void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
6666
llvm::opt::ArgStringList &CmdArgs,
6767
const InputInfoList &Inputs, VersionTuple Version,
68-
bool LinkerIsLLD) const;
68+
bool LinkerIsLLD, bool UsePlatformVersion) const;
6969

7070
public:
7171
Linker(const ToolChain &TC) : MachOTool("darwin::Linker", "linker", TC) {}
@@ -298,6 +298,7 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO {
298298
TvOS,
299299
WatchOS,
300300
DriverKit,
301+
XROS,
301302
LastDarwinPlatform = DriverKit
302303
};
303304
enum DarwinEnvironmentKind {
@@ -404,6 +405,16 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO {
404405
return isTargetIPhoneOS() || isTargetIOSSimulator();
405406
}
406407

408+
bool isTargetXROSDevice() const {
409+
return TargetPlatform == XROS && TargetEnvironment == NativeEnvironment;
410+
}
411+
412+
bool isTargetXROSSimulator() const {
413+
return TargetPlatform == XROS && TargetEnvironment == Simulator;
414+
}
415+
416+
bool isTargetXROS() const { return TargetPlatform == XROS; }
417+
407418
bool isTargetTvOS() const {
408419
assert(TargetInitialized && "Target not initialized!");
409420
return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;
@@ -546,7 +557,8 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO {
546557
GetDefaultStackProtectorLevel(bool KernelOrKext) const override {
547558
// Stack protectors default to on for user code on 10.5,
548559
// and for everything in 10.6 and beyond
549-
if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit())
560+
if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit() ||
561+
isTargetXROS())
550562
return LangOptions::SSPOn;
551563
else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
552564
return LangOptions::SSPOn;

clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,8 @@ void WalkAST::checkMsg_decodeValueOfObjCType(const ObjCMessageExpr *ME) {
973973
if (VT < VersionTuple(11, 0))
974974
return;
975975
break;
976+
case llvm::Triple::XROS:
977+
break;
976978
default:
977979
return;
978980
}

clang/test/Driver/xros-driver.c

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// RUN: %clang -target arm64-apple-xros1 -c -### %s 2>&1 | FileCheck --check-prefix=VERSION1 %s
2+
// RUN: %clang -target arm64-apple-xros -c -### %s 2>&1 | FileCheck --check-prefix=VERSION1 %s
3+
4+
// RUN: %clang -target arm64-apple-xros1-simulator -c -### %s 2>&1 | FileCheck --check-prefix=VERSION1_ASi %s
5+
6+
// RUN: not %clang -target arm64-apple-xros1000 -c -### %s 2>&1 | FileCheck --check-prefix=INVALID-VERSION %s
7+
8+
// RUN: %clang -target arm64-apple-xros1 -### %s 2>&1 | FileCheck --check-prefix=LINK %s
9+
// RUN: %clang -target arm64-apple-xros1-simulator -### %s 2>&1 | FileCheck --check-prefix=LINK-SIM %s
10+
11+
// RUN: %clang -target arm64-apple-xros1 -c -x objective-c -fobjc-arc -### %s 2>&1 | FileCheck --check-prefix=ARC %s
12+
// RUN: %clang -target arm64-apple-xros -c -x objective-c -fobjc-arc -### %s 2>&1 | FileCheck --check-prefix=OBJC-RUNTIME %s
13+
// RUN: %clang -target arm64-apple-xros2 -c -x objective-c -fobjc-arc -### %s 2>&1 | FileCheck --check-prefix=OBJC-RUNTIME2 %s
14+
15+
// RUN: %clang -target arm64-apple-xros1 -c -x objective-c -fobjc-arc -### %s 2>&1 | FileCheck --check-prefix=ARC %s
16+
// RUN: %clang -target arm64-apple-xros1-simulator -c -x objective-c -fobjc-arc -### %s 2>&1 | FileCheck --check-prefix=ARC %s
17+
18+
// RUN: %clang -target arm64-apple-xros -c -### %s 2>&1 | FileCheck --check-prefix=SSP_ON %s
19+
20+
// RUN: %clang -target arm64e-apple-xros -c -### %s 2>&1 | FileCheck --check-prefix=CPU-ARM64E %s
21+
// RUN: %clang -target arm64-apple-xros -c -### %s 2>&1 | FileCheck --check-prefix=CPU-ARM64 %s
22+
// RUN: %clang -target arm64-apple-xros-simulator -c -### %s 2>&1 | FileCheck --check-prefix=CPU-ARM64-SIM %s
23+
24+
// VERSION1: "-cc1"{{.*}} "-triple" "arm64-apple-xros1.0.0"
25+
// VERSION1_ASi: "-cc1"{{.*}} "-triple" "arm64-apple-xros1.0.0-simulator"
26+
// INVALID-VERSION: error: invalid version number in
27+
28+
// VERSION1-NOT: -faligned-alloc-unavailable
29+
30+
// LINK: "-platform_version" "xros" "1.0.0" "1.0.0"
31+
// LINK-SIM: "-platform_version" "xros-simulator" "1.0.0" "1.0.0"
32+
33+
// OBJC-RUNTIME: "-fobjc-runtime=ios-17.0.0.0"
34+
// OBJC-RUNTIME2: "-fobjc-runtime=ios-18.0.0.0"
35+
// ARC-NOT: error:
36+
37+
// SSP_ON: "-stack-protector" "1"
38+
39+
// CPU-ARM64E: "-cc1"{{.*}} "-triple" "arm64e-apple-xros1.0.0"{{.*}} "-target-cpu" "apple-a12"{{.*}}
40+
// CPU-ARM64: "-cc1"{{.*}} "-triple" "arm64-apple-xros1.0.0"{{.*}} "-target-cpu" "apple-a12"
41+
// CPU-ARM64-SIM: "-cc1"{{.*}} "-triple" "arm64-apple-xros1.0.0-simulator"{{.*}} "-target-cpu" "apple-m1"

clang/test/Frontend/xros-version.c

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// RUN: %clang_cc1 -triple arm64-apple-xros1 -dM -E -o - %s | FileCheck %s
2+
3+
// CHECK: __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 10000

0 commit comments

Comments
 (0)