Skip to content

Commit d203876

Browse files
committed
SILGen: Use the OS version specified in the @_backDeploy attribute instead of the version specified in the @available attribute when emitting the if #available condition in back deployment thunks.
1 parent 20b454a commit d203876

File tree

7 files changed

+25
-8
lines changed

7 files changed

+25
-8
lines changed

include/swift/AST/Decl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,11 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
825825
/// This function won't consider the parent context to get the information.
826826
Optional<llvm::VersionTuple> getIntroducedOSVersion(PlatformKind Kind) const;
827827

828+
/// Returns the OS version in which the decl became ABI as specified by the
829+
/// @_backDeploy attribute.
830+
Optional<llvm::VersionTuple>
831+
getBackDeployBeforeOSVersion(PlatformKind Kind) const;
832+
828833
/// Returns the starting location of the entire declaration.
829834
SourceLoc getStartLoc() const { return getSourceRange().Start; }
830835

lib/AST/Decl.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,18 @@ Decl::getIntroducedOSVersion(PlatformKind Kind) const {
377377
return None;
378378
}
379379

380+
Optional<llvm::VersionTuple>
381+
Decl::getBackDeployBeforeOSVersion(PlatformKind Kind) const {
382+
for (auto *attr : getAttrs()) {
383+
if (auto *backDeployAttr = dyn_cast<BackDeployAttr>(attr)) {
384+
if (backDeployAttr->Platform == Kind && backDeployAttr->Version) {
385+
return backDeployAttr->Version;
386+
}
387+
}
388+
}
389+
return None;
390+
}
391+
380392
llvm::raw_ostream &swift::operator<<(llvm::raw_ostream &OS,
381393
StaticSpellingKind SSK) {
382394
switch (SSK) {

lib/SILGen/SILGenBackDeploy.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ static void emitBackDeployIfAvailableCondition(SILGenFunction &SGF,
5353
SILBasicBlock *availableBB,
5454
SILBasicBlock *unavailableBB) {
5555
PlatformKind platform = targetPlatform(SGF.SGM.getASTContext().LangOpts);
56-
auto introduced = AFD->getIntroducedOSVersion(platform);
56+
auto version = AFD->getBackDeployBeforeOSVersion(platform);
5757
VersionRange OSVersion = VersionRange::empty();
58-
if (introduced.hasValue()) {
59-
OSVersion = VersionRange::allGTE(*introduced);
58+
if (version.hasValue()) {
59+
OSVersion = VersionRange::allGTE(*version);
6060
}
6161

6262
SILValue booleanTestValue;

test/SILGen/back_deploy_attribute_func.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// CHECK-LABEL: sil non_abi [serialized] [thunk] [available 10.51] [ossa] @$s11back_deploy11trivialFuncyyFTwb : $@convention(thin) () -> ()
1616
// CHECK: bb0:
1717
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 10
18-
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 51
18+
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 52
1919
// CHECK: [[PATCH:%.*]] = integer_literal $Builtin.Word, 0
2020
// CHECK: [[OSVFN:%.*]] = function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
2121
// CHECK: [[AVAIL:%.*]] = apply [[OSVFN]]([[MAJOR]], [[MINOR]], [[PATCH]]) : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
@@ -51,7 +51,7 @@ public func trivialFunc() {}
5151
// CHECK-LABEL: sil non_abi [serialized] [thunk] [available 10.51] [ossa] @$s11back_deploy8isNumberySbSiFTwb : $@convention(thin) (Int) -> Bool
5252
// CHECK: bb0([[ARG_X:%.*]] : $Int):
5353
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 10
54-
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 51
54+
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 52
5555
// CHECK: [[PATCH:%.*]] = integer_literal $Builtin.Word, 0
5656
// CHECK: [[OSVFN:%.*]] = function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
5757
// CHECK: [[AVAIL:%.*]] = apply [[OSVFN]]([[MAJOR]], [[MINOR]], [[PATCH]]) : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1

test/SILGen/back_deploy_attribute_generic_func.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
// CHECK-LABEL: sil non_abi [serialized] [thunk] [available 10.51] [ossa] @$s11back_deploy11genericFuncyxxlFTwb : $@convention(thin) <T> (@in_guaranteed T) -> @out T
1717
// CHECK: bb0([[OUT_ARG:%.*]] : $*T, [[IN_ARG:%.*]] : $*T):
1818
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 10
19-
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 51
19+
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 52
2020
// CHECK: [[PATCH:%.*]] = integer_literal $Builtin.Word, 0
2121
// CHECK: [[OSVFN:%.*]] = function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
2222
// CHECK: [[AVAIL:%.*]] = apply [[OSVFN]]([[MAJOR]], [[MINOR]], [[PATCH]]) : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1

test/SILGen/back_deploy_attribute_struct_method.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public struct TopLevelStruct {
1717
// CHECK-LABEL: sil non_abi [serialized] [thunk] [available 10.51] [ossa] @$s11back_deploy14TopLevelStructV13trivialMethodyyFTwb : $@convention(method) (TopLevelStruct) -> ()
1818
// CHECK: bb0([[BB0_ARG:%.*]] : $TopLevelStruct):
1919
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 10
20-
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 51
20+
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 52
2121
// CHECK: [[PATCH:%.*]] = integer_literal $Builtin.Word, 0
2222
// CHECK: [[OSVFN:%.*]] = function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
2323
// CHECK: [[AVAIL:%.*]] = apply [[OSVFN]]([[MAJOR]], [[MINOR]], [[PATCH]]) : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1

test/SILGen/back_deploy_attribute_throwing_func.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// CHECK-LABEL: sil non_abi [serialized] [thunk] [available 10.51] [ossa] @$s11back_deploy12throwingFuncyyKFTwb : $@convention(thin) () -> @error Error
1616
// CHECK: bb0:
1717
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 10
18-
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 51
18+
// CHECK: [[MINOR:%.*]] = integer_literal $Builtin.Word, 52
1919
// CHECK: [[PATCH:%.*]] = integer_literal $Builtin.Word, 0
2020
// CHECK: [[OSVFN:%.*]] = function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1
2121
// CHECK: [[AVAIL:%.*]] = apply [[OSVFN]]([[MAJOR]], [[MINOR]], [[PATCH]]) : $@convention(thin) (Builtin.Word, Builtin.Word, Builtin.Word) -> Builtin.Int1

0 commit comments

Comments
 (0)