@@ -772,7 +772,8 @@ class TypeRefBuilder {
772772
773773private:
774774 // / Reader of protocol descriptors from Images
775- template <unsigned PointerSize>
775+ template <template <typename Runtime> class ObjCInteropKind ,
776+ unsigned PointerSize>
776777 struct ProtocolConformanceDescriptorReader {
777778 std::string Error;
778779 ByteReader OpaqueByteReader;
@@ -789,16 +790,17 @@ class TypeRefBuilder {
789790 llvm::Optional<std::string>
790791 getParentContextName (uintptr_t contextDescriptorAddress) {
791792 llvm::Optional<std::string> optionalParentContextName;
792- auto contextTypeDescriptorBytes =
793- OpaqueByteReader ( remote::RemoteAddress (contextDescriptorAddress),
794- sizeof (ExternalContextDescriptor<PointerSize>));
793+ auto contextTypeDescriptorBytes = OpaqueByteReader (
794+ remote::RemoteAddress (contextDescriptorAddress),
795+ sizeof (ExternalContextDescriptor<ObjCInteropKind, PointerSize>));
795796 if (!contextTypeDescriptorBytes.get ()) {
796797 Error = " Failed to read context descriptor." ;
797798 return llvm::None;
798799 }
799- const ExternalContextDescriptor<PointerSize> *contextDescriptor =
800- (const ExternalContextDescriptor<PointerSize> *)
801- contextTypeDescriptorBytes.get ();
800+ const ExternalContextDescriptor<ObjCInteropKind, PointerSize>
801+ *contextDescriptor =
802+ (const ExternalContextDescriptor<ObjCInteropKind, PointerSize> *)
803+ contextTypeDescriptorBytes.get ();
802804
803805 auto parentOffsetAddress = detail::applyRelativeOffset (
804806 (const char *)contextDescriptorAddress,
@@ -817,28 +819,30 @@ class TypeRefBuilder {
817819 auto readContextParentName =
818820 [&](uintptr_t descriptorAddress) -> llvm::Optional<std::string> {
819821 llvm::Optional<std::string> optionalParentName;
820- auto parentContextDescriptorBytes =
821- OpaqueByteReader ( remote::RemoteAddress (descriptorAddress),
822- sizeof (ExternalContextDescriptor<PointerSize>));
822+ auto parentContextDescriptorBytes = OpaqueByteReader (
823+ remote::RemoteAddress (descriptorAddress),
824+ sizeof (ExternalContextDescriptor<ObjCInteropKind, PointerSize>));
823825 if (!parentContextDescriptorBytes.get ()) {
824826 Error = " Failed to read context descriptor." ;
825827 return llvm::None;
826828 }
827- const ExternalContextDescriptor<PointerSize> *parentContextDescriptor =
828- (const ExternalContextDescriptor<PointerSize> *)
829+ const ExternalContextDescriptor<ObjCInteropKind,
830+ PointerSize> *parentContextDescriptor =
831+ (const ExternalContextDescriptor<ObjCInteropKind, PointerSize> *)
829832 parentContextDescriptorBytes.get ();
830833
831- if (auto moduleDescriptor =
832- dyn_cast< ExternalModuleContextDescriptor<PointerSize>>(
833- parentContextDescriptor)) {
834+ if (auto moduleDescriptor = dyn_cast<
835+ ExternalModuleContextDescriptor<ObjCInteropKind, PointerSize>>(
836+ parentContextDescriptor)) {
834837 auto moduleDescriptorName = readModuleNameFromModuleDescriptor (
835838 moduleDescriptor, parentTargetAddress);
836839 if (!moduleDescriptorName.hasValue ())
837840 return llvm::None;
838841 else
839842 optionalParentName = moduleDescriptorName;
840843 } else if (auto typeDescriptor =
841- dyn_cast<ExternalTypeContextDescriptor<PointerSize>>(
844+ dyn_cast<ExternalTypeContextDescriptor<ObjCInteropKind,
845+ PointerSize>>(
842846 parentContextDescriptor)) {
843847 auto typeDescriptorName = readTypeNameFromTypeDescriptor (
844848 typeDescriptor, parentTargetAddress);
@@ -890,7 +894,8 @@ class TypeRefBuilder {
890894 }
891895
892896 llvm::Optional<std::string> readTypeNameFromTypeDescriptor (
893- const ExternalTypeContextDescriptor<PointerSize> *typeDescriptor,
897+ const ExternalTypeContextDescriptor<ObjCInteropKind, PointerSize>
898+ *typeDescriptor,
894899 uintptr_t typeDescriptorAddress) {
895900 auto typeNameOffsetAddress =
896901 detail::applyRelativeOffset ((const char *)typeDescriptorAddress,
@@ -910,7 +915,8 @@ class TypeRefBuilder {
910915 }
911916
912917 llvm::Optional<std::string> readModuleNameFromModuleDescriptor (
913- const ExternalModuleContextDescriptor<PointerSize> *moduleDescriptor,
918+ const ExternalModuleContextDescriptor<ObjCInteropKind, PointerSize>
919+ *moduleDescriptor,
914920 uintptr_t moduleDescriptorAddress) {
915921 auto parentNameOffsetAddress = detail::applyRelativeOffset (
916922 (const char *)moduleDescriptorAddress,
@@ -932,16 +938,17 @@ class TypeRefBuilder {
932938 llvm::Optional<std::string> readProtocolNameFromProtocolDescriptor (
933939 uintptr_t protocolDescriptorAddress) {
934940 std::string protocolName;
935- auto protocolDescriptorBytes =
936- OpaqueByteReader ( remote::RemoteAddress (protocolDescriptorAddress),
937- sizeof (ExternalProtocolDescriptor<PointerSize>));
941+ auto protocolDescriptorBytes = OpaqueByteReader (
942+ remote::RemoteAddress (protocolDescriptorAddress),
943+ sizeof (ExternalProtocolDescriptor<ObjCInteropKind, PointerSize>));
938944 if (!protocolDescriptorBytes.get ()) {
939945 Error = " Error reading protocol descriptor." ;
940946 return llvm::None;
941947 }
942- const ExternalProtocolDescriptor<PointerSize> *protocolDescriptor =
943- (const ExternalProtocolDescriptor<PointerSize> *)
944- protocolDescriptorBytes.get ();
948+ const ExternalProtocolDescriptor<ObjCInteropKind, PointerSize>
949+ *protocolDescriptor =
950+ (const ExternalProtocolDescriptor<ObjCInteropKind, PointerSize> *)
951+ protocolDescriptorBytes.get ();
945952
946953 // Compute the address of the protocol descriptor's name field and read
947954 // the offset
@@ -969,8 +976,8 @@ class TypeRefBuilder {
969976 // / Extract conforming type's name from a Conformance Descriptor
970977 llvm::Optional<std::string> getConformingTypeName (
971978 const uintptr_t conformanceDescriptorAddress,
972- const ExternalProtocolConformanceDescriptor<PointerSize>
973- &conformanceDescriptor) {
979+ const ExternalProtocolConformanceDescriptor<
980+ ObjCInteropKind, PointerSize> &conformanceDescriptor) {
974981 std::string typeName;
975982 // Compute the address of the type descriptor as follows:
976983 // - Compute the address of the TypeRef field in the protocol
@@ -998,19 +1005,20 @@ class TypeRefBuilder {
9981005 (const char *)contextDescriptorFieldAddress,
9991006 (int32_t )*contextDescriptorOffset);
10001007
1001- auto contextTypeDescriptorBytes =
1002- OpaqueByteReader ( remote::RemoteAddress (contextTypeDescriptorAddress),
1003- sizeof (ExternalContextDescriptor<PointerSize>));
1008+ auto contextTypeDescriptorBytes = OpaqueByteReader (
1009+ remote::RemoteAddress (contextTypeDescriptorAddress),
1010+ sizeof (ExternalContextDescriptor<ObjCInteropKind, PointerSize>));
10041011 if (!contextTypeDescriptorBytes.get ()) {
10051012 Error = " Failed to read context descriptor." ;
10061013 return llvm::None;
10071014 }
1008- const ExternalContextDescriptor<PointerSize> *contextDescriptor =
1009- (const ExternalContextDescriptor<PointerSize> *)
1010- contextTypeDescriptorBytes.get ();
1015+ const ExternalContextDescriptor<ObjCInteropKind, PointerSize>
1016+ *contextDescriptor =
1017+ (const ExternalContextDescriptor<ObjCInteropKind, PointerSize> *)
1018+ contextTypeDescriptorBytes.get ();
10111019
10121020 auto typeDescriptor =
1013- dyn_cast<ExternalTypeContextDescriptor<PointerSize>>(
1021+ dyn_cast<ExternalTypeContextDescriptor<ObjCInteropKind, PointerSize>>(
10141022 contextDescriptor);
10151023 if (!typeDescriptor) {
10161024 Error = " Unexpected type of context descriptor." ;
@@ -1037,8 +1045,8 @@ class TypeRefBuilder {
10371045 // / Extract protocol name from a Conformance Descriptor
10381046 llvm::Optional<std::string> getConformanceProtocolName (
10391047 const uintptr_t conformanceDescriptorAddress,
1040- const ExternalProtocolConformanceDescriptor<PointerSize>
1041- &conformanceDescriptor) {
1048+ const ExternalProtocolConformanceDescriptor<
1049+ ObjCInteropKind, PointerSize> &conformanceDescriptor) {
10421050 llvm::Optional<std::string> protocolName;
10431051 auto protocolDescriptorFieldAddress = detail::applyRelativeOffset (
10441052 (const char *)conformanceDescriptorAddress,
@@ -1113,25 +1121,27 @@ class TypeRefBuilder {
11131121 readConformanceDescriptor (RemoteRef<void > conformanceRecordRef,
11141122 const std::unordered_map<std::string, std::string>
11151123 &typeNameToManglingMap) {
1116- const ExternalProtocolConformanceRecord<PointerSize> *CD =
1117- (const ExternalProtocolConformanceRecord<PointerSize> *)
1118- conformanceRecordRef.getLocalBuffer ();
1124+ const ExternalProtocolConformanceRecord<ObjCInteropKind,
1125+ PointerSize> *CD =
1126+ (const ExternalProtocolConformanceRecord<ObjCInteropKind, PointerSize>
1127+ *)conformanceRecordRef.getLocalBuffer ();
11191128 // Read the Protocol Conformance Descriptor by getting its address from
11201129 // the conformance record.
11211130 auto conformanceDescriptorAddress = (uintptr_t )CD->getRelative (
11221131 (void *)conformanceRecordRef.getAddressData ());
11231132
11241133 auto descriptorBytes = OpaqueByteReader (
11251134 remote::RemoteAddress (conformanceDescriptorAddress),
1126- sizeof (ExternalProtocolConformanceDescriptor<PointerSize>));
1135+ sizeof (ExternalProtocolConformanceDescriptor<ObjCInteropKind,
1136+ PointerSize>));
11271137 if (!descriptorBytes.get ()) {
11281138 Error = " Failed to read protocol conformance descriptor." ;
11291139 return llvm::None;
11301140 }
1131- const ExternalProtocolConformanceDescriptor<PointerSize>
1141+ const ExternalProtocolConformanceDescriptor<ObjCInteropKind, PointerSize>
11321142 *conformanceDescriptorPtr =
1133- (const ExternalProtocolConformanceDescriptor<PointerSize> *)
1134- descriptorBytes.get ();
1143+ (const ExternalProtocolConformanceDescriptor<
1144+ ObjCInteropKind, PointerSize> *) descriptorBytes.get ();
11351145
11361146 auto optionalConformingTypeName = getConformingTypeName (
11371147 conformanceDescriptorAddress, *conformanceDescriptorPtr);
@@ -1159,7 +1169,8 @@ class TypeRefBuilder {
11591169 };
11601170
11611171public:
1162- template <unsigned PointerSize>
1172+ template <template <typename Runtime> class ObjCInteropKind ,
1173+ unsigned PointerSize>
11631174 void dumpConformanceSection (std::ostream &stream) {
11641175 // The Fields section has gathered info on types that includes their mangled
11651176 // names. Use that to build a dictionary from a type's demangled name to its
@@ -1180,8 +1191,9 @@ class TypeRefBuilder {
11801191
11811192 // Collect all conformances and aggregate them per-conforming-type.
11821193 std::unordered_map<std::string, std::vector<std::string>> typeConformances;
1183- ProtocolConformanceDescriptorReader<PointerSize> conformanceReader (
1184- OpaqueByteReader, OpaqueStringReader, OpaquePointerReader);
1194+ ProtocolConformanceDescriptorReader<ObjCInteropKind, PointerSize>
1195+ conformanceReader (OpaqueByteReader, OpaqueStringReader,
1196+ OpaquePointerReader);
11851197 for (const auto §ion : ReflectionInfos) {
11861198 auto ConformanceBegin = section.Conformance .startAddress ();
11871199 auto ConformanceEnd = section.Conformance .endAddress ();
@@ -1224,7 +1236,8 @@ class TypeRefBuilder {
12241236 }
12251237 }
12261238
1227- template <unsigned PointerSize>
1239+ template <template <typename Runtime> class ObjCInteropKind ,
1240+ unsigned PointerSize>
12281241 void dumpAllSections (std::ostream &stream) {
12291242 stream << " FIELDS:\n " ;
12301243 stream << " =======\n " ;
@@ -1244,7 +1257,7 @@ class TypeRefBuilder {
12441257 stream << " \n " ;
12451258 stream << " CONFORMANCES:\n " ;
12461259 stream << " =============\n " ;
1247- dumpConformanceSection<PointerSize>(stream);
1260+ dumpConformanceSection<ObjCInteropKind, PointerSize>(stream);
12481261 stream << " \n " ;
12491262 }
12501263};
0 commit comments