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.
160 lines
6.4 KiB
Plaintext
160 lines
6.4 KiB
Plaintext
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
|
|
|
|
// REQUIRES: CPU=x86_64
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
// CHECK-DAG: [[REF:%swift.refcounted]] = type
|
|
// CHECK-DAG: [[TYPE:%swift.type]] = type
|
|
// CHECK-DAG: [[OBJCCLASS:%objc_class]] = type
|
|
// CHECK-DAG: [[OPAQUE:%swift.opaque]] = type opaque
|
|
|
|
class C {}
|
|
sil_vtable C {}
|
|
|
|
// <rdar://14812566>: include _Tt prefix here
|
|
// CHECK: [[C_NAME:@.*]] = private unnamed_addr constant [13 x i8] c"_TtC5class1C\00"
|
|
|
|
// CHECK: @_DATA__TtC5class1C = internal constant {{.*}} {
|
|
// CHECK-SAME: i32 128,
|
|
// CHECK-SAME: i32 16,
|
|
// CHECK-SAME: i32 16,
|
|
// CHECK-SAME: i32 0,
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: ptr [[C_NAME]],
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: ptr null
|
|
// CHECK-SAME: }
|
|
|
|
// CHECK: @"$s5class1CCMf" = internal global <{ {{.*}} }> <{
|
|
// CHECK-SAME: ptr @"$s5class1CCfD",
|
|
// CHECK-DIRECT-SAME: ptr @"$sBoWV",
|
|
// CHECK-INDIRECT-SAME: ptr null,
|
|
// CHECK-SAME: i64 ptrtoint (ptr @"$s5class1CCMm" to i64),
|
|
// CHECK-DIRECT-SAME: ptr @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
|
|
// CHECK-INDIRECT-SAME: ptr null,
|
|
// CHECK-SAME: ptr @_objc_empty_cache,
|
|
// CHECK-SAME: ptr null,
|
|
// CHECK-SAME: i64 add (i64 ptrtoint (ptr @_DATA__TtC5class1C to i64), i64 [[IS_SWIFT_BIT:1|2]])
|
|
// CHECK-SAME: }>
|
|
|
|
// Destroying destructor
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @"$s5class1CCfd"(ptr swiftself %0) {{.*}} {
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: ret ptr %0
|
|
sil @$s5class1CCfd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject {
|
|
bb0(%0 : $C):
|
|
%1 = unchecked_ref_cast %0 : $C to $Builtin.NativeObject // user: %2
|
|
return %1 : $Builtin.NativeObject // id: %2
|
|
}
|
|
|
|
// Deallocating destructor
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s5class1CCfD"(ptr swiftself %0)
|
|
sil @$s5class1CCfD : $@convention(method) (@owned C) -> () {
|
|
bb0(%0 : $C):
|
|
// CHECK-NEXT: entry
|
|
// CHECK-NEXT: [[SELF:%[a-zA-Z0-9]+]] = call swiftcc ptr @"$s5class1CCfd"(ptr swiftself %0)
|
|
%1 = function_ref @$s5class1CCfd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject // user: %2
|
|
%2 = apply %1(%0) : $@convention(method) (@owned C) -> @owned Builtin.NativeObject // user: %3
|
|
%3 = unchecked_ref_cast %2 : $Builtin.NativeObject to $C // user: %4
|
|
// CHECK-NEXT: call void @swift_deallocClassInstance(ptr [[SELF]], i64 16, i64 7)
|
|
dealloc_ref %3 : $C // id: %4
|
|
// CHECK-NEXT: ret void
|
|
%5 = tuple () // user: %6
|
|
return %5 : $() // id: %6
|
|
}
|
|
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @unchecked_ref_cast_cast(ptr %0)
|
|
sil @unchecked_ref_cast_cast : $@convention(thin) (C) -> Builtin.NativeObject {
|
|
entry(%c : $C):
|
|
%r = unchecked_ref_cast %c : $C to $Builtin.NativeObject
|
|
return %r : $Builtin.NativeObject
|
|
}
|
|
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @ref_to_objc_pointer_cast(ptr %0)
|
|
sil @ref_to_objc_pointer_cast : $@convention(thin) (C) -> Builtin.AnyObject {
|
|
entry(%c : $C):
|
|
%r = unchecked_ref_cast %c : $C to $Builtin.AnyObject
|
|
return %r : $Builtin.AnyObject
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @alloc_ref_dynamic(ptr %0)
|
|
sil @alloc_ref_dynamic : $@convention(thin) (@thick C.Type) -> @owned C {
|
|
bb0(%0 : $@thick C.Type):
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, ptr %0, i32 48
|
|
// CHECK: [[SIZE32:%.*]] = load i32, ptr [[T0]], align 8
|
|
// CHECK: [[SIZE:%.*]] = zext i32 [[SIZE32]] to i64
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, ptr %0, i32 52
|
|
// CHECK: [[ALIGN16:%.*]] = load i16, ptr [[T0]], align 4
|
|
// CHECK: [[ALIGN:%.*]] = zext i16 [[ALIGN16]] to i64
|
|
// CHECK: [[RESULT:%[0-9]+]] = call noalias ptr @swift_allocObject(ptr %0, i64 [[SIZE]], i64 [[ALIGN]])
|
|
%1 = alloc_ref_dynamic %0 : $@thick C.Type, $C
|
|
return %1 : $C
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @autorelease(ptr %0) {{.*}} {
|
|
// CHECK: call ptr @llvm.objc.autorelease(ptr %0)
|
|
// CHECK: ret ptr %0
|
|
sil @autorelease : $@convention(thin) (@owned C) -> C {
|
|
entry(%c : $C):
|
|
autorelease_value %c : $C
|
|
return %c : $C
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @autorelease_optional(i64 %0) {{.*}} {
|
|
// CHECK: %1 = inttoptr i64 %0 to ptr
|
|
// CHECK: call ptr @llvm.objc.autorelease(ptr %1)
|
|
// CHECK: ret i64 %0
|
|
sil @autorelease_optional : $@convention(thin) (@owned C?) -> C? {
|
|
entry(%c : $C?):
|
|
autorelease_value %c : $C?
|
|
return %c : $C?
|
|
}
|
|
|
|
// rdar://problem/19514920
|
|
|
|
class NonRequiredBase {}
|
|
class RequiredBase: NonRequiredBase {
|
|
required override init()
|
|
}
|
|
|
|
sil public_external @init_NonRequiredBase : $@convention(method) (@owned NonRequiredBase) -> @owned NonRequiredBase
|
|
sil public_external @alloc_RequiredBase : $@convention(method) (@thick RequiredBase.Type) -> @owned RequiredBase
|
|
sil public_external @init_RequiredBase : $@convention(method) (@owned RequiredBase) -> @owned RequiredBase
|
|
|
|
sil_vtable NonRequiredBase {
|
|
#NonRequiredBase.init!initializer: @init_NonRequiredBase
|
|
}
|
|
|
|
sil_vtable RequiredBase {
|
|
#NonRequiredBase.init!initializer: @init_RequiredBase [override]
|
|
#RequiredBase.init!allocator: @alloc_RequiredBase
|
|
}
|
|
|
|
// rdar://problem/19902523
|
|
|
|
protocol ClassConstraint: class {}
|
|
class ClassConstraintConformance: ClassConstraint {}
|
|
sil_vtable ClassConstraintConformance {}
|
|
|
|
class ClassConstrainedGenericField<T: ClassConstraint> {
|
|
var field: T
|
|
init()
|
|
}
|
|
sil_vtable ClassConstrainedGenericField {}
|
|
|
|
sil @fixed_class_generic_field : $@convention(thin) (@owned ClassConstrainedGenericField<ClassConstraintConformance>) -> @owned ClassConstraintConformance {
|
|
entry(%x : $ClassConstrainedGenericField<ClassConstraintConformance>):
|
|
%a = ref_element_addr %x : $ClassConstrainedGenericField<ClassConstraintConformance>, #ClassConstrainedGenericField.field
|
|
%b = load %a : $*ClassConstraintConformance
|
|
return %b : $ClassConstraintConformance
|
|
}
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @fixed_class_generic_field(ptr %0)
|
|
// CHECK: [[FIELD_ADDR_GENERIC:%.*]] = getelementptr inbounds{{.*}} %T5class28ClassConstrainedGenericFieldCyAA0B21ConstraintConformanceCG, ptr %0, i32 0, i32 1
|
|
// CHECK: load ptr, ptr [[FIELD_ADDR_GENERIC]]
|
|
|