@@ -168,6 +168,8 @@ class MetadataReader {
168
168
using StoredPointer = typename Runtime::StoredPointer;
169
169
using StoredSignedPointer = typename Runtime::StoredSignedPointer;
170
170
using StoredSize = typename Runtime::StoredSize;
171
+ using TargetClassMetadata =
172
+ typename Runtime::template TargetClassMetadata<Runtime>;
171
173
172
174
private:
173
175
// / The maximum number of bytes to read when reading metadata. Anything larger
@@ -502,7 +504,7 @@ class MetadataReader {
502
504
if (!meta || meta->getKind () != MetadataKind::Class)
503
505
return StoredPointer ();
504
506
505
- auto classMeta = cast<TargetClassMetadata<Runtime> >(meta);
507
+ auto classMeta = cast<TargetClassMetadata>(meta);
506
508
return stripSignedPointer (classMeta->Superclass );
507
509
}
508
510
@@ -514,39 +516,39 @@ class MetadataReader {
514
516
if (!meta || meta->getKind () != MetadataKind::Class)
515
517
return None;
516
518
517
- #if SWIFT_OBJC_INTEROP
518
- // The following algorithm only works on the non-fragile Apple runtime.
519
-
520
- // Grab the RO-data pointer. This part is not ABI.
521
- StoredPointer roDataPtr = readObjCRODataPtr (MetadataAddress);
522
- if (!roDataPtr)
523
- return None;
524
-
525
- // Get the address of the InstanceStart field.
526
- auto address = roDataPtr + sizeof (uint32_t ) * 1 ;
519
+ if (Runtime::ObjCInterop) {
520
+ // The following algorithm only works on the non-fragile Apple runtime.
527
521
528
- unsigned start;
529
- if (!Reader->readInteger (RemoteAddress (address), &start))
530
- return None;
522
+ // Grab the RO-data pointer. This part is not ABI.
523
+ StoredPointer roDataPtr = readObjCRODataPtr (MetadataAddress);
524
+ if (!roDataPtr)
525
+ return None;
531
526
532
- return start;
533
- #else
534
- // All swift class instances start with an isa pointer,
535
- // followed by the retain counts (which are the size of a long long).
536
- size_t isaAndRetainCountSize = sizeof (StoredSize) + sizeof (long long );
537
- size_t start = isaAndRetainCountSize;
527
+ // Get the address of the InstanceStart field.
528
+ auto address = roDataPtr + sizeof (uint32_t ) * 1 ;
538
529
539
- auto classMeta = cast<TargetClassMetadata<Runtime>>(meta);
540
- while (stripSignedPointer (classMeta->Superclass )) {
541
- classMeta = cast<TargetClassMetadata<Runtime>>(
542
- readMetadata (stripSignedPointer (classMeta->Superclass )));
530
+ unsigned start;
531
+ if (!Reader->readInteger (RemoteAddress (address), &start))
532
+ return None;
543
533
544
- // Subtract the size contribution of the isa and retain counts from
545
- // the super class.
546
- start += classMeta->InstanceSize - isaAndRetainCountSize;
534
+ return start;
535
+ } else {
536
+ // All swift class instances start with an isa pointer,
537
+ // followed by the retain counts (which are the size of a long long).
538
+ size_t isaAndRetainCountSize = sizeof (StoredSize) + sizeof (long long );
539
+ size_t start = isaAndRetainCountSize;
540
+
541
+ auto classMeta = cast<TargetClassMetadata>(meta);
542
+ while (stripSignedPointer (classMeta->Superclass )) {
543
+ classMeta = cast<TargetClassMetadata>(
544
+ readMetadata (stripSignedPointer (classMeta->Superclass )));
545
+
546
+ // Subtract the size contribution of the isa and retain counts from
547
+ // the super class.
548
+ start += classMeta->InstanceSize - isaAndRetainCountSize;
549
+ }
550
+ return start;
547
551
}
548
- return start;
549
- #endif
550
552
}
551
553
552
554
// / Given a pointer to the metadata, attempt to read the value
@@ -588,7 +590,7 @@ class MetadataReader {
588
590
if (!Meta)
589
591
return None;
590
592
591
- if (auto ClassMeta = dyn_cast<TargetClassMetadata<Runtime> >(Meta)) {
593
+ if (auto ClassMeta = dyn_cast<TargetClassMetadata>(Meta)) {
592
594
if (ClassMeta->isPureObjC ()) {
593
595
// If we can determine the Objective-C class name, this is probably an
594
596
// error existential with NSError-compatible layout.
@@ -719,34 +721,36 @@ class MetadataReader {
719
721
Demangler &dem,
720
722
Resolver resolver) {
721
723
#if SWIFT_OBJC_INTEROP
722
- // Check whether we have an Objective-C protocol.
723
- if (ProtocolAddress.isObjC ()) {
724
- auto Name = readObjCProtocolName (ProtocolAddress.getObjCProtocol ());
725
- StringRef NameStr (Name);
726
-
727
- // If this is a Swift-defined protocol, demangle it.
728
- if (NameStr.startswith (" _TtP" )) {
729
- auto Demangled = dem.demangleSymbol (NameStr);
730
- if (!Demangled)
731
- return resolver.failure ();
732
-
733
- // FIXME: This appears in _swift_buildDemanglingForMetadata().
734
- while (Demangled->getKind () == Node::Kind::Global ||
735
- Demangled->getKind () == Node::Kind::TypeMangling ||
736
- Demangled->getKind () == Node::Kind::Type ||
737
- Demangled->getKind () == Node::Kind::ProtocolList ||
738
- Demangled->getKind () == Node::Kind::TypeList ||
739
- Demangled->getKind () == Node::Kind::Type) {
740
- if (Demangled->getNumChildren () != 1 )
724
+ if (Runtime::ObjCInterop) {
725
+ // Check whether we have an Objective-C protocol.
726
+ if (ProtocolAddress.isObjC ()) {
727
+ auto Name = readObjCProtocolName (ProtocolAddress.getObjCProtocol ());
728
+ StringRef NameStr (Name);
729
+
730
+ // If this is a Swift-defined protocol, demangle it.
731
+ if (NameStr.startswith (" _TtP" )) {
732
+ auto Demangled = dem.demangleSymbol (NameStr);
733
+ if (!Demangled)
741
734
return resolver.failure ();
742
- Demangled = Demangled->getFirstChild ();
735
+
736
+ // FIXME: This appears in _swift_buildDemanglingForMetadata().
737
+ while (Demangled->getKind () == Node::Kind::Global ||
738
+ Demangled->getKind () == Node::Kind::TypeMangling ||
739
+ Demangled->getKind () == Node::Kind::Type ||
740
+ Demangled->getKind () == Node::Kind::ProtocolList ||
741
+ Demangled->getKind () == Node::Kind::TypeList ||
742
+ Demangled->getKind () == Node::Kind::Type) {
743
+ if (Demangled->getNumChildren () != 1 )
744
+ return resolver.failure ();
745
+ Demangled = Demangled->getFirstChild ();
746
+ }
747
+
748
+ return resolver.swiftProtocol (Demangled);
743
749
}
744
750
745
- return resolver.swiftProtocol (Demangled);
751
+ // Otherwise, this is an imported protocol.
752
+ return resolver.objcProtocol (NameStr);
746
753
}
747
-
748
- // Otherwise, this is an imported protocol.
749
- return resolver.objcProtocol (NameStr);
750
754
}
751
755
#endif
752
756
@@ -1419,7 +1423,7 @@ class MetadataReader {
1419
1423
return readMetadataBoundsOfSuperclass (superclass);
1420
1424
},
1421
1425
[&](MetadataRef metadata) -> llvm::Optional<ClassMetadataBounds> {
1422
- auto cls = dyn_cast<TargetClassMetadata<Runtime> >(metadata);
1426
+ auto cls = dyn_cast<TargetClassMetadata>(metadata);
1423
1427
if (!cls)
1424
1428
return None;
1425
1429
@@ -1659,6 +1663,10 @@ class MetadataReader {
1659
1663
return Reader->readString (RemoteAddress (namePtr), className);
1660
1664
}
1661
1665
1666
+ template <typename T>
1667
+ using TargetClassMetadataT =
1668
+ typename Runtime::template TargetClassMetadata<T>;
1669
+
1662
1670
MetadataRef readMetadata (StoredPointer address) {
1663
1671
auto cached = MetadataCache.find (address);
1664
1672
if (cached != MetadataCache.end ())
@@ -1672,7 +1680,9 @@ class MetadataReader {
1672
1680
1673
1681
switch (getEnumeratedMetadataKind (KindValue)) {
1674
1682
case MetadataKind::Class:
1675
- return _readMetadata<TargetClassMetadata>(address);
1683
+
1684
+ return _readMetadata<TargetClassMetadataT>(address);
1685
+
1676
1686
case MetadataKind::Enum:
1677
1687
return _readMetadata<TargetEnumMetadata>(address);
1678
1688
case MetadataKind::ErrorObject:
@@ -1779,7 +1789,7 @@ class MetadataReader {
1779
1789
bool skipArtificialSubclasses = false ) {
1780
1790
switch (metadata->getKind ()) {
1781
1791
case MetadataKind::Class: {
1782
- auto classMeta = cast<TargetClassMetadata<Runtime> >(metadata);
1792
+ auto classMeta = cast<TargetClassMetadata>(metadata);
1783
1793
while (true ) {
1784
1794
if (!classMeta->isTypeMetadata ())
1785
1795
return 0 ;
@@ -1801,7 +1811,7 @@ class MetadataReader {
1801
1811
if (!superMeta)
1802
1812
return 0 ;
1803
1813
1804
- auto superclassMeta = dyn_cast<TargetClassMetadata<Runtime> >(superMeta);
1814
+ auto superclassMeta = dyn_cast<TargetClassMetadata>(superMeta);
1805
1815
if (!superclassMeta)
1806
1816
return 0 ;
1807
1817
@@ -2692,7 +2702,7 @@ class MetadataReader {
2692
2702
2693
2703
BuiltType readNominalTypeFromClassMetadata (MetadataRef origMetadata,
2694
2704
bool skipArtificialSubclasses = false ) {
2695
- auto classMeta = cast<TargetClassMetadata<Runtime> >(origMetadata);
2705
+ auto classMeta = cast<TargetClassMetadata>(origMetadata);
2696
2706
if (classMeta->isTypeMetadata ())
2697
2707
return readNominalTypeFromMetadata (origMetadata, skipArtificialSubclasses);
2698
2708
@@ -2715,6 +2725,10 @@ class MetadataReader {
2715
2725
return BuiltObjCClass;
2716
2726
}
2717
2727
2728
+ using TargetClassMetadataObjCInterop =
2729
+ swift::TargetClassMetadata<Runtime,
2730
+ TargetAnyClassMetadataObjCInterop<Runtime>>;
2731
+
2718
2732
// / Given that the remote process is running the non-fragile Apple runtime,
2719
2733
// / grab the ro-data from a class pointer.
2720
2734
StoredPointer readObjCRODataPtr (StoredPointer classAddress) {
@@ -2723,9 +2737,10 @@ class MetadataReader {
2723
2737
2724
2738
#if SWIFT_OBJC_INTEROP
2725
2739
StoredPointer dataPtr;
2726
- if (!Reader->readInteger (RemoteAddress (classAddress +
2727
- TargetClassMetadata<Runtime>::offsetToData ()),
2728
- &dataPtr))
2740
+ if (!Reader->readInteger (
2741
+ RemoteAddress (classAddress +
2742
+ TargetClassMetadataObjCInterop::offsetToData ()),
2743
+ &dataPtr))
2729
2744
return StoredPointer ();
2730
2745
2731
2746
// Apply the data-pointer mask.
0 commit comments