Skip to content

Commit c1782d8

Browse files
committed
[Runtime] Eliminate the UniqueDirectClass metadata record kind.
Now that references to Objective-C class objects are indirected (via UniqueIndirectClass), classes with Swift type metadata can be directly referenced (via UniqueDirectType) rather than hopping through swift_getObjCClassMetadata().
1 parent 32ab89b commit c1782d8

File tree

6 files changed

+5
-57
lines changed

6 files changed

+5
-57
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,21 +192,13 @@ enum class TypeMetadataRecordKind : unsigned {
192192
/// metadata.
193193
///
194194
/// On platforms without ObjC interop, this indirection isn't necessary,
195-
/// and classes could be emitted as UniqueDirectType.
195+
/// and classes are emitted as UniqueDirectType.
196196
UniqueIndirectClass,
197197

198198
/// The conformance is for a generic or resilient type.
199199
/// getNominalTypeDescriptor() points to the nominal type descriptor shared
200200
/// by all metadata instantiations of this type.
201201
UniqueNominalTypeDescriptor,
202-
203-
/// The conformance is for a nongeneric class type.
204-
/// getDirectType() points to the unique class object.
205-
///
206-
/// FIXME: This shouldn't exist. On ObjC interop platforms, class references
207-
/// must be indirected (using UniqueIndirectClass). On non-ObjC interop
208-
/// platforms, the class object always is the type metadata.
209-
UniqueDirectClass = 0xF,
210202
};
211203

212204
/// Kinds of reference to protocol conformance.

include/swift/Runtime/Metadata.h

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2481,7 +2481,6 @@ struct TargetTypeMetadataRecord {
24812481

24822482
case TypeMetadataRecordKind::UniqueDirectType:
24832483
case TypeMetadataRecordKind::NonuniqueDirectType:
2484-
case TypeMetadataRecordKind::UniqueDirectClass:
24852484
break;
24862485

24872486
case TypeMetadataRecordKind::UniqueIndirectClass:
@@ -2501,7 +2500,6 @@ struct TargetTypeMetadataRecord {
25012500
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
25022501
break;
25032502

2504-
case TypeMetadataRecordKind::UniqueDirectClass:
25052503
case TypeMetadataRecordKind::UniqueIndirectClass:
25062504
case TypeMetadataRecordKind::UniqueDirectType:
25072505
case TypeMetadataRecordKind::NonuniqueDirectType:
@@ -2595,7 +2593,6 @@ struct TargetProtocolConformanceRecord {
25952593
case TypeMetadataRecordKind::NonuniqueDirectType:
25962594
break;
25972595

2598-
case TypeMetadataRecordKind::UniqueDirectClass:
25992596
case TypeMetadataRecordKind::UniqueIndirectClass:
26002597
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
26012598
assert(false && "not direct type metadata");
@@ -2604,26 +2601,6 @@ struct TargetProtocolConformanceRecord {
26042601
return DirectType;
26052602
}
26062603

2607-
// FIXME: This shouldn't exist
2608-
const TargetClassMetadata<Runtime> *getDirectClass() const {
2609-
switch (Flags.getTypeKind()) {
2610-
case TypeMetadataRecordKind::Universal:
2611-
return nullptr;
2612-
case TypeMetadataRecordKind::UniqueDirectClass:
2613-
break;
2614-
2615-
case TypeMetadataRecordKind::UniqueDirectType:
2616-
case TypeMetadataRecordKind::NonuniqueDirectType:
2617-
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
2618-
case TypeMetadataRecordKind::UniqueIndirectClass:
2619-
assert(false && "not direct class object");
2620-
}
2621-
2622-
const TargetMetadata<Runtime> *metadata = DirectType;
2623-
return static_cast<const TargetClassMetadata<Runtime>*>(metadata);
2624-
2625-
}
2626-
26272604
const TargetClassMetadata<Runtime> * const *getIndirectClass() const {
26282605
switch (Flags.getTypeKind()) {
26292606
case TypeMetadataRecordKind::Universal:
@@ -2633,7 +2610,6 @@ struct TargetProtocolConformanceRecord {
26332610
break;
26342611

26352612
case TypeMetadataRecordKind::UniqueDirectType:
2636-
case TypeMetadataRecordKind::UniqueDirectClass:
26372613
case TypeMetadataRecordKind::NonuniqueDirectType:
26382614
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
26392615
assert(false && "not indirect class object");
@@ -2651,7 +2627,6 @@ struct TargetProtocolConformanceRecord {
26512627
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
26522628
break;
26532629

2654-
case TypeMetadataRecordKind::UniqueDirectClass:
26552630
case TypeMetadataRecordKind::UniqueIndirectClass:
26562631
case TypeMetadataRecordKind::UniqueDirectType:
26572632
case TypeMetadataRecordKind::NonuniqueDirectType:

lib/IRGen/GenDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2218,7 +2218,7 @@ getTypeEntityInfo(IRGenModule &IGM, CanType conformingType) {
22182218
defaultPtrTy = IGM.TypeMetadataPtrTy;
22192219
} else {
22202220
if (hasKnownSwiftMetadata(IGM, clas)) {
2221-
typeKind = TypeMetadataRecordKind::UniqueDirectClass;
2221+
typeKind = TypeMetadataRecordKind::UniqueDirectType;
22222222
entity = LinkEntity::forTypeMetadata(
22232223
conformingType,
22242224
TypeMetadataAddress::AddressPoint,

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,6 @@ const Metadata *TypeMetadataRecord::getCanonicalTypeMetadata() const {
135135
static_cast<const ForeignTypeMetadata *>(getDirectType());
136136
return swift_getForeignTypeMetadata(const_cast<ForeignTypeMetadata *>(FMD));
137137
}
138-
case TypeMetadataRecordKind::UniqueDirectClass:
139-
if (auto *ClassMetadata =
140-
static_cast<const ::ClassMetadata *>(getDirectType())) {
141-
return getMetadataForClass(ClassMetadata);
142-
}
143-
else
144-
return nullptr;
145138
default:
146139
return nullptr;
147140
}

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@ template<> void ProtocolConformanceRecord::dump() const {
6262
printf("<structural type>");
6363
}
6464
break;
65-
case TypeMetadataRecordKind::UniqueDirectClass:
66-
printf("unique direct class %s",
67-
class_getName(getDirectClass()));
68-
break;
6965
case TypeMetadataRecordKind::UniqueIndirectClass:
7066
printf("unique indirect class %s",
7167
class_getName(*getIndirectClass()));
@@ -120,13 +116,6 @@ const Metadata *ProtocolConformanceRecord::getCanonicalTypeMetadata() const {
120116
return getMetadataForClass(ClassMetadata);
121117
return nullptr;
122118

123-
case TypeMetadataRecordKind::UniqueDirectClass:
124-
// The class may be ObjC, in which case we need to instantiate its Swift
125-
// metadata.
126-
if (auto *ClassMetadata = getDirectClass())
127-
return getMetadataForClass(ClassMetadata);
128-
return nullptr;
129-
130119
case TypeMetadataRecordKind::UniqueNominalTypeDescriptor:
131120
case TypeMetadataRecordKind::Universal:
132121
// The record does not apply to a single type.

test/IRGen/protocol_conformance_records.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@ public struct NativeValueType: Runcible {
2323
public func runce() {}
2424
}
2525

26-
// -- TODO class refs should be indirected through their ref variable
2726
// CHECK-SAME: %swift.protocol_conformance {
2827
// -- protocol descriptor
2928
// CHECK-SAME: [[RUNCIBLE]]
30-
// -- class object (TODO should be class ref variable)
29+
// -- class metadata
3130
// CHECK-SAME: @_T028protocol_conformance_records15NativeClassTypeCMf
3231
// -- witness table
3332
// CHECK-SAME: @_T028protocol_conformance_records15NativeClassTypeCAA8RuncibleAAWP
34-
// -- flags 0x01: unique direct metadata (TODO should be 0x03 indirect class)
33+
// -- flags 0x01: unique direct metadata
3534
// CHECK-SAME: i32 1
3635
// CHECK-SAME: },
3736
public class NativeClassType: Runcible {
@@ -75,7 +74,7 @@ extension Int: Runcible {
7574
// CHECK-SAME: @got._T016resilient_struct4SizeVN
7675
// -- witness table
7776
// CHECK-SAME: @_T016resilient_struct4SizeV28protocol_conformance_records8RuncibleADWP
78-
// -- flags 0x04: unique direct metadata
77+
// -- flags 0x01: unique direct metadata
7978
// CHECK-SAME: i32 1
8079
// CHECK-SAME: }
8180

0 commit comments

Comments
 (0)