Skip to content

Commit 435b239

Browse files
authored
Merge pull request #31811 from davezarzycki/pr31811
Remove three ObjC metadata fields from non-ObjC runtime
2 parents 9e2cdf4 + 2c17600 commit 435b239

21 files changed

+207
-131
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: 22 additions & 17 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-%target-import-type-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
@@ -415,8 +417,9 @@ public class ClassWithResilientThenEmpty {
415417

416418
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
417419
// CHECK-native: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
418-
// CHECK-objc-STABLE-ABI-TRUE: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_updateClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
419-
// CHECK-objc-STABLE-ABI-FALSE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
420+
// CHECK-DIRECT-objc-STABLE-ABI-TRUE: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_updateClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
421+
// CHECK-DIRECT-objc-STABLE-ABI-FALSE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
422+
// CHECK-INDIRECT-objc-STABLE-ABI-TRUE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
420423
// CHECK-NEXT: [[INITDEP_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
421424
// CHECK-NEXT: [[INITDEP_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
422425
// CHECK-NEXT: [[INITDEP_PRESENT:%.*]] = icmp eq %swift.type* [[INITDEP_METADATA]], null
@@ -478,7 +481,8 @@ public class ClassWithResilientThenEmpty {
478481
// CHECK: entry:
479482
// CHECK-NEXT: [[FIELDS:%.*]] = alloca [2 x i8**]
480483
// CHECK-NEXT: [[METADATA_ADDR:%.*]] = bitcast %swift.type* %0 to [[INT]]*
481-
// CHECK-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
484+
// CHECK-objc-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{10|13}}
485+
// CHECK-native-NEXT: [[FIELDS_DEST:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_ADDR]], [[INT]] {{7|10}}
482486
// CHECK-NEXT: [[FIELDS_ADDR:%.*]] = bitcast [2 x i8**]* [[FIELDS]] to i8*
483487
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 {{8|16}}, i8* [[FIELDS_ADDR]])
484488
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [2 x i8**], [2 x i8**]* [[FIELDS]], i32 0, i32 0
@@ -493,8 +497,9 @@ public class ClassWithResilientThenEmpty {
493497

494498
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
495499
// CHECK-native: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
496-
// CHECK-objc-STABLE-ABI-TRUE: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_updateClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
497-
// CHECK-objc-STABLE-ABI-FALSE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
500+
// CHECK-DIRECT-objc-STABLE-ABI-TRUE: [[T0:%.*]] = call swiftcc %swift.metadata_response @swift_updateClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
501+
// CHECK-DIRECT-objc-STABLE-ABI-FALSE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
502+
// CHECK-INDIRECT-objc-STABLE-ABI-TRUE:[[T0:%.*]] = call swiftcc %swift.metadata_response @swift_initClassMetadata2(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
498503
// CHECK-NEXT: [[INITDEP_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
499504
// CHECK-NEXT: [[INITDEP_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
500505
// CHECK-NEXT: [[INITDEP_PRESENT:%.*]] = icmp eq %swift.type* [[INITDEP_METADATA]], null

0 commit comments

Comments
 (0)