Skip to content

Commit 0902741

Browse files
committed
IRGen: Emit field offsets before vtable entries
We want to be able to define classes with a fixed storage layout, but a resilient (opaque) vtable. If the class is also generic, we still have to load field offsets from the metadata if they are dependent. So put the field offsets after the generic arguments and before the vtable. This is an ABI break for @_fixed_layout classes, which are defined by the stdlib.
1 parent fcb5217 commit 0902741

12 files changed

+91
-91
lines changed

lib/IRGen/ClassMetadataVisitor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ template <class Impl> class ClassMetadataVisitor
123123
if (IGM.isResilient(theClass, ResilienceExpansion::Maximal))
124124
return;
125125

126-
// Add vtable entries.
127-
asImpl().addVTableEntries(theClass);
128-
129126
// A class only really *needs* a field-offset vector in the
130127
// metadata if:
131128
// - it's in a generic context and
@@ -145,6 +142,9 @@ template <class Impl> class ClassMetadataVisitor
145142
addFieldEntries(field);
146143
}
147144
asImpl().noteEndOfFieldOffsets(theClass);
145+
146+
// Add vtable entries.
147+
asImpl().addVTableEntries(theClass);
148148
}
149149

150150
private:

test/IRGen/class_metadata.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class A {}
2424
// Field count.
2525
// CHECK-SAME: i32 0,
2626
// Field offset vector offset.
27-
// CHECK-32-SAME: i32 14,
28-
// CHECK-64-SAME: i32 11,
27+
// CHECK-32-SAME: i32 13,
28+
// CHECK-64-SAME: i32 10,
2929
// V-table offset.
3030
// CHECK-32-SAME: i32 13,
3131
// CHECK-64-SAME: i32 10,

test/IRGen/class_resilience.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
// -- num fields:
5353
// CHECK-SAME: i32 1,
5454
// -- field offset vector offset:
55-
// CHECK-SAME: i32 3,
55+
// CHECK-SAME: i32 0,
5656
// -- superclass:
5757
// CHECK-SAME: @"got.$s15resilient_class22ResilientOutsideParentCMn"
5858
// -- singleton metadata initialization cache:
@@ -357,7 +357,7 @@ extension ResilientGenericOutsideParent {
357357
// CHECK: [[ADDR:%.*]] = getelementptr inbounds %T16class_resilience21ResilientGenericChildC, %T16class_resilience21ResilientGenericChildC* %0, i32 0, i32 0, i32 0
358358
// CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ADDR]]
359359
// CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[BOUNDS]], [[BOUNDS]]* @"$s16class_resilience21ResilientGenericChildCMo", i32 0, i32 0)
360-
// CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{16|32}}
360+
// CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{4|8}}
361361
// CHECK-NEXT: [[ISA_ADDR:%.*]] = bitcast %swift.type* [[ISA]] to i8*
362362
// CHECK-NEXT: [[FIELD_OFFSET_TMP:%.*]] = getelementptr inbounds i8, i8* [[ISA_ADDR]], [[INT]] [[METADATA_OFFSET]]
363363
// CHECK-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = bitcast i8* [[FIELD_OFFSET_TMP]] to [[INT]]*
@@ -401,7 +401,7 @@ extension ResilientGenericOutsideParent {
401401
// CHECK: entry:
402402
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [3 x i8**]
403403
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
404-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{11|14}}
404+
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
405405
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [3 x i8**]* [[FIELDS]] to i8*
406406
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{12|24}}, i8* [[FIELDS_ADDR]])
407407
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [3 x i8**], [3 x i8**]* [[FIELDS]], i32 0, i32 0
@@ -449,7 +449,7 @@ extension ResilientGenericOutsideParent {
449449
// CHECK: entry:
450450
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [2 x i8**]
451451
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
452-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{11|14}}
452+
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
453453
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [2 x i8**]* [[FIELDS]] to i8*
454454
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{8|16}}, i8* [[FIELDS_ADDR]])
455455
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [2 x i8**], [2 x i8**]* [[FIELDS]], i32 0, i32 0
@@ -516,7 +516,7 @@ extension ResilientGenericOutsideParent {
516516
// CHECK: [[ISA_ADDR:%.*]] = getelementptr inbounds %T16class_resilience14ResilientChildC, %T16class_resilience14ResilientChildC* %1, i32 0, i32 0, i32 0
517517
// CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
518518
// CHECK-NEXT: [[BASE:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[BOUNDS]], [[BOUNDS]]* @"$s16class_resilience14ResilientChildCMo", i32 0, i32 0)
519-
// CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{4|8}}
519+
// CHECK-NEXT: [[METADATA_OFFSET:%.*]] = add [[INT]] [[BASE]], {{8|16}}
520520
// CHECK-NEXT: [[METADATA_BYTES:%.*]] = bitcast %swift.type* [[ISA]] to i8*
521521
// CHECK-NEXT: [[VTABLE_OFFSET_TMP:%.*]] = getelementptr inbounds i8, i8* [[METADATA_BYTES]], [[INT]] [[METADATA_OFFSET]]
522522
// CHECK-NEXT: [[VTABLE_OFFSET_ADDR:%.*]] = bitcast i8* [[VTABLE_OFFSET_TMP]] to void (i32, %T16class_resilience14ResilientChildC*)**

test/IRGen/class_resilience_objc.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ public class GenericObjCSubclass<T> : NSCoder {
7171

7272
// CHECK-NEXT: [[ISA_ADDR:%.*]] = bitcast %swift.type* [[ISA]] to [[INT]]*
7373

74-
// CHECK-32-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 16
74+
// CHECK-32-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 15
7575

76-
// CHECK-64-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 13
76+
// CHECK-64-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 12
7777

7878
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* [[FIELD_OFFSET_ADDR:%.*]]
7979
// CHECK-NEXT: [[OBJECT:%.*]] = bitcast %T21class_resilience_objc19GenericObjCSubclassC* %0 to i8*

test/IRGen/completely_fragile_class_layout.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ bb0(%0 : @guaranteed $ClassWithResilientField):
216216
// CHECK: entry:
217217
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [3 x i8**]
218218
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
219-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{11|14}}
219+
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
220220
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [3 x i8**]* [[FIELDS]] to i8*
221221
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{12|24}}, i8* [[FIELDS_ADDR]])
222222
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [3 x i8**], [3 x i8**]* [[FIELDS]], i32 0, i32 0

test/IRGen/generic_classes.sil

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ import Swift
2828
// -- num fields
2929
// CHECK-SAME: i32 3,
3030
// -- field offset vector offset
31-
// CHECK-SAME: i32 15,
31+
// CHECK-SAME: i32 11,
3232
// -- template instantiation cache
3333
// CHECK-SAME: [16 x i8*]* @"$s15generic_classes11RootGenericCMI"
3434
// -- template instantiation pattern
3535
// CHECK-SAME: @"$s15generic_classes11RootGenericCMP"
3636
// -- generic parameters, requirements, key arguments, extra arguments
3737
// CHECK-SAME: i16 1, i16 0, i16 1, i16 0
3838
// -- vtable offset
39-
// CHECK-SAME: i32 11,
39+
// CHECK-SAME: i32 14,
4040
// -- vtable size
4141
// CHECK-SAME: i32 4
4242
// CHECK-SAME: }
@@ -86,7 +86,7 @@ import Swift
8686
// -- num fields
8787
// CHECK-SAME: i32 3,
8888
// -- -- field offset vector offset
89-
// CHECK-SAME: i32 11,
89+
// CHECK-SAME: i32 10,
9090
// CHECK-SAME: }>
9191

9292
// CHECK: @"$s15generic_classes14RootNonGenericCMf" = internal global <{ {{.*}} }> <{
@@ -274,7 +274,7 @@ entry(%c : @unowned $RootGeneric<F>):
274274
// RootGeneric.y has dependent layout; load the offset from the metadata
275275
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @RootGeneric_concrete_fragile_dependent_member_access_y
276276
// CHECK: [[TYPE_METADATA_ARRAY:%.*]] = bitcast %swift.type* {{%.*}} to i64*
277-
// CHECK: [[Y_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, i64* [[TYPE_METADATA_ARRAY]], i64 16
277+
// CHECK: [[Y_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, i64* [[TYPE_METADATA_ARRAY]], i64 12
278278
// CHECK: [[Y_OFFSET:%.*]] = load i64, i64* [[Y_OFFSET_ADDR]], align 8
279279
// CHECK: [[CLASS_BYTE_ARRAY:%.*]] = bitcast [[ROOTGENERIC]]* {{%.*}} to i8*
280280
// CHECK: [[Y_ADDR:%.*]] = getelementptr inbounds i8, i8* [[CLASS_BYTE_ARRAY]], i64 [[Y_OFFSET]]
@@ -301,7 +301,7 @@ entry(%z : @trivial $*Int, %c : @unowned $RootGeneric<Int>):
301301
// RootGeneric.z has dependent layout; load the offset from the metadata
302302
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @RootGeneric_concrete_fragile_dependent_member_access_z
303303
// CHECK: [[TYPE_METADATA_ARRAY:%.*]] = bitcast %swift.type* {{%.*}} to i64*
304-
// CHECK: [[Z_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, i64* [[TYPE_METADATA_ARRAY]], i64 17
304+
// CHECK: [[Z_OFFSET_ADDR:%.*]] = getelementptr inbounds i64, i64* [[TYPE_METADATA_ARRAY]], i64 13
305305
// CHECK: [[Z_OFFSET:%.*]] = load i64, i64* [[Z_OFFSET_ADDR]], align 8
306306
// CHECK: [[CLASS_BYTE_ARRAY:%.*]] = bitcast [[ROOTGENERIC]]* {{%.*}} to i8*
307307
// CHECK: [[Z_ADDR:%.*]] = getelementptr inbounds i8, i8* [[CLASS_BYTE_ARRAY]], i64 [[Z_OFFSET]]
@@ -371,7 +371,7 @@ entry(%c : $RootGeneric<Int32>):
371371

372372
// Initialize our own dependent field offsets.
373373
// CHECK: [[METADATA_ARRAY:%.*]] = bitcast %swift.type* [[METADATA]] to i64*
374-
// CHECK: [[OFFSETS:%.*]] = getelementptr inbounds i64, i64* [[METADATA_ARRAY]], i64 23
374+
// CHECK: [[OFFSETS:%.*]] = getelementptr inbounds i64, i64* [[METADATA_ARRAY]], i64 20
375375
// CHECK: [[FIELDS_ADDR:%.*]] = getelementptr inbounds [1 x i8**], [1 x i8**]* %classFields, i32 0, i32 0
376376
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState(i64 319, %swift.type* %B)
377377
// CHECK: [[B_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0

test/IRGen/generic_types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
// -- num fields
2727
// CHECK-SAME: i32 1,
2828
// -- field offset vector offset
29-
// CHECK-SAME: i32 16,
29+
// CHECK-SAME: i32 11,
3030
// -- instantiation cache
3131
// CHECK-SAME: @"$s13generic_types1ACMI"
3232
// -- instantiation pattern

test/IRGen/mixed_mode_class_with_unimportable_fields.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ public func accessFinalFields(ofSub holder: SubButtHolder) -> (Any, Any, Any) {
7979

8080
// CHECK-LABEL: define {{(protected )?}}{{(dllexport )?}}swiftcc void @"$s4main12invokeMethod2onyAA13SubButtHolderC_tF"
8181
public func invokeMethod(on holder: SubButtHolder) {
82-
// CHECK-64: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 10
83-
// CHECK-32: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 13
82+
// CHECK-64: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 13
83+
// CHECK-32: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 16
8484
// CHECK: [[IMPL:%.*]] = load {{.*}} [[IMPL_ADDR]]
8585
// CHECK: call swiftcc void [[IMPL]]
8686
holder.virtual()
87-
// CHECK-64: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 15
88-
// CHECK-32: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 18
87+
// CHECK-64: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 16
88+
// CHECK-32: [[IMPL_ADDR:%.*]] = getelementptr inbounds {{.*}}, [[WORD]] 19
8989
// CHECK: [[IMPL:%.*]] = load {{.*}} [[IMPL_ADDR]]
9090
// CHECK: call swiftcc void [[IMPL]]
9191
holder.subVirtual()

test/IRGen/objc_class_export.swift

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,50 +16,50 @@
1616
// CHECK-DAG: [[OBJC:%objc_object]] = type opaque
1717

1818
// CHECK: @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" = hidden global %objc_class {
19-
// CHECK: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
20-
// CHECK: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
21-
// CHECK: %swift.opaque* @_objc_empty_cache,
22-
// CHECK: %swift.opaque* null,
23-
// CHECK: i64 ptrtoint ({{.*}}* @_METACLASS_DATA__TtC17objc_class_export3Foo to i64)
24-
// CHECK: }
19+
// CHECK-SAME: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
20+
// CHECK-SAME: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
21+
// CHECK-SAME: %swift.opaque* @_objc_empty_cache,
22+
// CHECK-SAME: %swift.opaque* null,
23+
// CHECK-SAME: i64 ptrtoint ({{.*}}* @_METACLASS_DATA__TtC17objc_class_export3Foo to i64)
24+
// CHECK-SAME: }
2525
// CHECK: [[FOO_NAME:@.*]] = private unnamed_addr constant [28 x i8] c"_TtC17objc_class_export3Foo\00"
2626
// CHECK: @_METACLASS_DATA__TtC17objc_class_export3Foo = private constant {{.*\*}} } {
27-
// CHECK: i32 129,
28-
// CHECK: i32 40,
29-
// CHECK: i32 40,
30-
// CHECK: i32 0,
31-
// CHECK: i8* null,
32-
// CHECK: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
33-
// CHECK: @_CLASS_METHODS__TtC17objc_class_export3Foo,
34-
// CHECK: i8* null,
35-
// CHECK: i8* null,
36-
// CHECK: i8* null,
37-
// CHECK: i8* null
38-
// CHECK: }, section "__DATA, __objc_const", align 8
27+
// CHECK-SAME: i32 129,
28+
// CHECK-SAME: i32 40,
29+
// CHECK-SAME: i32 40,
30+
// CHECK-SAME: i32 0,
31+
// CHECK-SAME: i8* null,
32+
// CHECK-SAME: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
33+
// CHECK-SAME: @_CLASS_METHODS__TtC17objc_class_export3Foo,
34+
// CHECK-SAME: i8* null,
35+
// CHECK-SAME: i8* null,
36+
// CHECK-SAME: i8* null,
37+
// CHECK-SAME: i8* null
38+
// CHECK-SAME: }, section "__DATA, __objc_const", align 8
3939
// CHECK: @_DATA__TtC17objc_class_export3Foo = private constant {{.*\*}} } {
40-
// CHECK: i32 128,
41-
// CHECK: i32 16,
42-
// CHECK: i32 24,
43-
// CHECK: i32 0,
44-
// CHECK: i8* null,
45-
// CHECK: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
46-
// CHECK: { i32, i32, [6 x { i8*, i8*, i8* }] }* @_INSTANCE_METHODS__TtC17objc_class_export3Foo,
47-
// CHECK: i8* null,
48-
// CHECK: @_IVARS__TtC17objc_class_export3Foo,
49-
// CHECK: i8* null,
50-
// CHECK: _PROPERTIES__TtC17objc_class_export3Foo
51-
// CHECK: }, section "__DATA, __objc_const", align 8
52-
// CHECK: @"$s17objc_class_export3FooCMf" = internal global <{{.*i64}} }> <{
53-
// CHECK: void ([[FOO]]*)* @"$s17objc_class_export3FooCfD",
54-
// CHECK: i8** @"$sBOWV",
55-
// CHECK: i64 ptrtoint (%objc_class* @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" to i64),
56-
// CHECK: %objc_class* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
57-
// CHECK: %swift.opaque* @_objc_empty_cache,
58-
// CHECK: %swift.opaque* null,
59-
// CHECK: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC17objc_class_export3Foo to i64), i64 1),
60-
// CHECK: [[FOO]]* (%swift.type*)* @"$s17objc_class_export3FooC6createACyFZ",
61-
// CHECK: void (double, double, double, double, [[FOO]]*)* @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"
62-
// CHECK: }>, section "__DATA,__objc_data, regular"
40+
// CHECK-SAME: i32 128,
41+
// CHECK-SAME: i32 16,
42+
// CHECK-SAME: i32 24,
43+
// CHECK-SAME: i32 0,
44+
// CHECK-SAME: i8* null,
45+
// CHECK-SAME: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
46+
// CHECK-SAME: { i32, i32, [6 x { i8*, i8*, i8* }] }* @_INSTANCE_METHODS__TtC17objc_class_export3Foo,
47+
// CHECK-SAME: i8* null,
48+
// CHECK-SAME: @_IVARS__TtC17objc_class_export3Foo,
49+
// CHECK-SAME: i8* null,
50+
// CHECK-SAME: _PROPERTIES__TtC17objc_class_export3Foo
51+
// CHECK-SAME: }, section "__DATA, __objc_const", align 8
52+
// CHECK: @"$s17objc_class_export3FooCMf" = internal global <{{.*}} }> <{
53+
// CHECK-SAME: void ([[FOO]]*)* @"$s17objc_class_export3FooCfD",
54+
// CHECK-SAME: i8** @"$sBOWV",
55+
// CHECK-SAME: i64 ptrtoint (%objc_class* @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" to i64),
56+
// CHECK-SAME: %objc_class* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
57+
// CHECK-SAME: %swift.opaque* @_objc_empty_cache,
58+
// CHECK-SAME: %swift.opaque* null,
59+
// CHECK-SAME: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC17objc_class_export3Foo to i64), i64 1),
60+
// CHECK-SAME: [[FOO]]* (%swift.type*)* @"$s17objc_class_export3FooC6createACyFZ",
61+
// CHECK-SAME: void (double, double, double, double, [[FOO]]*)* @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"
62+
// CHECK-SAME: }>, section "__DATA,__objc_data, regular"
6363
// -- TODO: The OBJC_CLASS symbol should reflect the qualified runtime name of
6464
// Foo.
6565
// CHECK: @"$s17objc_class_export3FooCN" = hidden alias %swift.type, bitcast (i64* getelementptr inbounds ({{.*}} @"$s17objc_class_export3FooCMf", i32 0, i32 2) to %swift.type*)

test/IRGen/objc_super.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class GenericRuncer<T> : Gizmo {
9797
// CHECK: [[CLASS:%.*]] = and i64 [[ISA]], [[ISAMASK]]
9898
// CHECK: [[TY:%.*]] = inttoptr i64 [[CLASS]] to %swift.type*
9999
// CHECK: [[CAST:%.*]] = bitcast %swift.type* [[TY]] to i64*
100-
// CHECK: [[OFFSETADDR:%.*]] = getelementptr inbounds i64, i64* [[CAST]], i64 17
100+
// CHECK: [[OFFSETADDR:%.*]] = getelementptr inbounds i64, i64* [[CAST]], i64 11
101101
// CHECK: [[FIELDOFFSET:%.*]] = load i64, i64* [[OFFSETADDR]]
102102
// CHECK: [[BYTEADDR:%.*]] = bitcast %T10objc_super13GenericRuncerC* %0 to i8*
103103
// CHECK: [[FIELDADDR:%.*]] = getelementptr inbounds i8, i8* [[BYTEADDR]], i64 [[FIELDOFFSET]]

test/IRGen/subclass.swift

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,30 @@
1010
// CHECK-DAG: [[INT:%TSi]] = type <{ i64 }>
1111
// CHECK-DAG: [[B:%T8subclass1BC]] = type <{ [[REF]], [[INT]], [[INT]], [[INT]] }>
1212

13-
// CHECK: @_DATA__TtC8subclass1A = private constant {{.*\* } }}{
14-
// CHECK: @"$s8subclass1ACMf" = internal global [[A_METADATA:<{.*i64 }>]] <{
15-
// CHECK: void ([[A]]*)* @"$s8subclass1ACfD",
16-
// CHECK: i8** @"$sBoWV",
17-
// CHECK: i64 ptrtoint ([[OBJC_CLASS]]* @"$s8subclass1ACMm" to i64),
18-
// CHECK: [[OBJC_CLASS]]* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
19-
// CHECK: [[OPAQUE]]* @_objc_empty_cache,
20-
// CHECK: [[OPAQUE]]* null,
21-
// CHECK: i64 add (i64 ptrtoint ({ {{.*}} }* @_DATA__TtC8subclass1A to i64), i64 1),
22-
// CHECK: i64 ([[A]]*)* @"$s8subclass1AC1fSiyF",
23-
// CHECK: [[A]]* ([[TYPE]]*)* @"$s8subclass1AC1gACyFZ"
24-
// CHECK: }>
25-
// CHECK: @_DATA__TtC8subclass1B = private constant {{.*\* } }}{
13+
// CHECK: @_DATA__TtC8subclass1A = private constant {{.* } }}{
14+
// CHECK: @"$s8subclass1ACMf" = internal global [[A_METADATA:<{.* }>]] <{
15+
// CHECK-SAME: void ([[A]]*)* @"$s8subclass1ACfD",
16+
// CHECK-SAME: i8** @"$sBoWV",
17+
// CHECK-SAME: i64 ptrtoint ([[OBJC_CLASS]]* @"$s8subclass1ACMm" to i64),
18+
// CHECK-SAME: [[OBJC_CLASS]]* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
19+
// CHECK-SAME: [[OPAQUE]]* @_objc_empty_cache,
20+
// CHECK-SAME: [[OPAQUE]]* null,
21+
// CHECK-SAME: i64 add (i64 ptrtoint ({ {{.*}} }* @_DATA__TtC8subclass1A to i64), i64 1),
22+
// CHECK-SAME: i64 ([[A]]*)* @"$s8subclass1AC1fSiyF",
23+
// CHECK-SAME: [[A]]* ([[TYPE]]*)* @"$s8subclass1AC1gACyFZ"
24+
// CHECK-SAME: }>
25+
// CHECK: @_DATA__TtC8subclass1B = private constant {{.* } }}{
2626
// CHECK: @"$s8subclass1BCMf" = internal global <{ {{.*}} }> <{
27-
// CHECK: void ([[B]]*)* @"$s8subclass1BCfD",
28-
// CHECK: i8** @"$sBoWV",
29-
// CHECK: i64 ptrtoint ([[OBJC_CLASS]]* @"$s8subclass1BCMm" to i64),
30-
// CHECK: [[TYPE]]* {{.*}} @"$s8subclass1ACMf",
31-
// CHECK: [[OPAQUE]]* @_objc_empty_cache,
32-
// CHECK: [[OPAQUE]]* null,
33-
// CHECK: i64 add (i64 ptrtoint ({ {{.*}} }* @_DATA__TtC8subclass1B to i64), i64 1),
34-
// CHECK: i64 ([[B]]*)* @"$s8subclass1BC1fSiyF",
35-
// CHECK: [[A]]* ([[TYPE]]*)* @"$s8subclass1AC1gACyFZ"
36-
// CHECK: }>
27+
// CHECK-SAME: void ([[B]]*)* @"$s8subclass1BCfD",
28+
// CHECK-SAME: i8** @"$sBoWV",
29+
// CHECK-SAME: i64 ptrtoint ([[OBJC_CLASS]]* @"$s8subclass1BCMm" to i64),
30+
// CHECK-SAME: [[TYPE]]* {{.*}} @"$s8subclass1ACMf",
31+
// CHECK-SAME: [[OPAQUE]]* @_objc_empty_cache,
32+
// CHECK-SAME: [[OPAQUE]]* null,
33+
// CHECK-SAME: i64 add (i64 ptrtoint ({ {{.*}} }* @_DATA__TtC8subclass1B to i64), i64 1),
34+
// CHECK-SAME: i64 ([[B]]*)* @"$s8subclass1BC1fSiyF",
35+
// CHECK-SAME: [[A]]* ([[TYPE]]*)* @"$s8subclass1AC1gACyFZ"
36+
// CHECK-SAME: }>
3737
// CHECK: @objc_classes = internal global [2 x i8*] [i8* {{.*}} @"$s8subclass1ACN" {{.*}}, i8* {{.*}} @"$s8subclass1BCN" {{.*}}]
3838

3939
class A {

test/Serialization/Recovery/typedefs.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ func testSymbols() {
3131

3232
// CHECK-IR-LABEL: define{{.*}} void @"$s8typedefs18testVTableBuilding4usery3Lib4UserC_tF
3333
public func testVTableBuilding(user: User) {
34-
// The important thing in this CHECK line is the "i64 30", which is the offset
34+
// The important thing in this CHECK line is the "i64 28", which is the offset
3535
// for the vtable slot for 'lastMethod()'. If the layout here
3636
// changes, please check that offset is still correct.
3737
// CHECK-IR-NOT: ret
38-
// CHECK-IR: getelementptr inbounds void (%T3Lib4UserC*)*, void (%T3Lib4UserC*)** %{{[0-9]+}}, {{i64 26|i32 29}}
38+
// CHECK-IR: getelementptr inbounds void (%T3Lib4UserC*)*, void (%T3Lib4UserC*)** %{{[0-9]+}}, {{i64 28|i32 31}}
3939
_ = user.lastMethod()
4040
} // CHECK-IR: ret void
4141

0 commit comments

Comments
 (0)