IRGen: Introduce macCatalyst target variant version check builtins.

This commit is contained in:
Allan Shortlidge
2024-07-20 11:58:20 -07:00
parent bb8a837dcf
commit e4331af916
10 changed files with 159 additions and 1 deletions

View File

@@ -786,6 +786,12 @@ BUILTIN_MISC_OPERATION(ResumeNonThrowingContinuationReturning,
/// targetOSVersionAtLeast has type (Builtin.Int32, Builtin.Int32, Builtin.Int32) -> Builtin.Int32
BUILTIN_MISC_OPERATION(TargetOSVersionAtLeast, "targetOSVersionAtLeast", "n", Special)
/// targetVariantOSVersionAtLeast has type (Builtin.Int32, Builtin.Int32, Builtin.Int32) -> Builtin.Int32
BUILTIN_MISC_OPERATION(TargetVariantOSVersionAtLeast, "targetVariantOSVersionAtLeast", "n", Special)
/// targetOSVersionOrVariantOSVersionAtLeast has type (Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32, Builtin.UInt32) -> Builtin.UInt32
BUILTIN_MISC_OPERATION(TargetOSVersionOrVariantOSVersionAtLeast, "targetOSVersionOrVariantOSVersionAtLeast", "n", Special)
/// Resume a throwing continuation normally with the given result.
BUILTIN_MISC_OPERATION(ResumeThrowingContinuationReturning,
"resumeThrowingContinuationReturning", "", Special)

View File

@@ -2151,6 +2151,21 @@ FUNCTION(PlatformVersionAtLeast, __isPlatformVersionAtLeast,
EFFECT(NoEffect),
UNKNOWN_MEMEFFECTS)
// int32 __isPlatformOrVariantPlatformVersionAtLeast(uint32_t platform1,
// uint32_t major1, uint32_t minor1, uint32_t patch1,
// uint32_t platform2, uint32_t major2, uint32_t minor2,
// uint32_t patch2);
// This is a C builtin provided by compiler-rt.
FUNCTION(TargetOSVersionOrVariantOSVersionAtLeast,
__isPlatformOrVariantPlatformVersionAtLeast,
C_CC, AlwaysAvailable,
RETURNS(Int32Ty),
ARGS(Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty,
Int32Ty),
ATTRS(NoUnwind),
EFFECT(NoEffect),
UNKNOWN_MEMEFFECTS)
FUNCTION(GetKeyPath, swift_getKeyPath, C_CC, AlwaysAvailable,
RETURNS(RefCountedPtrTy),
ARGS(Int8PtrTy, Int8PtrTy),

View File

@@ -1766,6 +1766,21 @@ static ValueDecl *getTargetOSVersionAtLeast(ASTContext &Context,
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type}, int32Type);
}
static ValueDecl *getTargetVariantOSVersionAtLeast(ASTContext &Context,
Identifier Id) {
auto int32Type = BuiltinIntegerType::get(32, Context);
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type}, int32Type);
}
static ValueDecl *
getTargetOSVersionOrVariantOSVersionAtLeast(ASTContext &Context,
Identifier Id) {
auto int32Type = BuiltinIntegerType::get(32, Context);
return getBuiltinFunction(Id, {int32Type, int32Type, int32Type,
int32Type, int32Type, int32Type},
int32Type);
}
static ValueDecl *getBuildOrdinaryTaskExecutorRef(ASTContext &ctx,
Identifier id) {
return getBuiltinFunction(ctx, id, _thin,
@@ -3162,6 +3177,12 @@ ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, Identifier Id) {
case BuiltinValueKind::TargetOSVersionAtLeast:
return getTargetOSVersionAtLeast(Context, Id);
case BuiltinValueKind::TargetVariantOSVersionAtLeast:
return getTargetVariantOSVersionAtLeast(Context, Id);
case BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast:
return getTargetOSVersionOrVariantOSVersionAtLeast(Context, Id);
case BuiltinValueKind::ConvertTaskToJob:
return getConvertTaskToJob(Context, Id);

View File

@@ -1391,6 +1391,33 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
return;
}
if (Builtin.ID == BuiltinValueKind::TargetVariantOSVersionAtLeast) {
auto major = args.claimNext();
auto minor = args.claimNext();
auto patch = args.claimNext();
auto result = IGF.emitTargetVariantOSVersionAtLeastCall(major, minor,
patch);
out.add(result);
return;
}
if (Builtin.ID ==
BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast) {
auto major1 = args.claimNext();
auto minor1 = args.claimNext();
auto patch1 = args.claimNext();
auto major2 = args.claimNext();
auto minor2 = args.claimNext();
auto patch2 = args.claimNext();
auto result = IGF.emitTargetOSVersionOrVariantOSVersionAtLeastCall(major1,
minor1, patch1, major2, minor2, patch2);
out.add(result);
return;
}
if (Builtin.ID == BuiltinValueKind::TypePtrAuthDiscriminator) {
(void)args.claimAll();
Type valueTy = substitutions.getReplacementTypes()[0];

View File

@@ -309,6 +309,39 @@ IRGenFunction::emitTargetOSVersionAtLeastCall(llvm::Value *major,
return Builder.CreateCall(fn, {platformID, major, minor, patch});
}
llvm::Value *
IRGenFunction::emitTargetVariantOSVersionAtLeastCall(llvm::Value *major,
llvm::Value *minor,
llvm::Value *patch) {
auto *fn = cast<llvm::Function>(IGM.getPlatformVersionAtLeastFn());
llvm::Value *iOSPlatformID =
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_IOS);
return Builder.CreateCall(fn->getFunctionType(), fn, {iOSPlatformID, major, minor, patch});
}
llvm::Value *
IRGenFunction::emitTargetOSVersionOrVariantOSVersionAtLeastCall(
llvm::Value *major, llvm::Value *minor, llvm::Value *patch,
llvm::Value *variantMajor, llvm::Value *variantMinor,
llvm::Value *variantPatch) {
auto *fn = cast<llvm::Function>(
IGM.getTargetOSVersionOrVariantOSVersionAtLeastFn());
llvm::Value *macOSPlatformID =
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_MACOS);
llvm::Value *iOSPlatformID =
llvm::ConstantInt::get(IGM.Int32Ty, llvm::MachO::PLATFORM_IOS);
return Builder.CreateCall(fn->getFunctionType(),
fn, {macOSPlatformID, major, minor, patch,
iOSPlatformID, variantMajor, variantMinor,
variantPatch});
}
/// Initialize a relative indirectable pointer to the given value.
/// This always leaves the value in the direct state; if it's not a
/// far reference, it's the caller's responsibility to ensure that the

View File

@@ -358,6 +358,15 @@ public:
llvm::Value *minor,
llvm::Value *patch);
llvm::Value *emitTargetVariantOSVersionAtLeastCall(llvm::Value *major,
llvm::Value *minor,
llvm::Value *patch);
llvm::Value *emitTargetOSVersionOrVariantOSVersionAtLeastCall(
llvm::Value *major, llvm::Value *minor, llvm::Value *patch,
llvm::Value *variantMajor, llvm::Value *variantMinor,
llvm::Value *variantPatch);
llvm::Value *emitProjectBoxCall(llvm::Value *box, llvm::Value *typeMetadata);
llvm::Value *emitAllocEmptyBoxCall();

View File

@@ -899,6 +899,9 @@ BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, PoundAssert)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GlobalStringTablePointer)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TypePtrAuthDiscriminator)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TargetOSVersionAtLeast)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TargetVariantOSVersionAtLeast)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse,
TargetOSVersionOrVariantOSVersionAtLeast)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GetEnumTag)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, InjectEnumTag)
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, DistributedActorAsAnyActor)

View File

@@ -602,6 +602,8 @@ CONSTANT_OWNERSHIP_BUILTIN(None, TSanInoutAccess)
CONSTANT_OWNERSHIP_BUILTIN(None, PoundAssert)
CONSTANT_OWNERSHIP_BUILTIN(None, TypePtrAuthDiscriminator)
CONSTANT_OWNERSHIP_BUILTIN(None, TargetOSVersionAtLeast)
CONSTANT_OWNERSHIP_BUILTIN(None, TargetVariantOSVersionAtLeast)
CONSTANT_OWNERSHIP_BUILTIN(None, TargetOSVersionOrVariantOSVersionAtLeast)
CONSTANT_OWNERSHIP_BUILTIN(None, GlobalStringTablePointer)
CONSTANT_OWNERSHIP_BUILTIN(None, GetCurrentAsyncTask)
CONSTANT_OWNERSHIP_BUILTIN(None, CancelAsyncTask)

View File

@@ -142,6 +142,8 @@ static bool isBarrier(SILInstruction *inst) {
case BuiltinValueKind::PoundAssert:
case BuiltinValueKind::TypePtrAuthDiscriminator:
case BuiltinValueKind::TargetOSVersionAtLeast:
case BuiltinValueKind::TargetVariantOSVersionAtLeast:
case BuiltinValueKind::TargetOSVersionOrVariantOSVersionAtLeast:
case BuiltinValueKind::GlobalStringTablePointer:
case BuiltinValueKind::COWBufferForReading:
case BuiltinValueKind::GetCurrentAsyncTask:

View File

@@ -0,0 +1,40 @@
// RUN: %target-swift-frontend %s -emit-ir | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
// The builtin is turned into a call into the compiler-rt runtime
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @"$useTargetVariantBuiltin"()
sil @$useTargetVariantBuiltin : $@convention(thin) () -> Builtin.Int32 {
bb0:
%major = integer_literal $Builtin.Int32, 13
%minor = integer_literal $Builtin.Int32, 0
%patch = integer_literal $Builtin.Int32, 0
%result = builtin "targetVariantOSVersionAtLeast" (%major: $Builtin.Int32, %minor: $Builtin.Int32, %patch: $Builtin.Int32) : $Builtin.Int32
// 2 is the platform ID for iOS (the variant OS).
// CHECK: call i32 @__isPlatformVersionAtLeast(i32 2, i32 13, i32 0, i32 0)
return %result : $Builtin.Int32
// CHECK-NEXT: ret i32
}
// This is the builtin used in zippered code.
// It is turned into a call into the compiler-rt runtime.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @"$useZipperedBuiltin"()
sil @$useZipperedBuiltin : $@convention(thin) () -> Builtin.Int32 {
bb0:
%major = integer_literal $Builtin.Int32, 10
%minor = integer_literal $Builtin.Int32, 15
%patch = integer_literal $Builtin.Int32, 1
%variantMajor = integer_literal $Builtin.Int32, 13
%variantMinor = integer_literal $Builtin.Int32, 1
%variantPatch = integer_literal $Builtin.Int32, 2
%result = builtin "targetOSVersionOrVariantOSVersionAtLeast" (%major: $Builtin.Int32, %minor: $Builtin.Int32, %patch: $Builtin.Int32, %variantMajor: $Builtin.Int32, %variantMinor: $Builtin.Int32, %variantPatch: $Builtin.Int32) : $Builtin.Int32
// 1 is the platform ID for macOS.
// 2 is the platform ID for iOS.
// CHECK: call i32 @__isPlatformOrVariantPlatformVersionAtLeast(i32 1, i32 10, i32 15, i32 1, i32 2, i32 13, i32 1, i32 2)
return %result : $Builtin.Int32
// CHECK-NEXT: ret i32
}