mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
IRGen: Introduce macCatalyst target variant version check builtins.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
40
test/IRGen/availability_version_check_maccatalyst.sil
Normal file
40
test/IRGen/availability_version_check_maccatalyst.sil
Normal 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user