@@ -241,8 +241,7 @@ struct FieldTypeInfo {
241241struct ProtocolConformanceInfo {
242242 std::string typeName;
243243 std::string protocolName;
244- // TODO:
245- // std::string mangledTypeName;
244+ std::string mangledTypeName;
246245};
247246
248247// / An implementation of MetadataReader's BuilderType concept for
@@ -833,16 +832,16 @@ class TypeRefBuilder {
833832 dyn_cast<ExternalModuleContextDescriptor<PointerSize>>(
834833 parentContextDescriptor)) {
835834 auto moduleDescriptorName = readModuleNameFromModuleDescriptor (
836- moduleDescriptor, parentTargetAddress);
835+ moduleDescriptor, parentTargetAddress);
837836 if (!moduleDescriptorName.hasValue ())
838837 return llvm::None;
839838 else
840839 optionalParentName = moduleDescriptorName;
841840 } else if (auto typeDescriptor =
842841 dyn_cast<ExternalTypeContextDescriptor<PointerSize>>(
843842 parentContextDescriptor)) {
844- auto typeDescriptorName = readTypeNameFromTypeDescriptor (typeDescriptor,
845- parentTargetAddress);
843+ auto typeDescriptorName = readTypeNameFromTypeDescriptor (
844+ typeDescriptor, parentTargetAddress);
846845 if (!typeDescriptorName.hasValue ())
847846 return llvm::None;
848847 else
@@ -1020,10 +1019,10 @@ class TypeRefBuilder {
10201019
10211020 auto optionalTypeName = readTypeNameFromTypeDescriptor (
10221021 typeDescriptor, contextTypeDescriptorAddress);
1023- if (!optionalTypeName.hasValue ())
1024- return llvm::None;
1025- else
1026- typeName = optionalTypeName.getValue ();
1022+ if (!optionalTypeName.hasValue ())
1023+ return llvm::None;
1024+ else
1025+ typeName = optionalTypeName.getValue ();
10271026
10281027 // Prepend the parent context name
10291028 auto optionalParentName =
@@ -1111,7 +1110,9 @@ class TypeRefBuilder {
11111110
11121111 // / Given the address of a conformance descriptor, attempt to read it.
11131112 llvm::Optional<ProtocolConformanceInfo>
1114- readConformanceDescriptor (RemoteRef<void > conformanceRecordRef) {
1113+ readConformanceDescriptor (RemoteRef<void > conformanceRecordRef,
1114+ const std::unordered_map<std::string, std::string>
1115+ &typeNameToManglingMap) {
11151116 const ExternalProtocolConformanceRecord<PointerSize> *CD =
11161117 (const ExternalProtocolConformanceRecord<PointerSize> *)
11171118 conformanceRecordRef.getLocalBuffer ();
@@ -1142,39 +1143,68 @@ class TypeRefBuilder {
11421143 if (!optionalConformanceProtocol.hasValue ())
11431144 return llvm::None;
11441145
1146+ std::string mangledTypeName;
1147+ auto it =
1148+ typeNameToManglingMap.find (optionalConformingTypeName.getValue ());
1149+ if (it != typeNameToManglingMap.end ()) {
1150+ mangledTypeName = it->second ;
1151+ } else {
1152+ mangledTypeName = " " ;
1153+ }
1154+
11451155 return ProtocolConformanceInfo{optionalConformingTypeName.getValue (),
1146- optionalConformanceProtocol.getValue ()};
1156+ optionalConformanceProtocol.getValue (),
1157+ mangledTypeName};
11471158 }
11481159 };
11491160
11501161public:
11511162 template <unsigned PointerSize>
11521163 void dumpConformanceSection (std::ostream &stream) {
1164+ // The Fields section has gathered info on types that includes their mangled
1165+ // names. Use that to build a dictionary from a type's demangled name to its
1166+ // mangeled name
1167+ std::unordered_map<std::string, std::string> typeNameToManglingMap;
1168+ for (const auto §ion : ReflectionInfos) {
1169+ for (auto descriptor : section.Field ) {
1170+ auto TypeRef = readTypeRef (descriptor, descriptor->MangledTypeName );
1171+ auto OptionalMangledTypeName = normalizeReflectionName (TypeRef);
1172+ auto TypeName = nodeToString (demangleTypeRef (TypeRef));
1173+ clearNodeFactory ();
1174+ if (OptionalMangledTypeName.hasValue ()) {
1175+ typeNameToManglingMap[TypeName] =
1176+ " $s" + OptionalMangledTypeName.getValue ();
1177+ }
1178+ }
1179+ }
1180+
11531181 // Collect all conformances and aggregate them per-conforming-type.
11541182 std::unordered_map<std::string, std::vector<std::string>> typeConformances;
11551183 ProtocolConformanceDescriptorReader<PointerSize> conformanceReader (
11561184 OpaqueByteReader, OpaqueStringReader, OpaquePointerReader);
1157-
11581185 for (const auto §ion : ReflectionInfos) {
11591186 auto ConformanceBegin = section.Conformance .startAddress ();
11601187 auto ConformanceEnd = section.Conformance .endAddress ();
11611188 for (auto conformanceAddr = ConformanceBegin;
11621189 conformanceAddr != ConformanceEnd;
11631190 conformanceAddr = conformanceAddr.atByteOffset (4 )) {
11641191 auto optionalConformanceInfo =
1165- conformanceReader.readConformanceDescriptor (conformanceAddr);
1192+ conformanceReader.readConformanceDescriptor (conformanceAddr,
1193+ typeNameToManglingMap);
11661194 if (!optionalConformanceInfo.hasValue ()) {
11671195 stream << " Error reading conformance descriptor: "
11681196 << conformanceReader.Error << " \n " ;
11691197 continue ;
11701198 }
11711199 auto conformanceInfo = optionalConformanceInfo.getValue ();
1172- if (typeConformances.count (conformanceInfo.typeName ) != 0 ) {
1173- typeConformances[conformanceInfo.typeName ].push_back (
1200+ auto typeConformancesKey = conformanceInfo.mangledTypeName + " (" +
1201+ conformanceInfo.typeName + " )" ;
1202+ if (typeConformances.count (typeConformancesKey) != 0 ) {
1203+ typeConformances[typeConformancesKey].push_back (
11741204 conformanceInfo.protocolName );
11751205 } else {
11761206 typeConformances.emplace (
1177- conformanceInfo. typeName ,
1207+ typeConformancesKey ,
11781208 std::vector<std::string>{conformanceInfo.protocolName });
11791209 }
11801210 }
0 commit comments