15
15
16
16
// CHECK: @_T016class_resilience14ResilientChildC5fields5Int32VvpWvd = {{(protected )?}}global [[INT]] {{8|16}}
17
17
18
+ // CHECK: @_T016class_resilience14ResilientChildCMo = {{(protected )?}}global [[INT]] 0
19
+
20
+ // CHECK: @_T016class_resilience21ResilientGenericChildCMo = {{(protected )?}}global [[INT]] 0
21
+
18
22
// CHECK: @_T016class_resilience26ClassWithResilientPropertyCMo = {{(protected )?}}constant [[INT]] {{52|80}}
19
23
20
24
// CHECK: @_T016class_resilience28ClassWithMyResilientPropertyC1rAA0eF6StructVvpWvd = {{(protected )?}}constant [[INT]] {{8|16}}
23
27
// CHECK: @_T016class_resilience30ClassWithIndirectResilientEnumC1s14resilient_enum10FunnyShapeOvpWvd = {{(protected )?}}constant [[INT]] {{8|16}}
24
28
// CHECK: @_T016class_resilience30ClassWithIndirectResilientEnumC5colors5Int32VvpWvd = {{(protected )?}}constant [[INT]] {{12|24}}
25
29
26
- // CHECK: @_T016class_resilience14ResilientChildCMo = {{(protected )?}}global [[INT]] 0
30
+ // CHECK: [[RESILIENTCHILD_NAME:@.*]] = private constant [36 x i8] c"16class_resilience14ResilientChildC\00"
31
+ // CHECK: [[RESILIENTCHILD_FIELDS:@.*]] = private constant [7 x i8] c"field\00\00"
32
+
33
+ // CHECK: @_T016class_resilience14ResilientChildCMn = {{(protected )?}}constant <{{.*}}> <{
34
+ // -- name:
35
+ // CHECK-SAME: [36 x i8]* [[RESILIENTCHILD_NAME]]
36
+ // -- num fields
37
+ // CHECK-SAME: i32 1,
38
+ // -- field offset vector offset
39
+ // CHECK-SAME: i32 3,
40
+ // -- field names,
41
+ // CHECK-SAME: [7 x i8]* [[RESILIENTCHILD_FIELDS]]
42
+ // -- kind 0 (class)
43
+ // CHECK-SAME: i32 0,
44
+ // -- generic parameter vector offset
45
+ // CHECK-SAME: i32 0,
46
+ // -- generic parameter count, primary count
47
+ // CHECK-SAME: i32 0, i32 0,
48
+ // -- nesting depth
49
+ // CHECK-SAME: i16 1,
50
+ // -- flags -- has vtable, has resilient superclass
51
+ // CHECK-SAME: i16 12,
52
+ // -- generic parameters at depth 0
53
+ // CHECK-SAME: i32 0
54
+ // CHECK-SAME: }>
27
55
28
56
// CHECK: @_T016class_resilience16FixedLayoutChildCMo = {{(protected )?}}global [[INT]] 0
29
57
30
- // CHECK: @_T016class_resilience21ResilientGenericChildCMo = {{(protected )?}}global [[INT]] 0
31
-
32
58
// CHECK: @_T016class_resilience17MyResilientParentCMo = {{(protected )?}}constant [[INT]] {{52|80}}
33
59
34
60
// CHECK: @_T016class_resilience16MyResilientChildCMo = {{(protected )?}}constant [[INT]] {{60|96}}
@@ -101,7 +127,7 @@ public class ClassWithIndirectResilientEnum {
101
127
// offsets is not known at compile time
102
128
103
129
public class ResilientChild : ResilientOutsideParent {
104
- public let field : Int32 = 0
130
+ public var field : Int32 = 0
105
131
}
106
132
107
133
// Superclass is resilient, but the class is fixed-layout.
@@ -110,14 +136,14 @@ public class ResilientChild : ResilientOutsideParent {
110
136
// global.
111
137
112
138
@_fixed_layout public class FixedLayoutChild : ResilientOutsideParent {
113
- public let field : Int32 = 0
139
+ public var field : Int32 = 0
114
140
}
115
141
116
142
// Superclass is resilient, so the number of fields and their
117
143
// offsets is not known at compile time
118
144
119
145
public class ResilientGenericChild < T> : ResilientGenericOutsideParent < T > {
120
- public let field : Int32 = 0
146
+ public var field : Int32 = 0
121
147
}
122
148
123
149
@@ -134,6 +160,12 @@ public class MyResilientChild : MyResilientParent {
134
160
}
135
161
136
162
163
+ extension ResilientGenericOutsideParent {
164
+ public func genericExtensionMethod( ) -> A . Type {
165
+ return A . self
166
+ }
167
+ }
168
+
137
169
// ClassWithResilientProperty.color getter
138
170
139
171
// CHECK-LABEL: define{{( protected)?}} swiftcc i32 @_T016class_resilience26ClassWithResilientPropertyC5colors5Int32Vvg(%T16class_resilience26ClassWithResilientPropertyC* swiftself)
@@ -217,10 +249,35 @@ public class MyResilientChild : MyResilientParent {
217
249
// CHECK-NEXT: call void @swift_endAccess
218
250
// CHECK: ret i32 [[FIELD_VALUE]]
219
251
252
+ // ResilientChild.field getter dispatch thunk
253
+
254
+ // CHECK-LABEL: define{{( protected)?}} swiftcc i32 @_T016class_resilience14ResilientChildC5fields5Int32VvgTj(%T16class_resilience14ResilientChildC* swiftself)
255
+ // CHECK: [[ISA_ADDR:%.*]] = getelementptr inbounds %T16class_resilience14ResilientChildC, %T16class_resilience14ResilientChildC* %0, i32 0, i32 0, i32 0
256
+ // CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
257
+ // CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* @_T016class_resilience14ResilientChildCMo
258
+ // CHECK-NEXT: [[METADATA_BYTES:%.*]] = bitcast %swift.type* [[ISA]] to i8*
259
+ // CHECK-NEXT: [[VTABLE_OFFSET_TMP:%.*]] = getelementptr inbounds i8, i8* [[METADATA_BYTES]], [[INT]] [[BASE]]
260
+ // CHECK-NEXT: [[VTABLE_OFFSET_ADDR:%.*]] = bitcast i8* [[VTABLE_OFFSET_TMP]] to i32 (%T16class_resilience14ResilientChildC*)**
261
+ // CHECK-NEXT: [[METHOD:%.*]] = load i32 (%T16class_resilience14ResilientChildC*)*, i32 (%T16class_resilience14ResilientChildC*)** [[VTABLE_OFFSET_ADDR]]
262
+ // CHECK-NEXT: [[RESULT:%.*]] = call swiftcc i32 [[METHOD]](%T16class_resilience14ResilientChildC* swiftself %0)
263
+ // CHECK-NEXT: ret i32 [[RESULT]]
264
+
265
+ // ResilientChild.field setter dispatch thunk
266
+
267
+ // CHECK-LABEL: define{{( protected)?}} swiftcc void @_T016class_resilience14ResilientChildC5fields5Int32VvsTj(i32, %T16class_resilience14ResilientChildC* swiftself)
268
+ // CHECK: [[ISA_ADDR:%.*]] = getelementptr inbounds %T16class_resilience14ResilientChildC, %T16class_resilience14ResilientChildC* %1, i32 0, i32 0, i32 0
269
+ // CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
270
+ // CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* @_T016class_resilience14ResilientChildCMo
271
+ // CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{4|8}}
272
+ // CHECK-NEXT: [[METADATA_BYTES:%.*]] = bitcast %swift.type* [[ISA]] to i8*
273
+ // CHECK-NEXT: [[VTABLE_OFFSET_TMP:%.*]] = getelementptr inbounds i8, i8* [[METADATA_BYTES]], [[INT]] [[METADATA_OFFSET]]
274
+ // CHECK-NEXT: [[VTABLE_OFFSET_ADDR:%.*]] = bitcast i8* [[VTABLE_OFFSET_TMP]] to void (i32, %T16class_resilience14ResilientChildC*)**
275
+ // CHECK-NEXT: [[METHOD:%.*]] = load void (i32, %T16class_resilience14ResilientChildC*)*, void (i32, %T16class_resilience14ResilientChildC*)** [[VTABLE_OFFSET_ADDR]]
276
+ // CHECK-NEXT: call swiftcc void [[METHOD]](i32 %0, %T16class_resilience14ResilientChildC* swiftself %1)
277
+ // CHECK-NEXT: ret void
220
278
221
279
// ResilientGenericChild.field getter
222
280
223
-
224
281
// CHECK-LABEL: define{{( protected)?}} swiftcc i32 @_T016class_resilience21ResilientGenericChildC5fields5Int32Vvg(%T16class_resilience21ResilientGenericChildC* swiftself)
225
282
226
283
// FIXME: we could eliminate the unnecessary isa load by lazily emitting
@@ -230,8 +287,11 @@ public class MyResilientChild : MyResilientParent {
230
287
231
288
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds %T16class_resilience21ResilientGenericChildC, %T16class_resilience21ResilientGenericChildC* %0, i32 0, i32 0, i32 0
232
289
// CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ADDR]]
233
- // CHECK-NEXT: [[ISA_ADDR:%.*]] = bitcast %swift.type* [[ISA]] to [[INT]]*
234
- // CHECK-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] {{11|14}}
290
+ // CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* @_T016class_resilience21ResilientGenericChildCMo
291
+ // CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{16|32}}
292
+ // CHECK-NEXT: [[ISA_ADDR:%.*]] = bitcast %swift.type* [[ISA]] to i8*
293
+ // CHECK-NEXT: [[FIELD_OFFSET_TMP:%.*]] = getelementptr inbounds i8, i8* [[ISA_ADDR]], [[INT]] [[METADATA_OFFSET]]
294
+ // CHECK-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = bitcast i8* [[FIELD_OFFSET_TMP]] to [[INT]]*
235
295
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* [[FIELD_OFFSET_ADDR:%.*]]
236
296
// CHECK-NEXT: [[OBJECT:%.*]] = bitcast %T16class_resilience21ResilientGenericChildC* %0 to i8*
237
297
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, i8* [[OBJECT]], [[INT]] [[FIELD_OFFSET]]
@@ -254,6 +314,19 @@ public class MyResilientChild : MyResilientParent {
254
314
// CHECK: ret i32 [[RESULT]]
255
315
256
316
317
+ // ResilientGenericOutsideParent.genericExtensionMethod()
318
+
319
+ // CHECK-LABEL: define{{( protected)?}} swiftcc %swift.type* @_T015resilient_class29ResilientGenericOutsideParentC0B11_resilienceE22genericExtensionMethodxmyF(%T15resilient_class29ResilientGenericOutsideParentC* swiftself) #0 {
320
+ // CHECK: [[ISA_ADDR:%.*]] = bitcast %T15resilient_class29ResilientGenericOutsideParentC* %0 to %swift.type**
321
+ // CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
322
+ // CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* @_T015resilient_class29ResilientGenericOutsideParentCMo
323
+ // CHECK-NEXT: [[GENERIC_PARAM_OFFSET:%.*]] = add [[INT]] [[BASE]], 0
324
+ // CHECK-NEXT: [[ISA_TMP:%.*]] = bitcast %swift.type* [[ISA]] to i8*
325
+ // CHECK-NEXT: [[GENERIC_PARAM_TMP:%.*]] = getelementptr inbounds i8, i8* [[ISA_TMP]], [[INT]] [[GENERIC_PARAM_OFFSET]]
326
+ // CHECK-NEXT: [[GENERIC_PARAM_ADDR:%.*]] = bitcast i8* [[GENERIC_PARAM_TMP]] to %swift.type**
327
+ // CHECK-NEXT: [[GENERIC_PARAM:%.*]] = load %swift.type*, %swift.type** [[GENERIC_PARAM_ADDR]]
328
+ // CHECK-NEXT: ret %swift.type* [[GENERIC_PARAM]]
329
+
257
330
// ClassWithResilientProperty metadata initialization function
258
331
259
332
@@ -306,7 +379,7 @@ public class MyResilientChild : MyResilientParent {
306
379
// CHECK: store %swift.type* [[SUPER]], %swift.type** getelementptr inbounds ({{.*}})
307
380
308
381
// Relocate metadata if necessary...
309
- // CHECK: call %swift.type* @swift_relocateClassMetadata(%swift.type* {{.*}}, [[INT]] {{60|96}}, [[INT]] 1 )
382
+ // CHECK: call %swift.type* @swift_relocateClassMetadata(%swift.type* {{.*}}, [[INT]] {{60|96}}, [[INT]] 4 )
310
383
311
384
// CHECK: ret void
312
385
@@ -327,7 +400,7 @@ public class MyResilientChild : MyResilientParent {
327
400
// CHECK: store %swift.type* [[SUPER]], %swift.type** getelementptr inbounds ({{.*}})
328
401
329
402
// Relocate metadata if necessary...
330
- // CHECK: call %swift.type* @swift_relocateClassMetadata(%swift.type* {{.*}}, [[INT]] {{60|96}}, [[INT]] 1 )
403
+ // CHECK: call %swift.type* @swift_relocateClassMetadata(%swift.type* {{.*}}, [[INT]] {{60|96}}, [[INT]] 4 )
331
404
332
405
// CHECK: ret void
333
406
@@ -345,5 +418,5 @@ public class MyResilientChild : MyResilientParent {
345
418
// Initialize class metadata base offset...
346
419
// CHECK: store [[INT]] {{.*}}, [[INT]]* @_T016class_resilience21ResilientGenericChildCMo
347
420
348
- // CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_pattern* %0, i8** %1, %objc_class* [[SUPER_TMP]], [[INT]] 2 )
421
+ // CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_pattern* %0, i8** %1, %objc_class* [[SUPER_TMP]], [[INT]] 5 )
349
422
// CHECK: ret %swift.type* [[METADATA]]
0 commit comments