diff --git a/test/IRGen/boxed_existential.sil b/test/IRGen/boxed_existential.sil index 9fcac60aed3d6..16870af6b1632 100644 --- a/test/IRGen/boxed_existential.sil +++ b/test/IRGen/boxed_existential.sil @@ -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]] diff --git a/test/IRGen/empty_enum.swift b/test/IRGen/empty_enum.swift index 63b08c611d8de..52c780f634766 100644 --- a/test/IRGen/empty_enum.swift +++ b/test/IRGen/empty_enum.swift @@ -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 {} diff --git a/test/IRGen/enum_dynamic_multi_payload.sil b/test/IRGen/enum_dynamic_multi_payload.sil index f85036994de4f..e6bf169be26ba 100644 --- a/test/IRGen/enum_dynamic_multi_payload.sil +++ b/test/IRGen/enum_dynamic_multi_payload.sil @@ -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, %b : $*EitherOr): // 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, %b : $*EitherOr): // 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]] diff --git a/test/IRGen/enum_resilience.swift b/test/IRGen/enum_resilience.swift index a541c73d5e8af..3220e4a0c1ef9 100644 --- a/test/IRGen/enum_resilience.swift +++ b/test/IRGen/enum_resilience.swift @@ -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(_ 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 diff --git a/test/IRGen/existentials_opaque_boxed.sil b/test/IRGen/existentials_opaque_boxed.sil index 66efd01077ec3..1315c54be3722 100644 --- a/test/IRGen/existentials_opaque_boxed.sil +++ b/test/IRGen/existentials_opaque_boxed.sil @@ -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 diff --git a/test/IRGen/fixed_size_buffer_peepholes.sil b/test/IRGen/fixed_size_buffer_peepholes.sil index 2577c46d48a14..d155865530ac2 100644 --- a/test/IRGen/fixed_size_buffer_peepholes.sil +++ b/test/IRGen/fixed_size_buffer_peepholes.sil @@ -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]]( diff --git a/test/IRGen/foreign_types.sil b/test/IRGen/foreign_types.sil index df4347c537305..00330063821fa 100644 --- a/test/IRGen/foreign_types.sil +++ b/test/IRGen/foreign_types.sil @@ -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, diff --git a/test/IRGen/foreign_types_future.sil b/test/IRGen/foreign_types_future.sil index 41895b0056256..ead78576d53a9 100644 --- a/test/IRGen/foreign_types_future.sil +++ b/test/IRGen/foreign_types_future.sil @@ -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, diff --git a/test/IRGen/global_resilience.sil b/test/IRGen/global_resilience.sil index 0e1996ddaae3f..4d655b1683278 100644 --- a/test/IRGen/global_resilience.sil +++ b/test/IRGen/global_resilience.sil @@ -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 diff --git a/test/IRGen/lifetime.sil b/test/IRGen/lifetime.sil index a1d537b55cb93..e4909f3356dd9 100644 --- a/test/IRGen/lifetime.sil +++ b/test/IRGen/lifetime.sil @@ -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 diff --git a/test/IRGen/multi_file_resilience.swift b/test/IRGen/multi_file_resilience.swift index 6ef0e4ceb01c5..c3742a80a90da 100644 --- a/test/IRGen/multi_file_resilience.swift +++ b/test/IRGen/multi_file_resilience.swift @@ -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]] diff --git a/test/IRGen/multi_module_resilience.swift b/test/IRGen/multi_module_resilience.swift index ab808e25c3a8f..97fb2a0928d89 100644 --- a/test/IRGen/multi_module_resilience.swift +++ b/test/IRGen/multi_module_resilience.swift @@ -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]] diff --git a/test/IRGen/opaque_values_irgen.sil b/test/IRGen/opaque_values_irgen.sil index 60682ab7c1edb..efd0efad7e405 100644 --- a/test/IRGen/opaque_values_irgen.sil +++ b/test/IRGen/opaque_values_irgen.sil @@ -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) diff --git a/test/IRGen/struct_resilience.swift b/test/IRGen/struct_resilience.swift index aa7c79d97fbc1..73960b0340bae 100644 --- a/test/IRGen/struct_resilience.swift +++ b/test/IRGen/struct_resilience.swift @@ -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]] diff --git a/test/IRGen/type_layout.swift b/test/IRGen/type_layout.swift index cb4472cba046a..6c93debd2a310 100644 --- a/test/IRGen/type_layout.swift +++ b/test/IRGen/type_layout.swift @@ -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 { // 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 { // 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 diff --git a/test/IRGen/type_layout_objc.swift b/test/IRGen/type_layout_objc.swift index fe9b357a45134..15330beaa7c08 100644 --- a/test/IRGen/type_layout_objc.swift +++ b/test/IRGen/type_layout_objc.swift @@ -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 { // 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 { // 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 diff --git a/test/IRGen/typelayout_based_value_witness.swift b/test/IRGen/typelayout_based_value_witness.swift index 97af3213ab8cd..8b1532aa92a2b 100644 --- a/test/IRGen/typelayout_based_value_witness.swift +++ b/test/IRGen/typelayout_based_value_witness.swift @@ -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 { @@ -83,15 +83,35 @@ public enum ForwardEnum { // OPT: [[T_PARAM:%.*]] = getelementptr inbounds ptr, ptr %"A", {{(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 diff --git a/test/multifile/nested_types.swift b/test/multifile/nested_types.swift index 6cb82dbd39990..98eaa53233aaa 100644 --- a/test/multifile/nested_types.swift +++ b/test/multifile/nested_types.swift @@ -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 { }