mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This attribute was introduced in 7eca38ce76d5d1915f4ab7e665964062c0b37697 (llvm-project). Match it using a wildcard regex, since it is not relevant to these tests. This is intended to reduce future conflicts with rebranch.
167 lines
7.3 KiB
Plaintext
167 lines
7.3 KiB
Plaintext
// RUN: %target-swift-frontend -enable-objc-interop -disable-type-layout -emit-ir %s | %FileCheck %s
|
|
|
|
// REQUIRES: CPU=x86_64
|
|
|
|
import Builtin
|
|
|
|
// These types end up in a completely different order with interop disabled.
|
|
// CHECK-DAG: [[TYPE:%swift.type]] = type
|
|
// CHECK-DAG: [[OPAQUE:%swift.opaque]] = type opaque
|
|
// CHECK-DAG: [[A:%T12unowned_objc1AV]] = type <{ %swift.unowned }>
|
|
|
|
class C {}
|
|
sil_vtable C {}
|
|
typealias AnyObject = Builtin.AnyObject
|
|
protocol P : class {
|
|
func explode()
|
|
}
|
|
|
|
sil @$s12unowned_objc1CCfD : $@convention(method) (C) -> ()
|
|
|
|
struct A {
|
|
unowned var x : C
|
|
}
|
|
|
|
struct B {
|
|
unowned var x : P
|
|
}
|
|
|
|
sil @test_weak_rr_class : $@convention(thin) (@sil_unowned C) -> () {
|
|
bb0(%0 : $@sil_unowned C):
|
|
unowned_retain %0 : $@sil_unowned C
|
|
unowned_release %0 : $@sil_unowned C
|
|
%3 = tuple ()
|
|
return %3 : $()
|
|
}
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_weak_rr_class(ptr %0) {{.*}} {
|
|
// CHECK: call ptr @swift_unownedRetain(ptr returned %0)
|
|
// CHECK-NEXT: call void @swift_unownedRelease(ptr %0)
|
|
// CHECK-NEXT: ret void
|
|
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_unknown_unowned_copies(ptr %0, ptr %1, ptr %2, ptr %3)
|
|
sil @test_unknown_unowned_copies : $@convention(thin) (@owned P, @owned P) -> () {
|
|
bb0(%p : $P, %q : $P):
|
|
|
|
// CHECK: [[X:%.*]] = alloca [[UREF:{ %swift.unowned, ptr }]], align 8
|
|
// CHECK-NEXT: [[Y:%.*]] = alloca [[UREF]], align 8
|
|
|
|
// CHECK-NEXT: llvm.lifetime.start
|
|
%x = alloc_stack $@sil_unowned P
|
|
// CHECK-NEXT: llvm.lifetime.start
|
|
%y = alloc_stack $@sil_unowned P
|
|
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 1
|
|
// CHECK-NEXT: store ptr [[PP:%1]], ptr [[T0]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 0
|
|
// CHECK-NEXT: call ptr @swift_unknownObjectUnownedInit(ptr returned [[T0]], ptr [[PV:%0]])
|
|
store_unowned %p to [init] %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call ptr @"$s12unowned_objc1P_pXoWOc"(ptr [[X]], ptr [[Y]])
|
|
copy_addr %x to [init] %y : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 0
|
|
// CHECK-NEXT: [[TV:%.*]] = call ptr @swift_unknownObjectUnownedLoadStrong(ptr [[T0]])
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 1
|
|
// CHECK-NEXT: [[TP:%.*]] = load ptr, ptr [[T0]], align 8
|
|
%t0 = load_unowned %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call void @swift_unknownObjectRelease(ptr [[TV]])
|
|
strong_release %t0 : $P
|
|
|
|
// CHECK-NEXT: call ptr @"$s12unowned_objc1P_pXoWOf"(ptr [[X]], ptr [[Y]])
|
|
copy_addr %x to %y : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[Y]], i32 0, i32 1
|
|
// CHECK-NEXT: store ptr [[QP:%3]], ptr [[T0]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[Y]], i32 0, i32 0
|
|
// CHECK-NEXT: call ptr @swift_unknownObjectUnownedAssign(ptr returned [[T0]], ptr [[QV:%2]])
|
|
store_unowned %q to %y : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call ptr @"$s12unowned_objc1P_pXoWOd"(ptr [[X]], ptr [[Y]])
|
|
copy_addr [take] %x to %y : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call ptr @"$s12unowned_objc1P_pXoWOb"(ptr [[Y]], ptr [[X]])
|
|
copy_addr [take] %y to [init] %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[Y]], i32 0, i32 0
|
|
// CHECK-NEXT: [[TV:%.*]] = call ptr @swift_unknownObjectUnownedTakeStrong(ptr [[T0]])
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[Y]], i32 0, i32 1
|
|
// CHECK-NEXT: [[TP:%.*]] = load ptr, ptr [[T0]], align 8
|
|
%t1 = load_unowned [take] %y : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 1
|
|
// CHECK-NEXT: store ptr [[TP]], ptr [[T0]], align 8
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[UREF]], ptr [[X]], i32 0, i32 0
|
|
// CHECK-NEXT: call ptr @swift_unknownObjectUnownedInit(ptr returned [[T0]], ptr [[TV]])
|
|
store_unowned %t1 to [init] %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call void @swift_unknownObjectRelease(ptr [[TV]])
|
|
strong_release %t1 : $P
|
|
|
|
// CHECK-NEXT: call ptr @"$s12unowned_objc1P_pXoWOh"(ptr
|
|
destroy_addr %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: llvm.lifetime.end
|
|
dealloc_stack %y : $*@sil_unowned P
|
|
// CHECK-NEXT: llvm.lifetime.end
|
|
dealloc_stack %x : $*@sil_unowned P
|
|
|
|
// CHECK-NEXT: call void @swift_unknownObjectRelease(ptr [[PV]])
|
|
strong_release %p : $P
|
|
|
|
// CHECK-NEXT: call void @swift_unknownObjectRelease(ptr [[QV]])
|
|
strong_release %q : $P
|
|
|
|
// CHECK-NEXT: ret void
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
|
|
// Value witnesses for A:
|
|
|
|
// initializeBufferWithCopyOfBuffer
|
|
// CHECK: define internal ptr @"$s12unowned_objc1AVwCP"(ptr noalias [[DESTBUF:%.*]], ptr noalias [[SRCBUF:%.*]], ptr
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[DESTBUF]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[SRCBUF]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T2:%.*]] = load ptr, ptr [[T1]], align 8
|
|
// CHECK-NEXT: call ptr @swift_unownedRetain(ptr returned [[T2]])
|
|
// CHECK-NEXT: store ptr [[T2]], ptr [[T0]], align 8
|
|
// CHECK-NEXT: ret ptr [[DESTBUF]]
|
|
|
|
// destroy
|
|
// CHECK: define internal void @"$s12unowned_objc1AVwxx"(ptr noalias [[ARG:%.*]], ptr
|
|
// CHECK: [[T1:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[ARG]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T2:%.*]] = load ptr, ptr [[T1]], align 8
|
|
// CHECK-NEXT: call void @swift_unownedRelease(ptr [[T2]])
|
|
// CHECK-NEXT: ret void
|
|
|
|
// initializeWithCopy
|
|
// CHECK: define internal ptr @"$s12unowned_objc1AVwcp"(ptr noalias [[DEST_OPQ:%.*]], ptr noalias [[SRC_OPQ:%.*]], ptr
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[DEST_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[SRC_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[T2:%.*]] = load ptr, ptr [[T1]], align 8
|
|
// CHECK-NEXT: call ptr @swift_unownedRetain(ptr returned [[T2]])
|
|
// CHECK-NEXT: store ptr [[T2]], ptr [[T0]], align 8
|
|
// CHECK-NEXT: ret ptr [[DEST_OPQ]]
|
|
|
|
// assignWithCopy
|
|
// CHECK: define internal ptr @"$s12unowned_objc1AVwca"(ptr [[DEST_OPQ:%.*]], ptr [[SRC_OPQ:%.*]], ptr
|
|
// CHECK: [[DEST_X:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[DEST_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[SRC_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[NEW:%.*]] = load ptr, ptr [[SRC_X]], align 8
|
|
// CHECK-NEXT: call ptr @swift_unownedRetain(ptr returned [[NEW]])
|
|
// CHECK-NEXT: [[OLD:%.*]] = load ptr, ptr [[DEST_X]], align 8
|
|
// CHECK-NEXT: store ptr [[NEW]], ptr [[DEST_X]], align 8
|
|
// CHECK-NEXT: call void @swift_unownedRelease(ptr [[OLD]])
|
|
// CHECK-NEXT: ret ptr [[DEST_OPQ]]
|
|
|
|
// assignWithTake
|
|
// CHECK: define internal ptr @"$s12unowned_objc1AVwta"(ptr noalias [[DEST_OPQ:%.*]], ptr noalias [[SRC_OPQ:%.*]], ptr
|
|
// CHECK: [[DEST_X:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[DEST_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds{{.*}} [[A]], ptr [[SRC_OPQ]], i32 0, i32 0
|
|
// CHECK-NEXT: [[NEW:%.*]] = load ptr, ptr [[SRC_X]], align 8
|
|
// CHECK-NEXT: [[OLD:%.*]] = load ptr, ptr [[DEST_X]], align 8
|
|
// CHECK-NEXT: store ptr [[NEW]], ptr [[DEST_X]], align 8
|
|
// CHECK-NEXT: call void @swift_unownedRelease(ptr [[OLD]])
|
|
// CHECK-NEXT: ret ptr [[DEST_OPQ]]
|