Skip to content

Commit 97c89d8

Browse files
davezarzyckicompnerd
authored andcommitted
Remove three ObjC fields from non-ObjC runtime
1 parent 18d4f63 commit 97c89d8

21 files changed

+188
-115
lines changed

include/swift/ABI/Metadata.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,9 +1012,12 @@ struct TargetAnyClassMetadata : public TargetHeapMetadata<Runtime> {
10121012

10131013
constexpr TargetAnyClassMetadata(TargetClassMetadata<Runtime> *superclass)
10141014
: TargetHeapMetadata<Runtime>(MetadataKind::Class),
1015-
Superclass(superclass),
1016-
CacheData{nullptr, nullptr},
1017-
Data(SWIFT_CLASS_IS_SWIFT_MASK) {}
1015+
Superclass(superclass)
1016+
#if SWIFT_OBJC_INTEROP
1017+
, CacheData{nullptr, nullptr},
1018+
Data(SWIFT_CLASS_IS_SWIFT_MASK)
1019+
#endif
1020+
{}
10181021

10191022
#if SWIFT_OBJC_INTEROP
10201023
// Allow setting the metadata kind to a class ISA on class metadata.
@@ -1027,8 +1030,7 @@ struct TargetAnyClassMetadata : public TargetHeapMetadata<Runtime> {
10271030
/// The metadata for the superclass. This is null for the root class.
10281031
ConstTargetMetadataPointer<Runtime, swift::TargetClassMetadata> Superclass;
10291032

1030-
// TODO: remove the CacheData and Data fields in non-ObjC-interop builds.
1031-
1033+
#if SWIFT_OBJC_INTEROP
10321034
/// The cache data is used for certain dynamic lookups; it is owned
10331035
/// by the runtime and generally needs to interoperate with
10341036
/// Objective-C's use.
@@ -1043,11 +1045,16 @@ struct TargetAnyClassMetadata : public TargetHeapMetadata<Runtime> {
10431045
static constexpr StoredPointer offsetToData() {
10441046
return offsetof(TargetAnyClassMetadata, Data);
10451047
}
1048+
#endif
10461049

10471050
/// Is this object a valid swift type metadata? That is, can it be
10481051
/// safely downcast to ClassMetadata?
10491052
bool isTypeMetadata() const {
1053+
#if SWIFT_OBJC_INTEROP
10501054
return (Data & SWIFT_CLASS_IS_SWIFT_MASK);
1055+
#else
1056+
return true;
1057+
#endif
10511058
}
10521059
/// A different perspective on the same bit
10531060
bool isPureObjC() const {
@@ -1270,6 +1277,7 @@ struct TargetClassMetadata : public TargetAnyClassMetadata<Runtime> {
12701277
return bounds;
12711278
}
12721279

1280+
#if SWIFT_OBJC_INTEROP
12731281
/// Given a statically-emitted metadata template, this sets the correct
12741282
/// "is Swift" bit for the current runtime. Depending on the deployment
12751283
/// target a binary was compiled for, statically emitted metadata templates
@@ -1294,6 +1302,7 @@ struct TargetClassMetadata : public TargetAnyClassMetadata<Runtime> {
12941302

12951303
assert(isTypeMetadata());
12961304
}
1305+
#endif
12971306

12981307
bool isCanonicalStaticallySpecializedGenericMetadata() const {
12991308
auto *description = getDescription();

include/swift/Remote/MetadataReader.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2623,6 +2623,7 @@ class MetadataReader {
26232623
// WARNING: the following algorithm works on current modern Apple
26242624
// runtimes but is not actually ABI. But it is pretty reliable.
26252625

2626+
#if SWIFT_OBJC_INTEROP
26262627
StoredPointer dataPtr;
26272628
if (!Reader->readInteger(RemoteAddress(classAddress +
26282629
TargetClassMetadata<Runtime>::offsetToData()),
@@ -2665,6 +2666,9 @@ class MetadataReader {
26652666
}
26662667

26672668
return dataPtr;
2669+
#else
2670+
return StoredPointer();
2671+
#endif
26682672
}
26692673

26702674
IsaEncodingKind getIsaEncoding() {

lib/IRGen/ClassMetadataVisitor.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,13 @@ template <class Impl> class ClassMetadataVisitor
5858
// Metadata header.
5959
super::layout();
6060

61-
// ClassMetadata header. In ObjCInterop mode, this must be
62-
// layout-compatible with an Objective-C class. The superclass
63-
// pointer is useful regardless of mode, but the rest of the data
64-
// isn't necessary.
65-
// FIXME: Figure out what can be removed altogether in non-objc-interop
66-
// mode and remove it. rdar://problem/18801263
61+
// ClassMetadata header. This must be layout-compatible with Objective-C
62+
// classes when interoperability is enabled.
6763
asImpl().addSuperclass();
68-
asImpl().addClassCacheData();
69-
asImpl().addClassDataPointer();
64+
if (IGM.ObjCInterop) {
65+
asImpl().addClassCacheData();
66+
asImpl().addClassDataPointer();
67+
}
7068

7169
asImpl().addClassFlags();
7270
asImpl().addInstanceAddressPoint();

stdlib/public/runtime/Metadata.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ Metadata *TargetSingletonMetadataInitialization<InProcess>::allocate(
114114
// isn't Swift metadata but a plain old ObjC class instead.
115115
if (metadata->getKind() == MetadataKind::Class) {
116116
auto *classMetadata = static_cast<ClassMetadata*>(metadata);
117+
#if SWIFT_OBJC_INTEROP
117118
classMetadata->setAsTypeMetadata();
119+
#endif
118120
auto *fullMetadata = asFullMetadata(metadata);
119121

120122
// Begin by initializing the value witness table; everything else is
@@ -537,8 +539,6 @@ initializeClassMetadataFromPattern(ClassMetadata *metadata,
537539
auto classRO = metadataExtraData + pattern->ClassRODataOffset;
538540
metadata->Data =
539541
reinterpret_cast<uintptr_t>(classRO) | SWIFT_CLASS_IS_SWIFT_MASK;
540-
#else
541-
metadata->Data = SWIFT_CLASS_IS_SWIFT_MASK;
542542
#endif
543543

544544
// Class flags.
@@ -2201,8 +2201,6 @@ _swift_relocateClassMetadata(const ClassDescriptor *description,
22012201
auto classRO = pattern->Data.get();
22022202
metadata->Data =
22032203
reinterpret_cast<uintptr_t>(classRO) | SWIFT_CLASS_IS_SWIFT_MASK;
2204-
#else
2205-
metadata->Data = SWIFT_CLASS_IS_SWIFT_MASK;
22062204
#endif
22072205

22082206
// Class flags.

test/IRGen/class_metadata.swift

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %{python} %utils/chex.py < %s > %t/class_metadata.swift
3-
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %t/class_metadata.swift -check-prefix=CHECK -check-prefix=CHECK-%target-ptrsize -check-prefix CHECK-%target-import-type -check-prefix=CHECK-%target-cpu
3+
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %t/class_metadata.swift -check-prefixes=CHECK,CHECK-%target-ptrsize,CHECK-%target-import-type,CHECK-%target-cpu -D#MDSIZE=7
4+
// RUN: %target-swift-frontend -disable-objc-interop -emit-ir %s | %FileCheck %t/class_metadata.swift -check-prefixes=CHECK,CHECK-%target-ptrsize,CHECK-%target-import-type,CHECK-%target-cpu -D#MDSIZE=4
45

56
class A {}
67

@@ -20,16 +21,16 @@ class A {}
2021
// Negative size in words.
2122
// CHECK-SAME: i32 2,
2223
// Positive size in words.
23-
// CHECK-32-SAME: i32 14,
24-
// CHECK-64-SAME: i32 11,
24+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 1]],
25+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 1]],
2526
// Field count.
2627
// CHECK-SAME: i32 0,
2728
// Field offset vector offset.
28-
// CHECK-32-SAME: i32 13,
29-
// CHECK-64-SAME: i32 10,
29+
// CHECK-32-SAME: i32 [[#MDSIZE + 6]],
30+
// CHECK-64-SAME: i32 [[#MDSIZE + 3]],
3031
// V-table offset.
31-
// CHECK-32-SAME: i32 13,
32-
// CHECK-64-SAME: i32 10,
32+
// CHECK-32-SAME: i32 [[#MDSIZE + 6]],
33+
// CHECK-64-SAME: i32 [[#MDSIZE + 3]],
3334
// V-table length.
3435
// CHECK-SAME: i32 1,
3536
// CHECK-SAME: %swift.method_descriptor {
@@ -61,15 +62,15 @@ class B : A {}
6162
// Negative size in words.
6263
// CHECK-SAME: i32 2,
6364
// Positive size in words.
64-
// CHECK-32-SAME: i32 14,
65-
// CHECK-64-SAME: i32 11,
65+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 1]],
66+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 1]],
6667
// Immediate member count.
6768
// CHECK-SAME: i32 0,
6869
// Field count.
6970
// CHECK-SAME: i32 0,
7071
// Field offset vector offset.
71-
// CHECK-32-SAME: i32 14,
72-
// CHECK-64-SAME: i32 11,
72+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 1]],
73+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 1]],
7374
// Number of method overrides.
7475
// CHECK-SAME: i32 1,
7576
// CHECK-SAME: %swift.method_override_descriptor {
@@ -100,15 +101,15 @@ class C<T> : B {}
100101
// Negative size in words.
101102
// CHECK-SAME: i32 2,
102103
// Positive size in words.
103-
// CHECK-32-SAME: i32 15,
104-
// CHECK-64-SAME: i32 12,
104+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 2]],
105+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 2]],
105106
// Num immediate members.
106107
// CHECK-32-SAME: i32 1,
107108
// Field count.
108109
// CHECK-SAME: i32 0,
109110
// Field offset vector offset.
110-
// CHECK-32-SAME: i32 15,
111-
// CHECK-64-SAME: i32 12,
111+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 2]],
112+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 2]],
112113
// Instantiation cache.
113114
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1CCMI"
114115
// Instantiation pattern.
@@ -163,15 +164,15 @@ class D : E {}
163164
// Negative size in words.
164165
// CHECK-SAME: i32 2,
165166
// Positive size in words.
166-
// CHECK-32-SAME: i32 14,
167-
// CHECK-64-SAME: i32 11,
167+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 1]],
168+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 1]],
168169
// Immediate member count.
169170
// CHECK-SAME: i32 0,
170171
// Field count.
171172
// CHECK-SAME: i32 0,
172173
// Field offset vector offset.
173-
// CHECK-32-SAME: i32 14,
174-
// CHECK-64-SAME: i32 11,
174+
// CHECK-32-SAME: i32 [[#MDSIZE + 6 + 1]],
175+
// CHECK-64-SAME: i32 [[#MDSIZE + 3 + 1]],
175176
// Number of method overrides.
176177
// CHECK-SAME: i32 1,
177178
// CHECK-SAME: %swift.method_override_descriptor {

test/IRGen/class_resilience.sil

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
33
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_class.swiftmodule -module-name=resilient_class %S/../Inputs/resilient_class.swift -I %t
4-
// RUN: %target-swift-frontend -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s
4+
// RUN: %target-swift-frontend -enable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
5+
// RUN: %target-swift-frontend -disable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-native
56
// RUN: %target-swift-frontend -I %t -emit-ir -enable-library-evolution -O %s
67

78
// REQUIRES: CPU=x86_64
@@ -24,11 +25,13 @@ import resilient_class
2425
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15resilient_class22ResilientOutsideParentCMa"(i64 0)
2526
// CHECK-NEXT: [[META:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
2627
// CHECK-NEXT: [[META_ADDR:%.*]] = bitcast %swift.type* [[META]] to i8*
27-
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 48
28+
// CHECK-objc-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 48
29+
// CHECK-native-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 24
2830
// CHECK-NEXT: [[SIZE_PTR:%.*]] = bitcast i8* [[SIZE_ADDR]] to i32*
2931
// CHECK-NEXT: [[SIZE_2:%.*]] = load i32, i32* [[SIZE_PTR]], align 8
3032
// CHECK-NEXT: [[SIZE:%.*]] = zext i32 [[SIZE_2]] to i64
31-
// CHECK-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 52
33+
// CHECK-objc-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 52
34+
// CHECK-native-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 28
3235
// CHECK-NEXT: [[ALIGN_PTR:%.*]] = bitcast i8* [[ALIGN_ADDR]] to i16*
3336
// CHECK-NEXT: [[ALIGN_2:%.*]] = load i16, i16* [[ALIGN_PTR]], align 4
3437
// CHECK-NEXT: [[ALIGN:%.*]] = zext i16 [[ALIGN_2]] to i64

test/IRGen/class_resilience.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
44
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_enum.swiftmodule -module-name=resilient_enum -I %t %S/../Inputs/resilient_enum.swift
55
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_class.swiftmodule -module-name=resilient_class -I %t %S/../Inputs/resilient_class.swift
6-
// RUN: %target-swift-frontend -I %t -emit-ir -enable-library-evolution %t/class_resilience.swift | %FileCheck %t/class_resilience.swift --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-runtime -check-prefix=CHECK-%target-cpu --check-prefix=CHECK-%target-runtime-STABLE-ABI-%target-mandates-stable-abi -DINT=i%target-ptrsize
6+
// RUN: %target-swift-frontend -enable-objc-interop -I %t -emit-ir -enable-library-evolution %t/class_resilience.swift | %FileCheck %t/class_resilience.swift --check-prefixes=CHECK,CHECK-objc,CHECK-objc%target-ptrsize,CHECK-%target-ptrsize,CHECK-%target-cpu,CHECK-objc-STABLE-ABI-%target-mandates-stable-abi -DINT=i%target-ptrsize -D#MDWORDS=7 -D#MDSIZE32=52 -D#MDSIZE64=80 -D#WORDSIZE=%target-alignment
7+
// RUN: %target-swift-frontend -disable-objc-interop -I %t -emit-ir -enable-library-evolution %t/class_resilience.swift | %FileCheck %t/class_resilience.swift --check-prefixes=CHECK,CHECK-native,CHECK-native%target-ptrsize,CHECK-%target-ptrsize,CHECK-%target-cpu,CHECK-native-STABLE-ABI-%target-mandates-stable-abi -DINT=i%target-ptrsize -D#MDWORDS=4 -D#MDSIZE32=40 -D#MDSIZE64=56 -D#WORDSIZE=%target-alignment
78
// RUN: %target-swift-frontend -I %t -emit-ir -enable-library-evolution -O %t/class_resilience.swift
89

910
// CHECK: @"$s16class_resilience26ClassWithResilientPropertyC1s16resilient_struct4SizeVvpWvd" = hidden global [[INT]] 0
@@ -20,8 +21,8 @@
2021
// CHECK: @"$s16class_resilience27ClassWithResilientThenEmptyC9resilient0H7_struct0E3IntVvpWvd" = hidden global [[INT]] 0,
2122

2223
// CHECK: @"$s16class_resilience26ClassWithResilientPropertyCMo" = {{(protected )?}}{{(dllexport )?}}constant [[BOUNDS]]
23-
// CHECK-32-SAME: { [[INT]] 52, i32 2, i32 17 }
24-
// CHECK-64-SAME: { [[INT]] 80, i32 2, i32 14 }
24+
// CHECK-32-SAME: { [[INT]] [[#MDSIZE32]], i32 2, i32 [[#MDWORDS + 6 + 4]] }
25+
// CHECK-64-SAME: { [[INT]] [[#MDSIZE64]], i32 2, i32 [[#MDWORDS + 3 + 4]] }
2526

2627
// CHECK: @"$s16class_resilience28ClassWithMyResilientPropertyC1rAA0eF6StructVvpWvd" = hidden constant [[INT]] {{8|16}}
2728
// CHECK: @"$s16class_resilience28ClassWithMyResilientPropertyC5colors5Int32VvpWvd" = hidden constant [[INT]] {{12|20}}
@@ -101,20 +102,20 @@
101102
// CHECK-native-SAME: i32 0
102103

103104
// CHECK: @"$s16class_resilience17MyResilientParentCMo" = {{(protected )?}}{{(dllexport )?}}constant [[BOUNDS]]
104-
// CHECK-32-SAME: { [[INT]] 52, i32 2, i32 15 }
105-
// CHECK-64-SAME: { [[INT]] 80, i32 2, i32 12 }
105+
// CHECK-32-SAME: { [[INT]] [[#MDSIZE32]], i32 2, i32 [[#MDWORDS + 6 + 2]] }
106+
// CHECK-64-SAME: { [[INT]] [[#MDSIZE64]], i32 2, i32 [[#MDWORDS + 3 + 2]] }
106107

107108
// CHECK: @"$s16class_resilience16MyResilientChildCMo" = {{(protected )?}}{{(dllexport )?}}constant [[BOUNDS]]
108-
// CHECK-32-SAME: { [[INT]] 60, i32 2, i32 16 }
109-
// CHECK-64-SAME: { [[INT]] 96, i32 2, i32 13 }
109+
// CHECK-32-SAME: { [[INT]] [[#MDSIZE32 + WORDSIZE + WORDSIZE]], i32 2, i32 [[#MDWORDS + 6 + 3]] }
110+
// CHECK-64-SAME: { [[INT]] [[#MDSIZE64 + WORDSIZE + WORDSIZE]], i32 2, i32 [[#MDWORDS + 3 + 3]] }
110111

111112
// CHECK: @"$s16class_resilience24MyResilientGenericParentCMo" = {{(protected )?}}{{(dllexport )?}}constant [[BOUNDS]]
112-
// CHECK-32-SAME: { [[INT]] 52, i32 2, i32 16 }
113-
// CHECK-64-SAME: { [[INT]] 80, i32 2, i32 13 }
113+
// CHECK-32-SAME: { [[INT]] [[#MDSIZE32]], i32 2, i32 [[#MDWORDS + 6 + 3]] }
114+
// CHECK-64-SAME: { [[INT]] [[#MDSIZE64]], i32 2, i32 [[#MDWORDS + 3 + 3]] }
114115

115116
// CHECK: @"$s16class_resilience24MyResilientConcreteChildCMo" = {{(protected )?}}{{(dllexport )?}}constant [[BOUNDS]]
116-
// CHECK-32-SAME: { [[INT]] 64, i32 2, i32 18 }
117-
// CHECK-64-SAME: { [[INT]] 104, i32 2, i32 15 }
117+
// CHECK-32-SAME: { [[INT]] [[#MDSIZE32 + WORDSIZE + WORDSIZE + WORDSIZE]], i32 2, i32 [[#MDWORDS + 6 + 5]] }
118+
// CHECK-64-SAME: { [[INT]] [[#MDSIZE64 + WORDSIZE + WORDSIZE + WORDSIZE]], i32 2, i32 [[#MDWORDS + 3 + 5]] }
118119

119120
// CHECK: @"$s16class_resilience27ClassWithEmptyThenResilientC5emptyAA0E0VvpWvd" = hidden constant [[INT]] 0,
120121
// CHECK: @"$s16class_resilience27ClassWithResilientThenEmptyC5emptyAA0G0VvpWvd" = hidden constant [[INT]] 0,
@@ -400,7 +401,8 @@ public class ClassWithResilientThenEmpty {
400401
// CHECK: entry:
401402
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [3 x i8**]
402403
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
403-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
404+
// CHECK-objc-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
405+
// CHECK-native-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{7|10}}
404406
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [3 x i8**]* [[FIELDS]] to i8*
405407
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{12|24}}, i8* [[FIELDS_ADDR]])
406408
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [3 x i8**], [3 x i8**]* [[FIELDS]], i32 0, i32 0
@@ -478,7 +480,8 @@ public class ClassWithResilientThenEmpty {
478480
// CHECK: entry:
479481
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [2 x i8**]
480482
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
481-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
483+
// CHECK-objc-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
484+
// CHECK-native-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{7|10}}
482485
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [2 x i8**]* [[FIELDS]] to i8*
483486
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{8|16}}, i8* [[FIELDS_ADDR]])
484487
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [2 x i8**], [2 x i8**]* [[FIELDS]], i32 0, i32 0

test/IRGen/dynamic_init.sil

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s
1+
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
2+
// RUN: %target-swift-frontend -disable-objc-interop -emit-ir %s | %FileCheck %s --check-prefixes=CHECK,CHECK-native
23

34
// REQUIRES: CPU=x86_64
45

@@ -20,7 +21,8 @@ sil @$s12dynamic_init1CCfD : $@convention(method) (@owned C) -> ()
2021
sil @$s12dynamic_init15testDynamicInityAA1CCm2cm_tF : $@convention(method) (@thick C.Type) -> () {
2122
bb0(%0 : $@thick C.Type):
2223
// CHECK: [[META:%[0-9]+]] = bitcast %swift.type* %0 to %T12dynamic_init1CC* (%swift.type*)**
23-
// CHECK: [[VTABLE_OFFSET:%[0-9]+]] = getelementptr inbounds %T12dynamic_init1CC* (%swift.type*)*, %T12dynamic_init1CC* (%swift.type*)** [[META]], i64 10
24+
// CHECK-objc: [[VTABLE_OFFSET:%[0-9]+]] = getelementptr inbounds %T12dynamic_init1CC* (%swift.type*)*, %T12dynamic_init1CC* (%swift.type*)** [[META]], i64 10
25+
// CHECK-native: [[VTABLE_OFFSET:%[0-9]+]] = getelementptr inbounds %T12dynamic_init1CC* (%swift.type*)*, %T12dynamic_init1CC* (%swift.type*)** [[META]], i64 7
2426
// CHECK: [[CTOR:%[0-9]+]] = load %T12dynamic_init1CC* (%swift.type*)*, %T12dynamic_init1CC* (%swift.type*)** [[VTABLE_OFFSET]], align 8
2527
%2 = class_method %0 : $@thick C.Type, #C.init!allocator : (C.Type) -> () -> C, $@convention(method) (@thick C.Type) -> @owned C
2628
// CHECK: [[RESULT:%[0-9]+]] = call swiftcc %T12dynamic_init1CC* [[CTOR]](%swift.type* swiftself %0)

0 commit comments

Comments
 (0)