Skip to content

Commit 4ea8fb1

Browse files
authored
[clang] Upstream visionOS Availability & DarwinSDKInfo APIs (llvm#84279) (#8358)
Admittedly a bit awkward, `visionos` is the correct and accepted spelling for annotating availability for xrOS target triples. This patch detects errors and handles cases when `xros` is mistakenly passed. In addition, add APIs for introduced/deprecated/obsoleted versioning in DarwinSDKInfo mappings. (cherry picked from commit 9cf9cb2)
1 parent 1f5a57e commit 4ea8fb1

File tree

7 files changed

+97
-2
lines changed

7 files changed

+97
-2
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,8 @@ def Availability : InheritableAttr {
953953
.Case("watchos_app_extension", "watchOS (App Extension)")
954954
.Case("maccatalyst", "macCatalyst")
955955
.Case("maccatalyst_app_extension", "macCatalyst (App Extension)")
956+
.Case("xros", "visionOS")
957+
.Case("xros_app_extension", "visionOS (App Extension)")
956958
.Case("swift", "Swift")
957959
.Case("shadermodel", "HLSL ShaderModel")
958960
.Case("ohos", "OpenHarmony OS")
@@ -970,6 +972,8 @@ static llvm::StringRef getPlatformNameSourceSpelling(llvm::StringRef Platform) {
970972
.Case("watchos_app_extension", "watchOSApplicationExtension")
971973
.Case("maccatalyst", "macCatalyst")
972974
.Case("maccatalyst_app_extension", "macCatalystApplicationExtension")
975+
.Case("xros", "visionOS")
976+
.Case("xros_app_extension", "visionOSApplicationExtension")
973977
.Case("zos", "z/OS")
974978
.Case("shadermodel", "ShaderModel")
975979
.Default(Platform);
@@ -986,6 +990,10 @@ static llvm::StringRef canonicalizePlatformName(llvm::StringRef Platform) {
986990
.Case("watchOSApplicationExtension", "watchos_app_extension")
987991
.Case("macCatalyst", "maccatalyst")
988992
.Case("macCatalystApplicationExtension", "maccatalyst_app_extension")
993+
.Case("visionOS", "xros")
994+
.Case("visionOSApplicationExtension", "xros_app_extension")
995+
.Case("visionos", "xros")
996+
.Case("visionos_app_extension", "xros_app_extension")
989997
.Case("ShaderModel", "shadermodel")
990998
.Default(Platform);
991999
} }];

clang/include/clang/Basic/DarwinSDKInfo.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,30 @@ class DarwinSDKInfo {
105105
map(const VersionTuple &Key, const VersionTuple &MinimumValue,
106106
std::optional<VersionTuple> MaximumValue) const;
107107

108+
/// Remap the 'introduced' availability version.
109+
/// If None is returned, the 'unavailable' availability should be used
110+
/// instead.
111+
std::optional<VersionTuple>
112+
mapIntroducedAvailabilityVersion(const VersionTuple &Key) const {
113+
// API_TO_BE_DEPRECATED is 100000.
114+
if (Key.getMajor() == 100000)
115+
return VersionTuple(100000);
116+
// Use None for maximum to force unavailable behavior for
117+
return map(Key, MinimumValue, std::nullopt);
118+
}
119+
120+
/// Remap the 'deprecated' and 'obsoleted' availability version.
121+
/// If None is returned for 'obsoleted', the 'unavailable' availability
122+
/// should be used instead. If None is returned for 'deprecated', the
123+
/// 'deprecated' version should be dropped.
124+
std::optional<VersionTuple>
125+
mapDeprecatedObsoletedAvailabilityVersion(const VersionTuple &Key) const {
126+
// API_TO_BE_DEPRECATED is 100000.
127+
if (Key.getMajor() == 100000)
128+
return VersionTuple(100000);
129+
return map(Key, MinimumValue, MaximumValue);
130+
}
131+
108132
static std::optional<RelatedTargetVersionMapping>
109133
parseJSON(const llvm::json::Object &Obj,
110134
VersionTuple MaximumDeploymentTarget);

clang/lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1148,8 +1148,11 @@ void Parser::ParseAvailabilityAttribute(
11481148
}
11491149
IdentifierLoc *Platform = ParseIdentifierLoc();
11501150
if (const IdentifierInfo *const Ident = Platform->Ident) {
1151+
// Disallow xrOS for availability attributes.
1152+
if (Ident->getName().contains("xrOS") || Ident->getName().contains("xros"))
1153+
Diag(Platform->Loc, diag::warn_availability_unknown_platform) << Ident;
11511154
// Canonicalize platform name from "macosx" to "macos".
1152-
if (Ident->getName() == "macosx")
1155+
else if (Ident->getName() == "macosx")
11531156
Platform->Ident = PP.getIdentifierInfo("macos");
11541157
// Canonicalize platform name from "macosx_app_extension" to
11551158
// "macos_app_extension".

clang/lib/Parse/ParseExpr.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3807,7 +3807,8 @@ std::optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
38073807
StringRef Platform =
38083808
AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
38093809

3810-
if (AvailabilityAttr::getPrettyPlatformName(Platform).empty()) {
3810+
if (AvailabilityAttr::getPrettyPlatformName(Platform).empty() ||
3811+
(GivenPlatform.contains("xros") || GivenPlatform.contains("xrOS"))) {
38113812
Diag(PlatformIdentifier->Loc,
38123813
diag::err_avail_query_unrecognized_platform_name)
38133814
<< GivenPlatform;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %clang_cc1 -triple arm64-apple-xros1 -emit-llvm -o - %s 2>&1 | FileCheck %s
2+
3+
__attribute__((availability(visionOS, introduced=1.1)))
4+
void introduced_1_1();
5+
6+
void use() {
7+
if (__builtin_available(visionOS 1.2, *))
8+
introduced_1_1();
9+
// CHECK: call i32 @__isPlatformVersionAtLeast(i32 11, i32 1, i32 2, i32 0)
10+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %clang_cc1 -triple arm64-apple-xros1 -fapplication-extension -verify=visionos %s 2>&1
2+
3+
__attribute__((availability(xros, unavailable))) // visionos-warning {{unknown platform 'xros' in availability macro}}
4+
void xros_unavail(); // visionos-note {{}}
5+
6+
__attribute__((availability(xros_app_extension, unavailable))) // visionos-warning {{unknown platform 'xros_app_extension' in availability macro}}
7+
void xros_ext_unavail(); // visionos-note {{}}
8+
9+
__attribute__((availability(visionOSApplicationExtension, unavailable)))
10+
void visionos_ext_unavail(); // visionos-note {{}}
11+
12+
void use() {
13+
xros_unavail(); // visionos-error {{'xros_unavail' is unavailable: not available on visionOS}}
14+
xros_ext_unavail(); // visionos-error {{'xros_ext_unavail' is unavailable: not available on visionOS}}
15+
visionos_ext_unavail(); // visionos-error {{'visionos_ext_unavail' is unavailable: not available on visionOS}}
16+
}
17+
18+
__attribute__((availability(visionOS, introduced=1.0)))
19+
void visionos_introduced_1();
20+
21+
__attribute__((availability(visionos, introduced=1.1)))
22+
void visionos_introduced_1_1(); // visionos-note 4 {{'visionos_introduced_1_1' has been marked as being introduced in visionOS 1.1 here, but the deployment target is visionOS 1}}
23+
24+
void use2() {
25+
if (__builtin_available(iOS 16.1, *))
26+
visionos_introduced_1_1(); // visionos-warning {{'visionos_introduced_1_1' is only available on visionOS 1.1 or newer}} visionos-note {{enclose}}
27+
28+
if (__builtin_available(xrOS 1.1, *)) // visionos-error {{unrecognized platform name xrOS}}
29+
visionos_introduced_1_1(); // visionos-warning {{'visionos_introduced_1_1' is only available on visionOS 1.1 or newer}} visionos-note {{enclose}}
30+
31+
if (__builtin_available(xros_app_extension 1, *)) // visionos-error {{unrecognized platform name xros_app_extension}}
32+
visionos_introduced_1_1(); // visionos-warning {{'visionos_introduced_1_1' is only available on visionOS 1.1 or newer}} visionos-note {{enclose}}
33+
34+
if (__builtin_available(visionOS 1.1, *))
35+
visionos_introduced_1_1();
36+
37+
visionos_introduced_1();
38+
visionos_introduced_1_1(); // visionos-warning {{'visionos_introduced_1_1' is only available on visionOS 1.1 or newer}} visionos-note {{enclose}}
39+
}

clang/unittests/Basic/DarwinSDKInfoTest.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,16 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
168168
EXPECT_EQ(
169169
*Mapping->map(VersionTuple(13, 0), VersionTuple(), VersionTuple(99, 99)),
170170
VersionTuple(99, 99));
171+
172+
// Verify introduced, deprecated, and obsoleted mappings.
173+
EXPECT_EQ(Mapping->mapIntroducedAvailabilityVersion(VersionTuple(10, 1)),
174+
VersionTuple(10.0));
175+
EXPECT_EQ(Mapping->mapDeprecatedObsoletedAvailabilityVersion(
176+
VersionTuple(100000, 0)),
177+
VersionTuple(100000));
178+
EXPECT_EQ(
179+
Mapping->mapDeprecatedObsoletedAvailabilityVersion(VersionTuple(13.0)),
180+
VersionTuple(15, 0, 99));
171181
}
172182

173183
TEST(DarwinSDKInfoTest, MissingKeys) {

0 commit comments

Comments
 (0)