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.
407 lines
18 KiB
Plaintext
407 lines
18 KiB
Plaintext
// RUN: %empty-directory(%t)
|
|
// RUN: %{python} %utils/chex.py < %s > %t/generic_classes.sil
|
|
// RUN: %target-swift-frontend %t/generic_classes.sil -emit-ir -enable-objc-interop | %FileCheck %t/generic_classes.sil --check-prefixes=CHECK,CHECK-objc,CHECK-%target-import-type,CHECK-%target-import-type-objc
|
|
// RUN: %target-swift-frontend %t/generic_classes.sil -emit-ir -disable-objc-interop | %FileCheck %t/generic_classes.sil --check-prefixes=CHECK,CHECK-native,CHECK-%target-import-type
|
|
// RUN: %target-swift-frontend -Osize %t/generic_classes.sil -emit-ir | %FileCheck %t/generic_classes.sil --check-prefix=OSIZE
|
|
|
|
// REQUIRES: PTRSIZE=64
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
// CHECK: [[ROOTGENERIC:%T15generic_classes11RootGenericC]] = type <{ %swift.refcounted, %Ts5UInt8V }>
|
|
|
|
// -- offset of RootGeneric<T>.x
|
|
// FIXME: Strings should be unnamed_addr. rdar://problem/22674524
|
|
// CHECK: [[ROOTGENERIC_NAME:@.*]] = private constant [12 x i8] c"RootGeneric\00"
|
|
|
|
// CHECK-LABEL: @"$s15generic_classes11RootGenericCMn" =
|
|
// -- flags: class, generic, unique, has vtable
|
|
// CHECK-SAME: <i32 0x8000_00D0>
|
|
// -- name
|
|
// CHECK-SAME: ptr [[ROOTGENERIC_NAME]]
|
|
// -- negative size in words
|
|
// CHECK-SAME: i32 3,
|
|
// -- positive size in words
|
|
// CHECK-objc-SAME: i32 18,
|
|
// CHECK-native-SAME: i32 15,
|
|
// -- num immediate members
|
|
// CHECK-SAME: i32 8,
|
|
// -- num fields
|
|
// CHECK-SAME: i32 3,
|
|
// -- field offset vector offset
|
|
// CHECK-objc-SAME: i32 11,
|
|
// CHECK-native-SAME: i32 8,
|
|
// -- template instantiation cache
|
|
// CHECK-SAME: ptr @"$s15generic_classes11RootGenericCMI"
|
|
// -- template instantiation pattern
|
|
// CHECK-SAME: @"$s15generic_classes11RootGenericCMP"
|
|
// -- generic parameters, requirements, key arguments, extra arguments
|
|
// CHECK-SAME: i16 1, i16 0, i16 1, i16 0
|
|
// -- vtable offset
|
|
// CHECK-objc-SAME: i32 14,
|
|
// CHECK-native-SAME: i32 11,
|
|
// -- vtable size
|
|
// CHECK-SAME: i32 4
|
|
// CHECK-SAME: }
|
|
|
|
// CHECK-LABEL: @"$s15generic_classes11RootGenericCMP" = internal constant
|
|
// CHECK-SAME: <{
|
|
// -- template instantiation function
|
|
// CHECK-SAME: ptr @"$s15generic_classes11RootGenericCMi"
|
|
// -- heap destructor
|
|
// CHECK-SAME: @"$s15generic_classes11RootGenericCfD"
|
|
// -- ivar destroyer
|
|
// CHECK-SAME: i32 0,
|
|
// -- flags
|
|
// CHECK-SAME: i32 2,
|
|
// -- immediate pattern size
|
|
// CHECK-native-SAME: i16 0,
|
|
// CHECK-objc-SAME: i16 5,
|
|
// -- immediate pattern target offset
|
|
// CHECK-SAME: i16 0,
|
|
// -- extra data size
|
|
// CHECK-native-SAME: i16 0,
|
|
// CHECK-objc-SAME: i16 14,
|
|
// -- class ro-data offset
|
|
// CHECK-native-SAME: i16 0
|
|
// CHECK-objc-SAME: i16 0,
|
|
// -- metaclass object offset
|
|
// CHECK-objc-SAME: i16 0,
|
|
// -- class ro-data offset
|
|
// CHECK-objc-SAME: i16 23
|
|
// CHECK-SAME: }>
|
|
|
|
// -- Check that offset vars are emitted for fixed-layout generics
|
|
// <rdar://problem/15081049>
|
|
// CHECK: @"$s15generic_classes22RootGenericFixedLayoutC1xs5UInt8VvpWvd" = hidden constant i64 16, align 8
|
|
// CHECK: @"$s15generic_classes22RootGenericFixedLayoutC1ySayxGvpWvd" = hidden constant i64 24, align 8
|
|
// CHECK: @"$s15generic_classes22RootGenericFixedLayoutC1zs5UInt8VvpWvd" = hidden constant i64 32, align 8
|
|
|
|
// -- fixed-layout nongeneric descriptor
|
|
// FIXME: Strings should be unnamed_addr. rdar://problem/22674524
|
|
// CHECK: [[ROOTNONGENERIC_NAME:@.*]] = private constant [15 x i8] c"RootNonGeneric\00"
|
|
// CHECK: @"$s15generic_classes14RootNonGenericCMn" = hidden constant <{ {{.*}} %swift.method_descriptor }> <{
|
|
// -- flags: class, unique, has vtable
|
|
// CHECK-DIRECT-SAME: <i32 0x8000_0050>
|
|
// CHECK-INDIRECT-SAME: <i32 0x8001_0050>
|
|
// -- name
|
|
// CHECK-SAME: ptr [[ROOTNONGENERIC_NAME]]
|
|
// -- num fields
|
|
// CHECK-SAME: i32 3,
|
|
// -- -- field offset vector offset
|
|
// CHECK-SAME: i32 10,
|
|
// CHECK-SAME: }>
|
|
|
|
// CHECK: @"$s15generic_classes14RootNonGenericCMf" = internal global <{ {{.*}} }> <{
|
|
// -- destructor
|
|
// CHECK-SAME: ptr{{.*}} @"$s15generic_classes14RootNonGenericCfD{{[^,]*}}"{{[^,]*}},
|
|
// -- witness table pointer
|
|
// CHECK-DIRECT-SAME: ptr {{.*}}@"$sBoWV{{(\.[^"]*)?}}",
|
|
// CHECK-INDIRECT-SAME: ptr null,
|
|
// -- swift object type
|
|
// CHECK-objc-SAME: i64 {{.*}}@"$s15generic_classes14RootNonGenericCMm{{(\.[^"]*)?}}"
|
|
// CHECK-native-SAME: i64 0,
|
|
// -- superclass
|
|
// CHECK-DIRECT-objc-SAME: ptr {{.*}}@"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject{{(.ptrauth)?}}"
|
|
// CHECK-INDIRECT-objc-SAME: ptr null,
|
|
// CHECK-native-SAME: ptr null,
|
|
// -- objc only fields
|
|
// CHECK-objc-SAME: ptr @_objc_empty_cache,
|
|
// CHECK-objc-SAME: ptr null,
|
|
// CHECK-objc-SAME: @_DATA__TtC15generic_classes14RootNonGeneric
|
|
// -- flags, sizes, and offsets...
|
|
// CHECK-SAME: i32 33,
|
|
// CHECK-SAME: i16 7,
|
|
// CHECK-SAME: i16 0,
|
|
// -- nominal type descriptor
|
|
// CHECK-SAME: ptr @"$s15generic_classes14RootNonGenericCMn{{[^,]*}}"
|
|
// CHECK-SAME: }>
|
|
|
|
// CHECK: @"$s15generic_classes015GenericInheritsC0CMn" = hidden constant
|
|
// -- template instantiation pattern
|
|
// CHECK-SAME: @"$s15generic_classes015GenericInheritsC0CMP"
|
|
|
|
// CHECK: @"$s15generic_classes015GenericInheritsC0CMP" = internal constant
|
|
// -- template instantiation function
|
|
// CHECK-SAME: ptr @"$s15generic_classes015GenericInheritsC0CMi"
|
|
// -- pattern flags (1 == has extra data pattern)
|
|
// CHECK-native-SAME: i32 0,
|
|
// CHECK-objc-SAME: i32 1,
|
|
// -- heap destructor
|
|
// CHECK-SAME: @"$s15generic_classes015GenericInheritsC0CfD"
|
|
// -- ivar destroyer
|
|
// CHECK-SAME: i32 0,
|
|
// -- class flags
|
|
// CHECK-SAME: i32 2,
|
|
// -- extra data pattern offset
|
|
// CHECK-objc-SAME: i16 5,
|
|
// -- extra data pattern size
|
|
// CHECK-objc-SAME: i16 0,
|
|
// -- class ro-data offset
|
|
// CHECK-native-SAME: i16 0,
|
|
// CHECK-objc-SAME: i16 14,
|
|
// -- metaclass object offset
|
|
// CHECK-native-SAME: i16 0,
|
|
// CHECK-objc-SAME: i16 0,
|
|
// -- class ro-data offset
|
|
// CHECK-native-SAME: i16 0,
|
|
// CHECK-objc-SAME: i16 0,
|
|
// -- reserved
|
|
// CHECK-native-SAME: i16 0
|
|
// CHECK-objc-SAME: i16 23
|
|
// CHECK-SAME: }
|
|
|
|
// CHECK: @"$s15generic_classes018GenericInheritsNonC0CMP"
|
|
|
|
class RootGeneric<T> {
|
|
var x : UInt8
|
|
|
|
init()
|
|
|
|
// Test that declaration order doesn't cause the field offset vector to end
|
|
// up interleaved with the vtable.
|
|
func foo()
|
|
|
|
var y : T
|
|
|
|
func bar()
|
|
|
|
var z : UInt8
|
|
|
|
func bas()
|
|
}
|
|
sil @$s15generic_classes11RootGenericCfD : $@convention(method) <T> (RootGeneric<T>) -> ()
|
|
|
|
sil @_TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_ : $@convention(method) <T> (@guaranteed RootGeneric<T>) -> ()
|
|
|
|
sil @_TFC15generic_classes11RootGeneric3barU__fGS0_Q__FT_T_ : $@convention(method) <T> (@guaranteed RootGeneric<T>) -> ()
|
|
|
|
sil @_TFC15generic_classes11RootGeneric3basU__fGS0_Q__FT_T_ : $@convention(method) <T> (@guaranteed RootGeneric<T>) -> ()
|
|
|
|
sil_vtable RootGeneric {
|
|
#RootGeneric.foo: @_TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_
|
|
#RootGeneric.bar: @_TFC15generic_classes11RootGeneric3barU__fGS0_Q__FT_T_
|
|
#RootGeneric.bas: @_TFC15generic_classes11RootGeneric3basU__fGS0_Q__FT_T_
|
|
}
|
|
|
|
class RootGenericFixedLayout<T> {
|
|
var x : UInt8
|
|
var y : [T]
|
|
var z : UInt8
|
|
|
|
init()
|
|
}
|
|
sil_vtable RootGenericFixedLayout {}
|
|
sil @$s15generic_classes22RootGenericFixedLayoutCfD : $@convention(method) <T> (RootGenericFixedLayout<T>) -> ()
|
|
|
|
class RootNonGeneric {
|
|
var x : UInt8
|
|
var y : Int
|
|
var z : UInt8
|
|
|
|
init()
|
|
}
|
|
sil_vtable RootNonGeneric {}
|
|
sil @$s15generic_classes14RootNonGenericCfD : $@convention(method) (RootNonGeneric) -> ()
|
|
|
|
class GenericInheritsGeneric<A, B> : RootGeneric<A> {
|
|
var w : B
|
|
|
|
func zippity()
|
|
func doo()
|
|
func dah()
|
|
|
|
override init()
|
|
}
|
|
sil @$s15generic_classes015GenericInheritsC0CfD : $@convention(method) <T, U> (GenericInheritsGeneric<T, U>) -> ()
|
|
|
|
sil @_TFC15generic_classes22GenericInheritsGeneric7zippityU___fGS0_Q_Q0__FT_T_ : $@convention(method) <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
|
|
|
sil @_TFC15generic_classes22GenericInheritsGeneric3dooU___fGS0_Q_Q0__FT_T_ : $@convention(method) <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
|
|
|
sil @_TFC15generic_classes22GenericInheritsGeneric3dahU___fGS0_Q_Q0__FT_T_ : $@convention(method) <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
|
|
|
sil_vtable GenericInheritsGeneric {
|
|
#RootGeneric.foo: @_TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_ [inherited]
|
|
#RootGeneric.bar: @_TFC15generic_classes11RootGeneric3barU__fGS0_Q__FT_T_ [inherited]
|
|
#RootGeneric.bas: @_TFC15generic_classes11RootGeneric3basU__fGS0_Q__FT_T_ [inherited]
|
|
#GenericInheritsGeneric.zippity: @_TFC15generic_classes22GenericInheritsGeneric7zippityU___fGS0_Q_Q0__FT_T_
|
|
#GenericInheritsGeneric.doo: @_TFC15generic_classes22GenericInheritsGeneric3dooU___fGS0_Q_Q0__FT_T_
|
|
#GenericInheritsGeneric.dah: @_TFC15generic_classes22GenericInheritsGeneric3dahU___fGS0_Q_Q0__FT_T_
|
|
}
|
|
|
|
class GenericInheritsNonGeneric<C> : RootNonGeneric {
|
|
var w : UInt8
|
|
|
|
override init()
|
|
}
|
|
sil_vtable GenericInheritsNonGeneric {}
|
|
sil @$s15generic_classes018GenericInheritsNonC0CfD : $@convention(method) <T> (GenericInheritsNonGeneric<T>) -> ()
|
|
|
|
// rdar://18067671
|
|
class RecursiveGenericInheritsGeneric<A, B> : RootGeneric<A> {
|
|
var w : B
|
|
var r : RecursiveGenericInheritsGeneric<A, B>?
|
|
|
|
func zippity()
|
|
func doo()
|
|
func dah()
|
|
|
|
override init()
|
|
}
|
|
sil_vtable RecursiveGenericInheritsGeneric {}
|
|
sil @$s15generic_classes024RecursiveGenericInheritsD0CfD : $@convention(method) <T, U> (RecursiveGenericInheritsGeneric<T, U>) -> ()
|
|
|
|
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @RootGeneric_fragile_dependent_alloc
|
|
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15generic_classes11RootGenericCMa"(i64 0, ptr %G)
|
|
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
|
|
// CHECK-objc: [[T0:%.*]] = getelementptr inbounds i8, ptr [[METADATA]], i32 48
|
|
// CHECK-native: [[T0:%.*]] = getelementptr inbounds i8, ptr [[METADATA]], i32 24
|
|
// CHECK: [[SIZE32:%.*]] = load i32, ptr [[T0]], align 8
|
|
// CHECK: [[SIZE:%.*]] = zext i32 [[SIZE32]] to i64
|
|
// CHECK-objc: [[T0:%.*]] = getelementptr inbounds i8, ptr [[METADATA]], i32 52
|
|
// CHECK-native: [[T0:%.*]] = getelementptr inbounds i8, ptr [[METADATA]], i32 28
|
|
// CHECK: [[ALIGN16:%.*]] = load i16, ptr [[T0]], align 4
|
|
// CHECK: [[ALIGN:%.*]] = zext i16 [[ALIGN16]] to i64
|
|
// CHECK: call noalias ptr @swift_allocObject(ptr [[METADATA]], i64 [[SIZE]], i64 [[ALIGN]])
|
|
sil @RootGeneric_fragile_dependent_alloc : $<G> () -> RootGeneric<G> {
|
|
entry:
|
|
%x = alloc_ref $RootGeneric<G>
|
|
return %x : $RootGeneric<G>
|
|
}
|
|
|
|
// RootGeneric.x has fixed layout
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @RootGeneric_concrete_fragile_dependent_member_access_x
|
|
// CHECK: getelementptr inbounds{{.*}} [[ROOTGENERIC]], ptr %0, i32 0, i32 1
|
|
sil @RootGeneric_concrete_fragile_dependent_member_access_x : $<F> (RootGeneric<F>) -> UInt8 {
|
|
entry(%c : $RootGeneric<F>):
|
|
%p = ref_element_addr %c : $RootGeneric<F>, #RootGeneric.x
|
|
%x = load %p : $*UInt8
|
|
return %x : $UInt8
|
|
}
|
|
|
|
// RootGeneric.y has dependent layout; load the offset from the metadata
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @RootGeneric_concrete_fragile_dependent_member_access_y
|
|
// CHECK-objc: [[Y_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, ptr {{%.*}}, i64 12
|
|
// CHECK-native: [[Y_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, ptr {{%.*}}, i64 9
|
|
// CHECK: [[Y_OFFSET:%.*]] = load i64, ptr [[Y_OFFSET_ADDR]], align 8
|
|
// CHECK: [[Y_ADDR:%.*]] = getelementptr inbounds i8, ptr {{%.*}}, i64 [[Y_OFFSET]]
|
|
sil @RootGeneric_concrete_fragile_dependent_member_access_y : $<F> (RootGeneric<F>) -> @out F {
|
|
entry(%z : $*F, %c : $RootGeneric<F>):
|
|
%p = ref_element_addr %c : $RootGeneric<F>, #RootGeneric.y
|
|
copy_addr %p to [init] %z : $*F
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @RootGeneric_subst_concrete_fragile_dependent_member_access_y
|
|
// CHECK: [[Y_ADDR:%.*]] = getelementptr inbounds {{.*}}, ptr %1, i32 0, i32 3
|
|
sil @RootGeneric_subst_concrete_fragile_dependent_member_access_y : $(RootGeneric<Int>) -> @out Int {
|
|
entry(%z : $*Int, %c : $RootGeneric<Int>):
|
|
%p = ref_element_addr %c : $RootGeneric<Int>, #RootGeneric.y
|
|
copy_addr %p to [init] %z : $*Int
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// RootGeneric.z has dependent layout; load the offset from the metadata
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @RootGeneric_concrete_fragile_dependent_member_access_z
|
|
// CHECK-objc: [[Z_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, ptr {{%.*}}, i64 13
|
|
// CHECK-native: [[Z_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, ptr {{%.*}}, i64 10
|
|
// CHECK: [[Z_OFFSET:%.*]] = load i64, ptr [[Z_OFFSET_ADDR]], align 8
|
|
// CHECK: [[Z_ADDR:%.*]] = getelementptr inbounds i8, ptr {{%.*}}, i64 [[Z_OFFSET]]
|
|
sil @RootGeneric_concrete_fragile_dependent_member_access_z : $<F> (RootGeneric<F>) -> UInt8 {
|
|
entry(%c : $RootGeneric<F>):
|
|
%p = ref_element_addr %c : $RootGeneric<F>, #RootGeneric.z
|
|
%z = load %p : $*UInt8
|
|
return %z : $UInt8
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @RootGeneric_subst_concrete_fragile_dependent_member_access_z
|
|
// CHECK: [[Z_ADDR:%.*]] = getelementptr inbounds {{.*}}, ptr %0, i32 0, i32 4
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds{{.*}} %Ts5UInt8V, ptr [[Z_ADDR]], i32 0, i32 0
|
|
// CHECK: load i8, ptr [[T0]], align
|
|
sil @RootGeneric_subst_concrete_fragile_dependent_member_access_z : $(RootGeneric<Int>) -> UInt8 {
|
|
entry(%c : $RootGeneric<Int>):
|
|
%p = ref_element_addr %c : $RootGeneric<Int>, #RootGeneric.z
|
|
%z = load %p : $*UInt8
|
|
return %z : $UInt8
|
|
}
|
|
|
|
/* TODO: Instantiate types for fragile generic instances so we can do
|
|
* fixed-layout access
|
|
sil @RootGeneric_concrete_fragile_fixed_member_access : $RootGeneric<Int32> -> (UInt8, Int32, UInt8) {
|
|
entry(%c : $RootGeneric<Int32>):
|
|
%p = ref_element_addr %c : $RootGeneric<Int32>, #RootGeneric.x
|
|
%x = load_borrow %p : $*UInt8
|
|
%q = ref_element_addr %c : $RootGeneric<Int32>, #RootGeneric.y
|
|
%y = load_borrow %q : $*Int32
|
|
%r = ref_element_addr %c : $RootGeneric<Int32>, #RootGeneric.z
|
|
%z = load_borrow %r : $*UInt8
|
|
%t = tuple (%x : $UInt8, %y : $Int32, %z : $UInt8)
|
|
return %t : $(UInt8, Int32, UInt8)
|
|
}
|
|
*/
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s15generic_classes11RootGenericCMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
|
|
// CHECK: [[METADATA:%.*]] = call{{( tail)?}} ptr @swift_allocateGenericClassMetadata(ptr {{%[0-9,a-z,A-Z]+}}, ptr %1, ptr %2)
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal swiftcc %swift.metadata_response @"$s15generic_classes11RootGenericCMr"
|
|
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
|
|
// -- initialize the dependent field offsets
|
|
// CHECK: call swiftcc %swift.metadata_response @swift_initClassMetadata2(ptr [[METADATA]], i64 0, i64 3, ptr {{%.*}}, ptr {{%.*}})
|
|
// CHECK: }
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s15generic_classes22RootGenericFixedLayoutCMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
|
|
// CHECK: [[METADATA:%.*]] ={{( tail)?}} call ptr @swift_allocateGenericClassMetadata(ptr {{%[0-9,a-z,A-Z]+}}, ptr %1, ptr %2)
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal swiftcc %swift.metadata_response @"$s15generic_classes22RootGenericFixedLayoutCMr"
|
|
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
|
|
// CHECK: call swiftcc %swift.metadata_response @swift_initClassMetadata2(ptr [[METADATA]], i64 0, i64 3, ptr {{%.*}}, ptr {{%.*}})
|
|
// CHECK: }
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s15generic_classes015GenericInheritsC0CMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
|
|
// Bind the generic parameters.
|
|
// CHECK: %A = load ptr, ptr %1
|
|
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %1, i32 1
|
|
// CHECK: %B = load ptr, ptr [[T1]]
|
|
// Construct the class.
|
|
// CHECK: [[METADATA:%.*]] ={{( tail)?}} call ptr @swift_allocateGenericClassMetadata(ptr {{%[0-9,a-z,A-Z]+}}, ptr %1, ptr %2)
|
|
// CHECK-NEXT: ret ptr [[METADATA]]
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s15generic_classes015GenericInheritsC0CMr"
|
|
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
|
|
|
|
// Initialize our own dependent field offsets.
|
|
// CHECK-objc: [[OFFSETS:%.*]] = getelementptr inbounds i64, ptr [[METADATA]], i64 20
|
|
// CHECK-native: [[OFFSETS:%.*]] = getelementptr inbounds i64, ptr [[METADATA]], i64 17
|
|
// CHECK: [[FIELDS_ADDR:%.*]] = getelementptr inbounds{{.*}} [1 x ptr], ptr %classFields, i32 0, i32 0
|
|
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState(i64 319, ptr %B)
|
|
// CHECK: [[B_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
|
|
// CHECK: [[B_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
|
|
// CHECK: [[B_OK:%.*]] = icmp ule i64 [[B_STATUS]], 63
|
|
// CHECK: br i1 [[B_OK]],
|
|
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[B_CHECKED]], i64 -1
|
|
// CHECK: [[VWT:%.*]] = load ptr, ptr [[T1]], align 8
|
|
// CHECK: [[T0:%.*]] = getelementptr inbounds ptr, ptr %{{[0-9a-zA-Z.]+}}, i32 8
|
|
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[FIELDS_ADDR]], i32 0
|
|
// CHECK: store ptr [[T0]], ptr [[T1]], align 8
|
|
|
|
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(ptr [[METADATA]], i64 0, i64 1, ptr [[FIELDS_ADDR]], ptr [[OFFSETS]])
|
|
// CHECK-NEXT: [[INITDEP_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
|
|
// CHECK-NEXT: [[INITDEP_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
|
|
// CHECK-NEXT: [[INITDEP_PRESENT:%.*]] = icmp eq ptr [[INITDEP_METADATA]], null
|
|
// CHECK-NEXT: br i1 [[INITDEP_PRESENT]],
|
|
|
|
// CHECK: [[DEP:%.*]] = phi ptr [ [[B_CHECKED]], {{.*}} ], [ [[INITDEP_METADATA]], {{.*}} ], [ null, {{.*}} ]
|
|
// CHECK: [[DEP_REQ:%.*]] = phi i64 [ 63, {{.*}} ], [ [[INITDEP_STATUS]], {{.*}} ], [ 0, {{.*}} ]
|
|
// CHECK: [[T0:%.*]] = insertvalue %swift.metadata_response undef, ptr [[DEP]], 0
|
|
// CHECK: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], i64 [[DEP_REQ]], 1
|
|
// CHECK: ret %swift.metadata_response [[T1]]
|
|
// CHECK: }
|
|
|
|
// OSIZE: define hidden swiftcc %swift.metadata_response @"$s15generic_classes11RootGenericCMa"(i64 %0, ptr {{.*}}) [[ATTRS:#[0-9]+]] {{(section)?.*}}{
|
|
// OSIZE: [[ATTRS]] = {{{.*}}noinline
|