[IRGen] Upstream test changes for pointer authenticated value witness tables

The original change was done by Arnold Schwaighofer.
This commit is contained in:
Egor Zhdan
2024-07-02 18:35:12 +01:00
parent 3ccbcfe8cd
commit 91bef8448a
18 changed files with 208 additions and 45 deletions

View File

@@ -26,7 +26,8 @@ entry(%x : $*T):
// CHECK: [[ADDR:%.*]] = extractvalue { ptr, ptr } [[BOX_PAIR]], 1
%b = alloc_existential_box $Error, $T
%p = project_existential_box $T in %b : $Error
// CHECK: [[INITWITHTAKE:%.*]] = load ptr, ptr %5
// CHECK: load ptr, ptr
// CHECK: [[INITWITHTAKE:%.*]] = load ptr, ptr
// CHECK: call ptr [[INITWITHTAKE]](ptr noalias [[ADDR]], ptr noalias %0, ptr %T)
copy_addr [take] %x to [init] %p : $*T
// CHECK: ret ptr [[BOX]]

View File

@@ -1,6 +1,6 @@
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// CHECK: @"$s10empty_enum6JamaisOMf" =
// CHECK-SAME: {{@"\$sytWV"|ptr @"\$s10empty_enum6JamaisOWV"}}
// CHECK-SAME: {{@"\$sytWV(.ptrauth)?"|ptr @"\$s10empty_enum6JamaisOWV"}}
enum Jamais {}

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -disable-type-layout %s -gnone -emit-ir -I %S/Inputs | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -disable-type-layout %s -gnone -emit-ir -I %S/Inputs | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize --check-prefix=CHECK-%target-cpu
import Builtin
@@ -432,6 +432,9 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
// CHECK-NEXT: br i1 [[T_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]]
// CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
// CHECK-NEXT: store ptr [[LAYOUT]], {{.*}} [[BUF0]]
@@ -443,6 +446,9 @@ entry(%a : $*EitherOr<T, C>, %b : $*EitherOr<T, C>):
// CHECK-NEXT: br i1 [[U_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[U_CHECKED]]
// CHECK-NEXT: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
// CHECK-NEXT: store ptr [[LAYOUT]], {{.*}} [[BUF1]]

View File

@@ -79,6 +79,9 @@ public func functionWithResilientEnum(_ m: Medium) -> Medium {
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// This is copying the +0 argument to be used as a return value.
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK-NEXT: [[WITNESS_FN:%.*]] = load ptr, ptr [[WITNESS_ADDR]]
@@ -97,6 +100,9 @@ public func functionWithIndirectResilientEnum(_ ia: IndirectApproach) -> Indirec
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// This is copying the +0 argument into the return slot.
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK-NEXT: [[WITNESS_FN:%.*]] = load ptr, ptr [[WITNESS_ADDR]]
@@ -115,6 +121,9 @@ public func constructResilientEnumNoPayload() -> Medium {
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-16-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 16
// CHECK-32-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 14
@@ -134,6 +143,9 @@ public func constructResilientEnumPayload(_ s: Size) -> Medium {
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK-NEXT: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_ADDR]]
@@ -146,6 +158,9 @@ public func constructResilientEnumPayload(_ s: Size) -> Medium {
// CHECK-NEXT: [[METADATA2:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[VWT_ADDR2:%.*]] = getelementptr inbounds ptr, ptr [[METADATA2]], [[INT]] -1
// CHECK-NEXT: [[VWT2:%.*]] = load ptr, ptr [[VWT_ADDR2]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR2]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT2:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-16-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT2]], i32 16
// CHECK-32-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT2]], i32 14
@@ -165,6 +180,9 @@ public func constructResilientEnumPayload(_ s: Size) -> Medium {
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[WITNESS_FOR_SIZE:%size]] = load [[INT]], ptr [[WITNESS_ADDR]]
@@ -228,14 +246,18 @@ public func resilientSwitchTest(_ m: Medium) -> Int {
public func reabstraction<T>(_ f: (Medium) -> T) {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s15enum_resilience25resilientEnumPartialApplyyySi0c1_A06MediumOXEF"(ptr %0, ptr %1)
public func resilientEnumPartialApply(_ f: (Medium) -> Int) {
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s15enum_resilience25resilientEnumPartialApplyyySi0c1_A06MediumOXEF"(ptr %0, ptr %1)
// CHECK-64: [[STACKALLOC:%.*]] = alloca i8
// CHECK-64: call swiftcc void @"$s15enum_resilience13reabstractionyyx010resilient_A06MediumOXElF"(ptr @"$s14resilient_enum6MediumOSiIgnd_ACSiIegnr_TRTA{{(\.ptrauth)?}}", ptr [[CONTEXT:%.*]], ptr @"$sSiN")
// CHECK-64: ret void
// CHECK: [[STACKALLOC:%.*]] = alloca i8
// CHECK: call swiftcc void @"$s15enum_resilience13reabstractionyyx010resilient_A06MediumOXElF"(ptr @"$s14resilient_enum6MediumOSiIgnd_ACSiIegnr_TRTA{{(\.ptrauth)?}}", ptr [[CONTEXT:%.*]], ptr @"$sSiN")
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s15enum_resilience25resilientEnumPartialApplyyySi0c1_A06MediumOXEF"(ptr %0, ptr %1)
// CHECK-32: [[STACKALLOC:%.*]] = alloca i8
// CHECK-32: call swiftcc void @"$s15enum_resilience13reabstractionyyx010resilient_A06MediumOXElF"(ptr @"$s14resilient_enum6MediumOSiIgnd_ACSiIegnr_TRTA", ptr [[CONTEXT:%.*]], ptr @"$sSiN")
// CHECK-32: ret void
public func resilientEnumPartialApply(_ f: (Medium) -> Int) {
reabstraction(f)
// CHECK: ret void
}
// CHECK-LABEL: define internal swiftcc void @"$s14resilient_enum6MediumOSiIgnd_ACSiIegnr_TRTA"(ptr noalias nocapture sret({{.*}}) %0, ptr noalias %1, ptr swiftself %2)
@@ -268,7 +290,7 @@ public func getResilientEnumType() -> Any.Type {
// CHECK-NEXT: br i1 [[COND]], label %cacheIsNull, label %cont
// CHECK: cacheIsNull:
// CHECK-NEXT: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @swift_getSingletonMetadata([[INT]] %0, ptr @"$s15enum_resilience24EnumWithResilientPayloadOMn")
// CHECK-NEXT: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @swift_getSingletonMetadata([[INT]] %0, ptr @"$s15enum_resilience24EnumWithResilientPayloadOMn{{(\.ptrauth.*)?}}")
// CHECK-NEXT: [[RESPONSE_METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
// CHECK-NEXT: [[RESPONSE_STATE:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 1
// CHECK-NEXT: br label %cont
@@ -307,9 +329,12 @@ public func constructExhaustiveWithResilientMembers() -> SimpleShape {
return .KleinBottle
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i{{64|32}}, i8 } @"$s15enum_resilience19constructFullyFixed010resilient_A00dE6LayoutOyF"()
// CHECK: ret { [[INT]], i8 } { [[INT]] 0, i8 1 }
// CHECK-NEXT: {{^}$}}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i{{64|32}}, i8 } @"$s15enum_resilience19constructFullyFixed010resilient_A00dE6LayoutOyF"()
// CHECK-64: ret { [[INT]], i8 } { [[INT]] 0, i8 1 }
// CHECK-64-NEXT: {{^}$}}
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i{{64|32}}, i8 } @"$s15enum_resilience19constructFullyFixed010resilient_A00dE6LayoutOyF"()
// CHECK-32: ret { [[INT]], i8 } { [[INT]] 0, i8 1 }
// CHECK-32-NEXT: {{^}$}}
public func constructFullyFixed() -> FullyFixedLayout {
return .noPayload
}
@@ -324,6 +349,9 @@ public func constructFullyFixed() -> FullyFixedLayout {
// CHECK: [[SATISFIED1]]:
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[SIZE_METADATA]], [[INT]] -1
// CHECK-NEXT: [[SIZE_VWT:%.*]] = load ptr, ptr [[T1]],
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[SIZE_VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[SIZE_LAYOUT_1:%.*]] = getelementptr inbounds ptr, ptr [[SIZE_VWT]], i32 8
// CHECK-NEXT: store ptr [[SIZE_LAYOUT_1]],
// CHECK-NEXT: getelementptr

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -disable-type-layout %s -emit-ir | %FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -disable-type-layout %s -emit-ir | %FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize --check-prefix=CHECK-%target-cpu
sil_stage canonical
@@ -50,6 +50,9 @@ entry(%0 : $*T):
// CHECK: [[METATYPE:%.*]] = load ptr, ptr [[METATYPE_ADDR]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METATYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -61,11 +64,17 @@ entry(%0 : $*T):
// CHECK: ret ptr [[EXISTENTIAL_BUFFER]]
//
// CHECK:allocateBox:
// CHECK: [[CALL:%.*]] = call swiftcc { ptr, ptr } @swift_allocBox(ptr [[METATYPE]])
// CHECK: [[BOX:%.*]] = extractvalue { ptr, ptr } [[CALL]], 0
// CHECK: [[ADDR:%.*]] = extractvalue { ptr, ptr } [[CALL]], 1
// CHECK: store ptr [[BOX]], ptr [[EXISTENTIAL_BUFFER]]
// CHECK: ret ptr [[ADDR]]
// CHECK-64: [[CALL:%.*]] = call swiftcc { ptr, ptr } @swift_allocBox(ptr [[METATYPE]])
// CHECK-64: [[BOX:%.*]] = extractvalue { ptr, ptr } [[CALL]], 0
// CHECK-64: [[ADDR:%.*]] = extractvalue { ptr, ptr } [[CALL]], 1
// CHECK-64: store ptr [[BOX]], ptr [[EXISTENTIAL_BUFFER]]
// CHECK-64: ret ptr [[ADDR]]
//
// CHECK-32: [[CALL:%.*]] = call swiftcc { ptr, ptr } @swift_allocBox(ptr [[METATYPE]])
// CHECK-32: [[BOX:%.*]] = extractvalue { ptr, ptr } [[CALL]], 0
// CHECK-32: [[ADDR:%.*]] = extractvalue { ptr, ptr } [[CALL]], 1
// CHECK-32: store ptr [[BOX]], ptr [[EXISTENTIAL_BUFFER]]
// CHECK-32: ret ptr [[ADDR]]
// CHECK-LABEL: define {{.*}} @test_init_existential_fixed
// CHECK: [[CONTAINER:%.*]] = alloca %T25existentials_opaque_boxed11ExistentialP
@@ -143,6 +152,9 @@ entry:
// CHECK: [[META:%.*]] = load ptr, ptr [[META_ADDR]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %2, {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -157,6 +169,9 @@ entry:
// CHECK: [[REFERENCE:%.*]] = load ptr, ptr [[BUFFER]]
// CHECK: [[VWT_ADDR2:%.*]] = getelementptr inbounds ptr, ptr [[META]], {{(i64|i32)}} -1
// CHECK: [[VWT2:%.*]] = load ptr, ptr [[VWT_ADDR2]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR2]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT2:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[SIZE2_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT2]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE2_ADDR]]
// CHECK-64:[[T0:%.*]] = zext i32 [[FLAGS]] to i64
@@ -189,6 +204,9 @@ bb0(%0 : $*Existential):
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden ptr @__swift_project_boxed_opaque_existential_1(ptr %0, ptr %1)
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %1, {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -208,7 +226,7 @@ bb0(%0 : $*Existential):
// CHECK: [[HEADERSIZEPLUSALIGN:%.*]] = add {{(i64 16|i32 8)}}, [[ALIGNMASK]]
// CHECK: [[NOTALIGNMASK:%.*]] = xor {{(i64|i32)}} [[ALIGNMASK]], -1
// CHECK: [[ALIGNEDSTART:%.*]] = and {{(i64|i32)}} [[HEADERSIZEPLUSALIGN]], [[NOTALIGNMASK]]
// CHECK: [[STARTOFVALUE:%.*]] = getelementptr inbounds i8, ptr %5, {{(i64|i32)}} [[ALIGNEDSTART]]
// CHECK: [[STARTOFVALUE:%.*]] = getelementptr inbounds i8, ptr [[REF]], {{(i64|i32)}} [[ALIGNEDSTART]]
// CHECK: ret ptr [[STARTOFVALUE]]
@@ -229,6 +247,9 @@ bb0(%0 : $*Existential):
// CHECK: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden ptr @__swift_mutable_project_boxed_opaque_existential_1(ptr %0, ptr %1)
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %1, {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -244,9 +265,10 @@ bb0(%0 : $*Existential):
// CHECK-32:[[ALIGNMASK:%.*]] = and i32 [[FLAGS]], 255
// CHECK-16:[[T0:%.*]] = trunc i32 [[FLAGS]] to i16
// CHECK-16:[[ALIGNMASK:%.*]] = and i16 [[T0]], 255
// CHECK: [[REFANDADDR:%.*]] = call swiftcc { ptr, ptr } @swift_makeBoxUnique(ptr %0, ptr %1, {{(i64|i32)}} [[ALIGNMASK]])
// CHECK: [[REF:%.*]] = extractvalue { ptr, ptr } [[REFANDADDR]], 0
// CHECK: [[ADDR:%.*]] = extractvalue { ptr, ptr } [[REFANDADDR]], 1
// CHECK-64: [[REFANDADDR:%.*]] = call swiftcc { ptr, ptr } @swift_makeBoxUnique(ptr %0, ptr %1, {{(i64|i32)}} [[ALIGNMASK]])
// CHECK-32: [[REFANDADDR:%.*]] = call swiftcc { ptr, ptr } @swift_makeBoxUnique(ptr %0, ptr %1, {{(i64|i32)}} [[ALIGNMASK]])
// CHECK: [[REF:%.*]] = extractvalue {{.*}}{ ptr, ptr }{{.*}} [[REFANDADDR]], 0
// CHECK: [[ADDR:%.*]] = extractvalue {{.*}}{ ptr, ptr }{{.*}} [[REFANDADDR]], 1
// CHECK: ret ptr [[ADDR]]
@@ -273,6 +295,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: [[BUFFER_ADDR:%.*]] = getelementptr inbounds %__opaque_existential_type_1, ptr %0, i32 0, i32 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -282,6 +307,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: inline:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 1
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call void [[VW]](ptr noalias [[BUFFER_ADDR]], ptr [[METADATA]])
@@ -333,6 +361,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: match:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[DEST_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -342,6 +373,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: match-inline:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[DEST_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 3
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call ptr [[VW]](ptr [[DEST_BUFFERADDR]], ptr [[SRC_BUFFERADDR]], ptr [[DEST_TYPE]])
@@ -363,12 +397,18 @@ bb0(%0 : $*OtherExistential):
// CHECK: store ptr [[SRC_PTW]], ptr [[DEST_PWT_ADDR]]
// CHECK: [[DEST_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[DEST_TYPE]], {{(i64|i32)}} -1
// CHECK: [[DEST_VWT:%.*]] = load ptr, ptr [[DEST_VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[DEST_VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[DEST_VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[DEST_FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[DEST_VWT]], i32 0, i32 10
// CHECK: [[DEST_FLAGS:%.*]] = load i32, ptr [[DEST_FLAGS_ADDR]]
// CHECK: [[DEST_ISNOTINLINE:%.*]] = and i32 [[DEST_FLAGS]], 131072
// CHECK: [[DEST_ISINLINE:%.*]] = icmp eq i32 [[DEST_ISNOTINLINE]], 0
// CHECK: [[SRC_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[SRC_TYPE]], {{(i64|i32)}} -1
// CHECK: [[SRC_VWT:%.*]] = load ptr, ptr [[SRC_VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[SRC_VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[SRC_VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[SRC_FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[SRC_VWT]], i32 0, i32 10
// CHECK: [[SRC_FLAGS:%.*]] = load i32, ptr [[SRC_FLAGS_ADDR]]
// CHECK: [[SRC_ISNOTINLINE:%.*]] = and i32 [[SRC_FLAGS]], 131072
@@ -378,6 +418,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: dest-inline:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[DEST_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 4
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call ptr [[VW]](ptr noalias [[TMPBUFFER]], ptr noalias [[DEST_BUFFERADDR]], ptr [[DEST_TYPE]])
@@ -386,6 +429,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: dest-inline-src-inline:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[SRC_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call ptr [[VW]](ptr noalias [[DEST_BUFFERADDR]], ptr noalias [[SRC_BUFFERADDR]], ptr [[SRC_TYPE]])
@@ -400,6 +446,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: dest-inline-cont:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[DEST_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 1
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call void [[VW]](ptr noalias [[TMPBUFFER]], ptr [[DEST_TYPE]])
@@ -412,6 +461,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: dest-outline-src-inline:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[SRC_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK: [[VW:%.*]] = load ptr, ptr [[VW_ADDR]]
// CHECK: call ptr [[VW]](ptr noalias [[DEST_BUFFERADDR]], ptr noalias [[SRC_BUFFERADDR]], ptr [[SRC_TYPE]])
@@ -496,6 +548,9 @@ bb0(%0 : $*OtherExistential):
// CHECK: [[BUFFER_LOCAL_ADDR:%.*]] = getelementptr inbounds %T25existentials_opaque_boxed11ExistentialP, ptr %1, i32 0, i32 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[ARG_TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[VW:%.*]] = load ptr, ptr [[VWT]]
// CHECK: call ptr [[VW]]({{.*}} noalias [[BUFFER_LOCAL_ADDR]], {{.*}} noalias [[BUFFER_ARG_ADDR]], ptr [[ARG_TYPE]])
// CHECK: ret ptr %1

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
import Builtin
@@ -10,6 +10,9 @@ protocol P {}
// CHECK: call {{.*}} @__swift_project_boxed_opaque_existential_1
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[TYPE]], {{(i64|i32)}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], {{(i64|i32)}} 2
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_ADDR]]
// CHECK: call ptr [[WITNESS]](

View File

@@ -16,7 +16,7 @@ import c_layout
// CHECK-SAME: @"$sSo14HasNestedUnionVMa"
// CHECK-LABEL: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVMf" = linkonce_odr hidden constant
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVWV"
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVWV{{(\.ptrauth)?}}"
// CHECK-SAME: [[INT]] 512,
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVMn{{(\.ptrauth)?}}"
// CHECK-SAME: i32 0,

View File

@@ -21,7 +21,7 @@ import c_layout
// CHECK-SAME: @"$sSo14HasNestedUnionVMa"
// CHECK-LABEL: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVMf" = linkonce_odr hidden constant
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVWV"
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVWV{{(\.ptrauth)?}}"
// CHECK-SAME: [[INT]] 512,
// CHECK-SAME: @"$sSo14HasNestedUnionV18__Unnamed_struct_sVMn
// CHECK-SAME: i32 0,

View File

@@ -1,7 +1,7 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend %S/../Inputs/resilient_struct.swift -enable-library-evolution -emit-module -emit-module-path %t/resilient_struct.swiftmodule
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -enable-library-evolution -I %t -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -enable-library-evolution -I %t -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -enable-library-evolution -I %t -emit-ir -O %s
// CHECK: %swift.type = type { [[INT:i32|i64]] }
@@ -123,6 +123,9 @@ bb0:
// CHECK: entry:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %0, {{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072
@@ -132,6 +135,9 @@ bb0:
// CHECK: outline.allocateValueInBuffer:
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %0, {{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
// CHECK: [[ALIGN:%.*]] = and {{.*}}, 255
@@ -147,6 +153,9 @@ bb0:
// CHECK-LABEL: define linkonce_odr hidden ptr @__swift_project_value_buffer(ptr %0, ptr %1)
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %0, {{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[FLAGS:%.*]] = load i32, ptr [[FLAGS_ADDR]]
// CHECK: [[ISNOTINLINE:%.*]] = and i32 [[FLAGS]], 131072

View File

@@ -16,8 +16,11 @@ bb0(%x : $*T):
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @generic(ptr noalias %0, ptr %T) {{.*}} {
// Allocate it.
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK-NEXT: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
// CHECK-NEXT: [[Y_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16
@@ -53,8 +56,11 @@ bb0(%x : $*T):
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @generic_with_reuse(ptr noalias %0, ptr %T) {{.*}} {
// Allocate it.
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK-NEXT: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
// CHECK-NEXT: [[Y_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16

View File

@@ -5,12 +5,12 @@
// RUN: -emit-module-path=%t/resilient_struct.swiftmodule \
// RUN: -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -module-name main -I %t -emit-ir -primary-file %s %S/Inputs/OtherModule.swift | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -module-name main -I %t -emit-ir -primary-file %s %S/Inputs/OtherModule.swift | %FileCheck %s -DINT=i%target-ptrsize --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
// Check that we correctly handle resilience when parsing as SIL + SIB.
// RUN: %target-swift-frontend -emit-sib -module-name main %S/Inputs/OtherModule.swift -I %t -o %t/other.sib
// RUN: %target-swift-frontend -emit-silgen -module-name main -primary-file %s %S/Inputs/OtherModule.swift -I %t -o %t/main.sil
// RUN: %target-swift-frontend -emit-ir -module-name main -primary-file %t/main.sil %t/other.sib -I %t | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-ir -module-name main -primary-file %t/main.sil %t/other.sib -I %t | %FileCheck %s -DINT=i%target-ptrsize --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
// This is a single-module version of the test case in
// multi_module_resilience.
@@ -20,6 +20,8 @@
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s4main3FooVMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-arm64e: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// Allocate 'copy'.
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]

View File

@@ -9,7 +9,7 @@
// RUN: -emit-module-path=%t/OtherModule.swiftmodule \
// RUN: -module-name=OtherModule %S/Inputs/OtherModule.swift
// RUN: %target-swift-frontend -module-name main -I %t -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -module-name main -I %t -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
// rdar://39763787
@@ -19,6 +19,8 @@ import OtherModule
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s11OtherModule3FooVMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-arm64e: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// Allocate 'copy'.
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
@@ -38,6 +40,8 @@ public func copyFoo(foo: Foo) -> Foo {
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s11OtherModule3BarVMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-arm64e: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// Allocate 'copy'.
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]

View File

@@ -6,9 +6,11 @@ sil_stage raw
// CHECK: define hidden swiftcc void @f010_irgen_identity(ptr noalias sret({{.*}}) %0, ptr noalias %1, ptr %T)
// CHECK: entry:
// CHECK-arm64e: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: call i64 @llvm.ptrauth.auth
// CHECK-NOT: call
// CHECK-NOT: call
// CHECK: [[InitializeWithTake_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T.valueWitnesses
// CHECK: [[InitializeWithTake_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{.*}}, {{(i32|i64)}} 4
// CHECK: [[InitializeWithTake:%.*]] = load ptr, ptr [[InitializeWithTake_ADDR]]
// CHECK-arm64e: call i64 @llvm.ptrauth.blend
// CHECK: %{{.*}} = call ptr [[InitializeWithTake]](ptr noalias %0, ptr noalias %1, ptr %T)

View File

@@ -1,7 +1,7 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_enum.swiftmodule -module-name=resilient_enum -I %t %S/../Inputs/resilient_enum.swift
// RUN: %target-swift-frontend -module-name struct_resilience -Xllvm -sil-disable-pass=MandatoryARCOpts -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s
// RUN: %target-swift-frontend -module-name struct_resilience -Xllvm -sil-disable-pass=MandatoryARCOpts -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
// RUN: %target-swift-frontend -module-name struct_resilience -I %t -emit-ir -enable-library-evolution -O %s
import resilient_struct
@@ -22,6 +22,9 @@ public func functionWithResilientTypesSize(_ s: __owned Size, f: (__owned Size)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[WITNESS_FOR_SIZE:%.*]] = load [[INT]], ptr [[WITNESS_ADDR]]
@@ -201,6 +204,9 @@ public func memoryLayoutDotSizeWithResilientStruct() -> Int {
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[WITNESS_FOR_SIZE:%.*]] = load [[INT]], ptr [[WITNESS_ADDR]]
@@ -216,6 +222,9 @@ public func memoryLayoutDotStrideWithResilientStruct() -> Int {
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 9
// CHECK: [[WITNESS_FOR_STRIDE:%.*]] = load [[INT]], ptr [[WITNESS_ADDR]]
@@ -231,6 +240,9 @@ public func memoryLayoutDotAlignmentWithResilientStruct() -> Int {
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[INT]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 10
// CHECK: [[WITNESS_FOR_FLAGS:%.*]] = load i32, ptr [[WITNESS_ADDR]]
@@ -282,6 +294,9 @@ public func memoryLayoutDotOffsetOfWithResilientStruct() -> Int? {
// CHECK: [[SIZE_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[SIZE_METADATA]], [[INT]] -1
// CHECK: [[SIZE_VWT:%.*]] = load ptr, ptr [[T1]],
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[SIZE_VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[SIZE_LAYOUT_1:%.*]] = getelementptr inbounds ptr, ptr [[SIZE_VWT]], i32 8
// CHECK: [[FIELD_1:%.*]] = getelementptr inbounds ptr, ptr [[FIELDS_ADDR]], i32 0
// CHECK: store ptr [[SIZE_LAYOUT_1:%.*]], ptr [[FIELD_1]]

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize --check-prefix=CHECK-%target-cpu
class C {}
@@ -37,6 +37,9 @@ struct TypeLayoutTest<T> {
// CHECK: br i1 [[T_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], {{i32|i64}} -1
// CHECK: [[T_VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[T_VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VALUE_WITNESSES]], i32 8
// CHECK: store ptr [[T_LAYOUT]]
var z: T
@@ -73,6 +76,9 @@ struct TypeLayoutTest<T> {
// CHECK: br i1 [[METADATA_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], {{i32|i64}} -1
// CHECK: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
// CHECK: store ptr [[LAYOUT]]
var j: GMult<T>

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize --check-prefix=CHECK-%target-cpu
// REQUIRES: objc_interop
import Foundation
@@ -32,6 +32,9 @@ struct TypeLayoutTest<T> {
// CHECK: br i1 [[T_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], {{i32|i64}} -1
// CHECK: [[T_VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[T_VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VALUE_WITNESSES]], i32 8
// CHECK: store ptr [[T_LAYOUT]]
var z: T
@@ -71,6 +74,9 @@ struct TypeLayoutTest<T> {
// CHECK: br i1 [[METADATA_OK]],
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], {{i32|i64}} -1
// CHECK: [[VALUE_WITNESSES:%.*]] = load ptr, ptr [[T1]]
// CHECK-arm64e-NEXT: ptrtoint ptr [[T1]] to i64
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
// CHECK-arm64e: [[VALUE_WITNESSES:%.*]] = inttoptr i64 {{%.*}} to ptr
// CHECK: [[LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[VALUE_WITNESSES]], i32 8
// CHECK: store ptr [[LAYOUT]]
var j: GMult<T>

View File

@@ -1,5 +1,5 @@
// RUN: %target-swift-frontend -enable-type-layout -primary-file %s -emit-ir | %FileCheck %s --check-prefix=CHECK
// RUN: %target-swift-frontend -enable-type-layout -primary-file %s -O -emit-ir | %FileCheck %s --check-prefix=OPT --check-prefix=OPT-%target-ptrsize
// RUN: %target-swift-frontend -enable-type-layout -primary-file %s -O -emit-ir | %FileCheck %s --check-prefix=OPT --check-prefix=OPT-%target-ptrsize --check-prefix=OPT-%target-ptrauth
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s --check-prefix=NOTL
public struct B<T> {
@@ -83,15 +83,35 @@ public enum ForwardEnum<T> {
// OPT: [[T_PARAM:%.*]] = getelementptr inbounds ptr, ptr %"A<T>", {{(i64|i32)}} 2
// OPT: [[T:%.*]] = load ptr, ptr [[T_PARAM]]
// OPT: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[T]], {{(i64|i32)}} -1
// OPT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// OPT-noptrauth: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// OPT-ptrauth: [[ADDR_INT:%.*]] = ptrtoint ptr [[VWT_ADDR]] to i64
// OPT-ptrauth: [[DISCRIMINANT:%.*]] = tail call i64 @llvm.ptrauth.blend(i64 [[ADDR_INT]], i64 11839)
// OPT-ptrauth: [[SIGNED_VWT:%.*]] = ptrtoint ptr %T.valueWitnesses
// OPT-ptrauth: [[VWT_INT:%.*]] = tail call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT]], i32 2, i64 [[DISCRIMINANT]])
// OPT-ptrauth: [[VWT:%.*]] = inttoptr i64 [[VWT_INT]] to ptr
// OPT: [[DESTROY_VW:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], {{(i64|i32)}} 1
// OPT: [[DESTROY:%.*]] = load ptr, ptr [[DESTROY_VW]]
// OPT-ptrauth: [[DESTROY_ADDR:%.*]] = ptrtoint ptr [[DESTROY_VW]] to i64
// OPT-ptrauth: [[DISCRIMINANT:%.*]] = tail call i64 @llvm.ptrauth.blend(i64 [[DESTROY_ADDR]], i64 1272)
// OPT: tail call void [[DESTROY]](ptr noalias %object, ptr [[T]])
// OPT: [[SIZE_VW:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], {{i64|i32}} 0, {{(i64|i32)}} 8
// OPT-noptrauth: [[SIZE_VW:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], {{(i64|i32)}} 0, {{(i64|i32)}} 8
// OPT-ptrauth: [[SIZE_VW:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i64 0, i32 8
// OPT: [[SIZE_T:%.*]] = load {{(i64|i32)}}, ptr [[SIZE_VW]]
// OPT: [[OBJECT:%.*]] = ptrtoint ptr %object to {{(i64|i32)}}
// OPT: [[FLAGS_VW:%.*]] = getelementptr inbounds {{.*}}, ptr [[VWT]], {{i64|i32}} 0, {{(i64|i32)}} 10
// OPT: [[FLAGS3:%.*]] = load i32, ptr [[FLAGS_VW]]
// OPT-noptrauth: [[OBJECT:%.*]] = ptrtoint ptr %object to {{(i64|i32)}}
// OPT-ptrauth: [[OBJECT:%.*]] = ptrtoint ptr %object to {{(i64|i32)}}
// OPT-noptrauth: [[FLAGS2:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], {{(i64|i32)}} 0, {{(i64|i32)}} 10
// OPT-ptrauth: [[FLAGS2:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i64 0, {{(i64|i32)}} 10
// OPT: [[FLAGS3:%.*]] = load i32, ptr [[FLAGS2]]
// OPT: [[FLAGS:%.*]] = and i32 [[FLAGS3]], 255
// OPT-64: %flags.alignmentMask = zext i32 [[FLAGS]] to i64
// OPT-64: [[TMP:%.*]] = add {{(i64|i32)}} [[SIZE_T]], %flags.alignmentMask

View File

@@ -2,10 +2,10 @@
// Make sure we generate the outer metadata.
// CHECK-DAG: @"$s4test5OuterVMf" = internal constant {{.*}} {{@"\$sytWV"|ptr @"\$s4test5OuterVWV"}}, {{.*}} @"$s4test5OuterVMn{{(\.ptrauth)?}}"
// CHECK-DAG: @"$s4test6Outer2VMf" = internal constant {{.*}} {{@"\$sytWV"|ptr @"\$s4test6Outer2VWV"}}, {{.*}} @"$s4test6Outer2VMn{{(\.ptrauth)?}}"
// CHECK-DAG: @"$s4test6Outer3VMf" = internal constant {{.*}} {{@"\$sytWV"|ptr @"\$s4test6Outer3VWV"}}, {{.*}} @"$s4test6Outer3VMn{{(\.ptrauth)?}}"
// CHECK-DAG: @"$s4test6Outer4VMf" = internal constant {{.*}} {{@"\$sytWV"|ptr @"\$s4test6Outer4VWV"}}, {{.*}} @"$s4test6Outer4VMn{{(\.ptrauth[.0-9]*)?}}"
// CHECK-DAG: @"$s4test5OuterVMf" = internal constant {{.*}} {{@"\$sytWV(\.ptrauth[.0-9]*)?"|ptr @"\$s4test5OuterVWV"}}, {{.*}} @"$s4test5OuterVMn{{(\.ptrauth[.0-9]*)?}}"
// CHECK-DAG: @"$s4test6Outer2VMf" = internal constant {{.*}} {{@"\$sytWV(\.ptrauth[.0-9]*)?"|ptr @"\$s4test6Outer2VWV"}}, {{.*}} @"$s4test6Outer2VMn{{(\.ptrauth[.0-9]*)?}}"
// CHECK-DAG: @"$s4test6Outer3VMf" = internal constant {{.*}} {{@"\$sytWV(\.ptrauth[.0-9]*)?"|ptr @"\$s4test6Outer3VWV"}}, {{.*}} @"$s4test6Outer3VMn{{(\.ptrauth[.0-9]*)?}}"
// CHECK-DAG: @"$s4test6Outer4VMf" = internal constant {{.*}} {{@"\$sytWV(\.ptrauth[.0-9]*)?"|ptr @"\$s4test6Outer4VWV"}}, {{.*}} @"$s4test6Outer4VMn{{(\.ptrauth[.0-9]*)?}}"
class C<T> { }