Files
swift-mirror/test/IRGen/class.sil
Anthony Latsis 17fc00f8a7 [test] IRGen: Adjust FileCheck patterns for new nuw attribute in upstream LLVM
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.
2025-05-04 03:28:56 +01:00

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]]