Skip to content

Commit e4331af

Browse files
committed
IRGen: Introduce macCatalyst target variant version check builtins.
1 parent bb8a837 commit e4331af

File tree

10 files changed

+159
-1
lines changed

10 files changed

+159
-1
lines changed

include/swift/AST/Builtins.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,12 @@ BUILTIN_MISC_OPERATION(ResumeNonThrowingContinuationReturning,
786786
/// targetOSVersionAtLeast has type (Builtin.Int32, Builtin.Int32, Builtin.Int32) -> Builtin.Int32
787787
BUILTIN_MISC_OPERATION(TargetOSVersionAtLeast, "targetOSVersionAtLeast", "n", Special)
788788

789+
/// targetVariantOSVersionAtLeast has type (Builtin.Int32, Builtin.Int32, Builtin.Int32) -> Builtin.Int32
790+
BUILTIN_MISC_OPERATION(TargetVariantOSVersionAtLeast, "targetVariantOSVersionAtLeast", "n", Special)
791+
792+
/// targetOSVersionOrVariantOSVersionAtLeast has type (Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32) -> Builtin.UInt32
793+
BUILTIN_MISC_OPERATION(TargetOSVersionOrVariantOSVersionAtLeast, "targetOSVersionOrVariantOSVersionAtLeast", "n", Special)
794+
789795
/// Resume a throwing continuation normally with the given result.
790796
BUILTIN_MISC_OPERATION(ResumeThrowingContinuationReturning,
791797
"resumeThrowingContinuationReturning", "", Special)

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2151,6 +2151,21 @@ FUNCTION(PlatformVersionAtLeast, __isPlatformVersionAtLeast,
21512151
EFFECT(NoEffect),
21522152
UNKNOWN_MEMEFFECTS)
21532153

2154+
// int32 __isPlatformOrVariantPlatformVersionAtLeast(uint32_t platform1,
2155+
// uint32_t major1, uint32_t minor1, uint32_t patch1,
2156+
// uint32_t platform2, uint32_t major2, uint32_t minor2,
2157+
// uint32_t patch2);
2158+
// This is a C builtin provided by compiler-rt.
2159+
FUNCTION(TargetOSVersionOrVariantOSVersionAtLeast,
2160+
__isPlatformOrVariantPlatformVersionAtLeast,
2161+
C_CC, AlwaysAvailable,
2162+
RETURNS(Int32Ty),
2163+
ARGS(Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty,
2164+
Int32Ty),
2165+
ATTRS(NoUnwind),
2166+
EFFECT(NoEffect),
2167+
UNKNOWN_MEMEFFECTS)
2168+
21542169
FUNCTION(GetKeyPath, swift_getKeyPath, C_CC, AlwaysAvailable,
21552170
RETURNS(RefCountedPtrTy),
21562171
ARGS(Int8PtrTy, Int8PtrTy),

lib/AST/Builtins.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,21 @@ static ValueDecl *getTargetOSVersionAtLeast(ASTContext &Context,
17661766
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type}, int32Type);
17671767
}
17681768

1769+
static ValueDecl *getTargetVariantOSVersionAtLeast(ASTContext &Context,
1770+
Identifier Id) {
1771+
auto int32Type = BuiltinIntegerType::get(32, Context);
1772+
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type}, int32Type);
1773+
}
1774+
1775+
static ValueDecl *
1776+
getTargetOSVersionOrVariantOSVersionAtLeast(ASTContext &Context,
1777+
Identifier Id) {
1778+
auto int32Type = BuiltinIntegerType::get(32, Context);
1779+
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type,
1780+
int32Type, int32Type, int32Type},
1781+
int32Type);
1782+
}
1783+
17691784
static ValueDecl *getBuildOrdinaryTaskExecutorRef(ASTContext &ctx,
17701785
Identifier id) {
17711786
return getBuiltinFunction(ctx, id, _thin,
@@ -3162,6 +3177,12 @@ ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, Identifier Id) {
31623177
case BuiltinValueKind::TargetOSVersionAtLeast:
31633178
return getTargetOSVersionAtLeast(Context, Id);
31643179

3180+
case BuiltinValueKind::TargetVariantOSVersionAtLeast:
3181+
return getTargetVariantOSVersionAtLeast(Context, Id);
3182+
3183+
case BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast:
3184+
return getTargetOSVersionOrVariantOSVersionAtLeast(Context, Id);
3185+
31653186
case BuiltinValueKind::ConvertTaskToJob:
31663187
return getConvertTaskToJob(Context, Id);
31673188

lib/IRGen/GenBuiltin.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1390,7 +1390,34 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
13901390
out.add(result);
13911391
return;
13921392
}
1393-
1393+
1394+
if (Builtin.ID == BuiltinValueKind::TargetVariantOSVersionAtLeast) {
1395+
auto major = args.claimNext();
1396+
auto minor = args.claimNext();
1397+
auto patch = args.claimNext();
1398+
auto result = IGF.emitTargetVariantOSVersionAtLeastCall(major, minor,
1399+
patch);
1400+
out.add(result);
1401+
return;
1402+
}
1403+
1404+
if (Builtin.ID ==
1405+
BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast) {
1406+
auto major1 = args.claimNext();
1407+
auto minor1 = args.claimNext();
1408+
auto patch1 = args.claimNext();
1409+
1410+
auto major2 = args.claimNext();
1411+
auto minor2 = args.claimNext();
1412+
auto patch2 = args.claimNext();
1413+
1414+
auto result = IGF.emitTargetOSVersionOrVariantOSVersionAtLeastCall(major1,
1415+
minor1, patch1, major2, minor2, patch2);
1416+
1417+
out.add(result);
1418+
return;
1419+
}
1420+
13941421
if (Builtin.ID == BuiltinValueKind::TypePtrAuthDiscriminator) {
13951422
(void)args.claimAll();
13961423
Type valueTy = substitutions.getReplacementTypes()[0];

lib/IRGen/IRGenFunction.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,39 @@ IRGenFunction::emitTargetOSVersionAtLeastCall(llvm::Value *major,
309309
return Builder.CreateCall(fn, {platformID, major, minor, patch});
310310
}
311311

312+
llvm::Value *
313+
IRGenFunction::emitTargetVariantOSVersionAtLeastCall(llvm::Value *major,
314+
llvm::Value *minor,
315+
llvm::Value *patch) {
316+
auto *fn = cast<llvm::Function>(IGM.getPlatformVersionAtLeastFn());
317+
318+
llvm::Value *iOSPlatformID =
319+
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_IOS);
320+
return Builder.CreateCall(fn->getFunctionType(), fn, {iOSPlatformID, major, minor, patch});
321+
}
322+
323+
llvm::Value *
324+
IRGenFunction::emitTargetOSVersionOrVariantOSVersionAtLeastCall(
325+
llvm::Value *major, llvm::Value *minor, llvm::Value *patch,
326+
llvm::Value *variantMajor, llvm::Value *variantMinor,
327+
llvm::Value *variantPatch) {
328+
auto *fn = cast<llvm::Function>(
329+
IGM.getTargetOSVersionOrVariantOSVersionAtLeastFn());
330+
331+
llvm::Value *macOSPlatformID =
332+
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_MACOS);
333+
334+
llvm::Value *iOSPlatformID =
335+
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_IOS);
336+
337+
return Builder.CreateCall(fn->getFunctionType(),
338+
fn, {macOSPlatformID, major, minor, patch,
339+
iOSPlatformID, variantMajor, variantMinor,
340+
variantPatch});
341+
}
342+
343+
344+
312345
/// Initialize a relative indirectable pointer to the given value.
313346
/// This always leaves the value in the direct state; if it's not a
314347
/// far reference, it's the caller's responsibility to ensure that the

lib/IRGen/IRGenFunction.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,15 @@ class IRGenFunction {
358358
llvm::Value *minor,
359359
llvm::Value *patch);
360360

361+
llvm::Value *emitTargetVariantOSVersionAtLeastCall(llvm::Value *major,
362+
llvm::Value *minor,
363+
llvm::Value *patch);
364+
365+
llvm::Value *emitTargetOSVersionOrVariantOSVersionAtLeastCall(
366+
llvm::Value *major, llvm::Value *minor, llvm::Value *patch,
367+
llvm::Value *variantMajor, llvm::Value *variantMinor,
368+
llvm::Value *variantPatch);
369+
361370
llvm::Value *emitProjectBoxCall(llvm::Value *box, llvm::Value *typeMetadata);
362371

363372
llvm::Value *emitAllocEmptyBoxCall();

lib/SIL/IR/OperandOwnership.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,9 @@ BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, PoundAssert)
899899
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GlobalStringTablePointer)
900900
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TypePtrAuthDiscriminator)
901901
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TargetOSVersionAtLeast)
902+
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TargetVariantOSVersionAtLeast)
903+
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse,
904+
TargetOSVersionOrVariantOSVersionAtLeast)
902905
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GetEnumTag)
903906
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, InjectEnumTag)
904907
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, DistributedActorAsAnyActor)

lib/SIL/IR/ValueOwnership.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ CONSTANT_OWNERSHIP_BUILTIN(None, TSanInoutAccess)
602602
CONSTANT_OWNERSHIP_BUILTIN(None, PoundAssert)
603603
CONSTANT_OWNERSHIP_BUILTIN(None, TypePtrAuthDiscriminator)
604604
CONSTANT_OWNERSHIP_BUILTIN(None, TargetOSVersionAtLeast)
605+
CONSTANT_OWNERSHIP_BUILTIN(None, TargetVariantOSVersionAtLeast)
606+
CONSTANT_OWNERSHIP_BUILTIN(None, TargetOSVersionOrVariantOSVersionAtLeast)
605607
CONSTANT_OWNERSHIP_BUILTIN(None, GlobalStringTablePointer)
606608
CONSTANT_OWNERSHIP_BUILTIN(None, GetCurrentAsyncTask)
607609
CONSTANT_OWNERSHIP_BUILTIN(None, CancelAsyncTask)

lib/SILOptimizer/Transforms/AccessEnforcementReleaseSinking.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ static bool isBarrier(SILInstruction *inst) {
142142
case BuiltinValueKind::PoundAssert:
143143
case BuiltinValueKind::TypePtrAuthDiscriminator:
144144
case BuiltinValueKind::TargetOSVersionAtLeast:
145+
case BuiltinValueKind::TargetVariantOSVersionAtLeast:
146+
case BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast:
145147
case BuiltinValueKind::GlobalStringTablePointer:
146148
case BuiltinValueKind::COWBufferForReading:
147149
case BuiltinValueKind::GetCurrentAsyncTask:
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %target-swift-frontend %s -emit-ir | %FileCheck %s
2+
3+
sil_stage canonical
4+
5+
import Builtin
6+
import Swift
7+
8+
// The builtin is turned into a call into the compiler-rt runtime
9+
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @"$useTargetVariantBuiltin"()
10+
sil @$useTargetVariantBuiltin : $@convention(thin) () -> Builtin.Int32 {
11+
bb0:
12+
%major = integer_literal $Builtin.Int32, 13
13+
%minor = integer_literal $Builtin.Int32, 0
14+
%patch = integer_literal $Builtin.Int32, 0
15+
%result = builtin "targetVariantOSVersionAtLeast" (%major: $Builtin.Int32, %minor: $Builtin.Int32, %patch: $Builtin.Int32) : $Builtin.Int32
16+
// 2 is the platform ID for iOS (the variant OS).
17+
// CHECK: call i32 @__isPlatformVersionAtLeast(i32 2, i32 13, i32 0, i32 0)
18+
return %result : $Builtin.Int32
19+
// CHECK-NEXT: ret i32
20+
}
21+
22+
// This is the builtin used in zippered code.
23+
// It is turned into a call into the compiler-rt runtime.
24+
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @"$useZipperedBuiltin"()
25+
sil @$useZipperedBuiltin : $@convention(thin) () -> Builtin.Int32 {
26+
bb0:
27+
%major = integer_literal $Builtin.Int32, 10
28+
%minor = integer_literal $Builtin.Int32, 15
29+
%patch = integer_literal $Builtin.Int32, 1
30+
%variantMajor = integer_literal $Builtin.Int32, 13
31+
%variantMinor = integer_literal $Builtin.Int32, 1
32+
%variantPatch = integer_literal $Builtin.Int32, 2
33+
%result = builtin "targetOSVersionOrVariantOSVersionAtLeast" (%major: $Builtin.Int32, %minor: $Builtin.Int32, %patch: $Builtin.Int32, %variantMajor: $Builtin.Int32, %variantMinor: $Builtin.Int32, %variantPatch: $Builtin.Int32) : $Builtin.Int32
34+
// 1 is the platform ID for macOS.
35+
// 2 is the platform ID for iOS.
36+
// CHECK: call i32 @__isPlatformOrVariantPlatformVersionAtLeast(i32 1, i32 10, i32 15, i32 1, i32 2, i32 13, i32 1, i32 2)
37+
return %result : $Builtin.Int32
38+
// CHECK-NEXT: ret i32
39+
}
40+

0 commit comments

Comments
 (0)