Skip to content

Commit 52ff81f

Browse files
committed
[clang] Upstream XROS support in Clang
Upstream XROS support in the clang frontend and driver.
1 parent 0c6dc80 commit 52ff81f

File tree

10 files changed

+131
-7
lines changed

10 files changed

+131
-7
lines changed

clang/lib/Basic/Targets/OSTargets.h

Lines changed: 5 additions & 1 deletion
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -954,14 +954,21 @@ ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
954954
return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
955955
if (isTargetIOSBased())
956956
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+
}
957964
if (isNonFragile)
958965
return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
959966
return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
960967
}
961968

962969
/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
963970
bool Darwin::hasBlocksRuntime() const {
964-
if (isTargetWatchOSBased() || isTargetDriverKit())
971+
if (isTargetWatchOSBased() || isTargetDriverKit() || isTargetXROS())
965972
return true;
966973
else if (isTargetIOSBased())
967974
return !isIPhoneOSVersionLT(3, 2);
@@ -1092,6 +1099,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
10921099
Str += "driverkit";
10931100
else if (isTargetIOSBased() || isTargetMacCatalyst())
10941101
Str += "ios";
1102+
else if (isTargetXROS())
1103+
Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
10951104
else
10961105
Str += "macosx";
10971106
Str += getTripleTargetVersion().getAsString();
@@ -1174,6 +1183,8 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
11741183
// ARC runtime is supported everywhere on arm64e.
11751184
if (getTriple().isArm64e())
11761185
return;
1186+
if (isTargetXROS())
1187+
return;
11771188

11781189
ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
11791190

@@ -1309,6 +1320,8 @@ StringRef Darwin::getPlatformFamily() const {
13091320
return "Watch";
13101321
case DarwinPlatformKind::DriverKit:
13111322
return "DriverKit";
1323+
case DarwinPlatformKind::XROS:
1324+
return "XR";
13121325
}
13131326
llvm_unreachable("Unsupported platform");
13141327
}
@@ -1340,6 +1353,9 @@ StringRef Darwin::getOSLibraryNameSuffix(bool IgnoreSim) const {
13401353
case DarwinPlatformKind::WatchOS:
13411354
return TargetEnvironment == NativeEnvironment || IgnoreSim ? "watchos"
13421355
: "watchossim";
1356+
case DarwinPlatformKind::XROS:
1357+
return TargetEnvironment == NativeEnvironment || IgnoreSim ? "xros"
1358+
: "xrossim";
13431359
case DarwinPlatformKind::DriverKit:
13441360
return "driverkit";
13451361
}
@@ -1649,6 +1665,9 @@ struct DarwinPlatform {
16491665
case DarwinPlatformKind::WatchOS:
16501666
Opt = options::OPT_mwatchos_version_min_EQ;
16511667
break;
1668+
case DarwinPlatformKind::XROS:
1669+
// xrOS always explicitly provides a version in the triple.
1670+
return;
16521671
case DarwinPlatformKind::DriverKit:
16531672
// DriverKit always explicitly provides a version in the triple.
16541673
return;
@@ -1794,6 +1813,8 @@ struct DarwinPlatform {
17941813
return DarwinPlatformKind::TvOS;
17951814
case llvm::Triple::WatchOS:
17961815
return DarwinPlatformKind::WatchOS;
1816+
case llvm::Triple::XROS:
1817+
return DarwinPlatformKind::XROS;
17971818
case llvm::Triple::DriverKit:
17981819
return DarwinPlatformKind::DriverKit;
17991820
default:
@@ -1975,6 +1996,10 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
19751996
return DarwinPlatform::createFromSDK(
19761997
Darwin::TvOS, Version,
19771998
/*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"));
19782003
else if (SDK.starts_with("DriverKit"))
19792004
return DarwinPlatform::createFromSDK(Darwin::DriverKit, Version);
19802005
return std::nullopt;
@@ -2013,6 +2038,11 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
20132038
case llvm::Triple::WatchOS:
20142039
OsVersion = Triple.getWatchOSVersion();
20152040
break;
2041+
case llvm::Triple::XROS:
2042+
OsVersion = Triple.getOSVersion();
2043+
if (!OsVersion.getMajor())
2044+
OsVersion = OsVersion.withMajorReplaced(1);
2045+
break;
20162046
case llvm::Triple::DriverKit:
20172047
OsVersion = Triple.getDriverKitVersion();
20182048
break;
@@ -2104,6 +2134,7 @@ std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
21042134
case llvm::Triple::IOS:
21052135
case llvm::Triple::TvOS:
21062136
case llvm::Triple::WatchOS:
2137+
case llvm::Triple::XROS:
21072138
break;
21082139
default:
21092140
TheDriver.Diag(diag::err_drv_invalid_os_in_arg)
@@ -2319,6 +2350,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
23192350
Micro >= 100)
23202351
getDriver().Diag(diag::err_drv_invalid_version_number)
23212352
<< 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);
23222360
} else
23232361
llvm_unreachable("unknown kind of Darwin platform");
23242362

@@ -2641,6 +2679,10 @@ void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
26412679
llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
26422680
} else if (isTargetDriverKit()) {
26432681
// 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");
26442686
} else {
26452687
llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
26462688
}
@@ -2855,6 +2897,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
28552897
case WatchOS: // Earlier than 4.0.
28562898
OS = llvm::Triple::WatchOS;
28572899
break;
2900+
case XROS: // Always available.
2901+
return false;
28582902
case DriverKit: // Always available.
28592903
return false;
28602904
}
@@ -2876,6 +2920,8 @@ static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPl
28762920
return SDKVersion >= VersionTuple(99U);
28772921
case Darwin::WatchOS:
28782922
return SDKVersion >= VersionTuple(99U);
2923+
case Darwin::XROS:
2924+
return SDKVersion >= VersionTuple(99U);
28792925
default:
28802926
return true;
28812927
}
@@ -2998,7 +3044,7 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
29983044
// FIXME: It would be far better to avoid inserting those -static arguments,
29993045
// but we can't check the deployment target in the translation code until
30003046
// it is set here.
3001-
if (isTargetWatchOSBased() || isTargetDriverKit() ||
3047+
if (isTargetWatchOSBased() || isTargetDriverKit() || isTargetXROS() ||
30023048
(isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
30033049
for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
30043050
Arg *A = *it;
@@ -3092,6 +3138,8 @@ void Darwin::addMinVersionArgs(const ArgList &Args,
30923138
ArgStringList &CmdArgs) const {
30933139
VersionTuple TargetVersion = getTripleTargetVersion();
30943140

3141+
assert(!isTargetXROS() && "xrOS always uses -platform-version");
3142+
30953143
if (isTargetWatchOS())
30963144
CmdArgs.push_back("-watchos_version_min");
30973145
else if (isTargetWatchOSSimulator())
@@ -3151,6 +3199,8 @@ static const char *getPlatformName(Darwin::DarwinPlatformKind Platform,
31513199
return "tvos";
31523200
case Darwin::WatchOS:
31533201
return "watchos";
3202+
case Darwin::XROS:
3203+
return "xros";
31543204
case Darwin::DriverKit:
31553205
return "driverkit";
31563206
}
@@ -3347,7 +3397,7 @@ void Darwin::addStartObjectFileArgs(const ArgList &Args,
33473397
}
33483398

33493399
void Darwin::CheckObjCARC() const {
3350-
if (isTargetIOSBased() || isTargetWatchOSBased() ||
3400+
if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetXROS() ||
33513401
(isTargetMacOSBased() && !isMacosxVersionLT(10, 6)))
33523402
return;
33533403
getDriver().Diag(diag::err_arc_unsupported_on_toolchain);

clang/lib/Driver/ToolChains/Darwin.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 41 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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)