mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
138 lines
7.7 KiB
Plaintext
138 lines
7.7 KiB
Plaintext
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -disable-objc-interop -emit-ir %s | %FileCheck %s
|
|
|
|
// REQUIRES: CPU=x86_64
|
|
|
|
// CHECK: [[TYPE:%swift.type]] = type
|
|
// CHECK: [[C:%T7unowned1CC]] = type <{ [[REF:%swift.refcounted]] }>
|
|
// CHECK: [[OPAQUE:%swift.opaque]] = type opaque
|
|
// CHECK: [[A:%T7unowned1AV]] = type <{ %swift.unowned }>
|
|
|
|
class C {}
|
|
sil_vtable C {}
|
|
protocol P : class {
|
|
func explode()
|
|
}
|
|
|
|
sil @_T07unowned1CCfD : $@convention(method) (C) -> ()
|
|
|
|
struct A {
|
|
unowned var x : C
|
|
}
|
|
|
|
sil @test_weak_rr_class : $@convention(thin) (@sil_unowned C) -> () {
|
|
bb0(%0 : $@sil_unowned C):
|
|
%1 = unowned_retain %0 : $@sil_unowned C
|
|
%2 = unowned_release %0 : $@sil_unowned C
|
|
%3 = tuple ()
|
|
%4 = return %3 : $()
|
|
}
|
|
// CHECK: define{{( protected)?}} swiftcc void @test_weak_rr_class([[C]]*) {{.*}} {
|
|
// CHECK: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRetain to void ([[C]]*)*)([[C]]* %0)
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRelease to void ([[C]]*)*)([[C]]* %0)
|
|
// CHECK-NEXT: ret void
|
|
|
|
sil @test_weak_rr_proto : $@convention(thin) (@sil_unowned P) -> () {
|
|
bb0(%0 : $@sil_unowned P):
|
|
%1 = unowned_retain %0 : $@sil_unowned P
|
|
%2 = unowned_release %0 : $@sil_unowned P
|
|
%3 = tuple ()
|
|
%4 = return %3 : $()
|
|
}
|
|
// CHECK: define{{( protected)?}} swiftcc void @test_weak_rr_proto(%swift.refcounted*, i8**) {{.*}} {
|
|
// CHECK: call void @swift_rt_swift_unownedRetain(%swift.refcounted* %0)
|
|
// CHECK: call void @swift_rt_swift_unownedRelease(%swift.refcounted* %0)
|
|
// CHECK-NEXT: ret void
|
|
|
|
// Value witnesses for A:
|
|
|
|
// destroyBuffer
|
|
// CHECK: define linkonce_odr hidden void @_T07unowned1AVwXX([[BUFFER:\[24 x i8\]]]* [[ARG:%.*]], [[TYPE]]*
|
|
// CHECK: [[T0:%.*]] = bitcast [[BUFFER]]* [[ARG]] to [[A]]*
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1C:%.*]] = bitcast %swift.unowned* [[T1]] to [[C]]*
|
|
// CHECK-NEXT: [[T2:%.*]] = load [[C]]*, [[C]]** [[T1C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRelease to void ([[C]]*)*)([[C]]* [[T2]])
|
|
// CHECK-NEXT: ret void
|
|
|
|
// initializeBufferWithCopyOfBuffer
|
|
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T07unowned1AVwCP([[BUFFER]]* [[DESTBUF:%.*]], [[BUFFER]]* [[SRCBUF:%.*]], [[TYPE]]*
|
|
// CHECK: [[DEST:%.*]] = bitcast [[BUFFER]]* [[DESTBUF]] to [[A]]*
|
|
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[BUFFER]]* [[SRCBUF]] to [[A]]*
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1C:%.*]] = bitcast %swift.unowned* [[T1]] to [[C]]*
|
|
// CHECK-NEXT: [[T2:%.*]] = load [[C]]*, [[C]]** [[T1C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRetain to void ([[C]]*)*)([[C]]* [[T2]])
|
|
// CHECK-NEXT: [[T0C:%.*]] = bitcast %swift.unowned* [[T0]] to [[C]]*
|
|
// CHECK-NEXT: store [[C]]* [[T2]], [[C]]** [[T0C]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
|
|
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
|
|
|
|
// destroy
|
|
// CHECK: define linkonce_odr hidden void @_T07unowned1AVwxx([[OPAQUE]]* [[ARG:%.*]], [[TYPE]]*
|
|
// CHECK: [[T0:%.*]] = bitcast [[OPAQUE]]* [[ARG]] to [[A]]*
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1C:%.*]] = bitcast %swift.unowned* [[T1]] to [[C]]*
|
|
// CHECK-NEXT: [[T2:%.*]] = load [[C]]*, [[C]]** [[T1C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRelease to void ([[C]]*)*)([[C]]* [[T2]])
|
|
// CHECK-NEXT: ret void
|
|
|
|
// initializeBufferWithCopy
|
|
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T07unowned1AVwCp([[BUFFER]]* [[DESTBUF:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
|
|
// CHECK: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[DEST:%.*]] = bitcast [[BUFFER]]* [[DESTBUF]] to [[A]]*
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1C:%.*]] = bitcast %swift.unowned* [[T1]] to [[C]]*
|
|
// CHECK-NEXT: [[T2:%.*]] = load [[C]]*, [[C]]** [[T1C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRetain to void ([[C]]*)*)([[C]]* [[T2]])
|
|
// CHECK-NEXT: [[T0C:%.*]] = bitcast %swift.unowned* [[T0]] to [[C]]*
|
|
// CHECK-NEXT: store [[C]]* [[T2]], [[C]]** [[T0C]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
|
|
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
|
|
|
|
// initializeWithCopy
|
|
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T07unowned1AVwcp([[OPAQUE]]* [[DEST_OPQ:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
|
|
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1C:%.*]] = bitcast %swift.unowned* [[T1]] to [[C]]*
|
|
// CHECK-NEXT: [[T2:%.*]] = load [[C]]*, [[C]]** [[T1C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRetain to void ([[C]]*)*)([[C]]* [[T2]])
|
|
// CHECK-NEXT: [[T0C:%.*]] = bitcast %swift.unowned* [[T0]] to [[C]]*
|
|
// CHECK-NEXT: store [[C]]* [[T2]], [[C]]** [[T0C]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
|
|
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
|
|
|
|
// assignWithCopy
|
|
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T07unowned1AVwca([[OPAQUE]]* [[DEST_OPQ:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
|
|
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X_C:%.*]] = bitcast %swift.unowned* [[SRC_X]] to [[C]]*
|
|
// CHECK-NEXT: [[NEW:%.*]] = load [[C]]*, [[C]]** [[SRC_X_C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRetain to void ([[C]]*)*)([[C]]* [[NEW]])
|
|
// CHECK-NEXT: [[DEST_X_C:%.*]] = bitcast %swift.unowned* [[DEST_X]] to [[C]]*
|
|
// CHECK-NEXT: [[OLD:%.*]] = load [[C]]*, [[C]]** [[DEST_X_C]], align 8
|
|
// CHECK-NEXT: store [[C]]* [[NEW]], [[C]]** [[DEST_X_C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRelease to void ([[C]]*)*)([[C]]* [[OLD]])
|
|
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
|
|
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
|
|
|
|
// assignWithTake
|
|
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T07unowned1AVwta([[OPAQUE]]* [[DEST_OPQ:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
|
|
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
|
|
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X_C:%.*]] = bitcast %swift.unowned* [[SRC_X]] to [[C]]*
|
|
// CHECK-NEXT: [[NEW:%.*]] = load [[C]]*, [[C]]** [[SRC_X_C]], align 8
|
|
// CHECK-NEXT: [[DEST_X_C:%.*]] = bitcast %swift.unowned* [[DEST_X]] to [[C]]*
|
|
// CHECK-NEXT: [[OLD:%.*]] = load [[C]]*, [[C]]** [[DEST_X_C]], align 8
|
|
// CHECK-NEXT: store [[C]]* [[NEW]], [[C]]** [[DEST_X_C]], align 8
|
|
// CHECK-NEXT: call void bitcast (void ([[REF]]*)* @swift_rt_swift_unownedRelease to void ([[C]]*)*)([[C]]* [[OLD]])
|
|
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
|
|
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
|