@@ -509,8 +509,8 @@ class MetadataReader {
509
509
// The symbolic reference points at a non-unique extended
510
510
// existential type shape.
511
511
return dem.createNode (
512
- Node::Kind::NonUniqueExtendedExistentialTypeShapeSymbolicReference,
513
- resolved.getResolvedAddress ().getAddressData ());
512
+ Node::Kind::NonUniqueExtendedExistentialTypeShapeSymbolicReference,
513
+ resolved.getResolvedAddress ().getAddressData ());
514
514
}
515
515
case Demangle::SymbolicReferenceKind::ObjectiveCProtocol: {
516
516
// 'resolved' points to a struct of two relative addresses.
@@ -886,6 +886,74 @@ class MetadataReader {
886
886
return resolver.swiftProtocol (Demangled);
887
887
}
888
888
889
+ BuiltType readTypeFromShape (
890
+ RemoteAbsolutePointer shapeAddress,
891
+ std::function<std::optional<std::vector<BuiltType>>(unsigned )> getArgs) {
892
+ StoredPointer addr = shapeAddress.getResolvedAddress ().getAddressData ();
893
+ ShapeRef Shape = readShape (addr);
894
+ if (!Shape)
895
+ return BuiltType ();
896
+
897
+ assert (Shape->hasGeneralizationSignature ());
898
+ auto builtArgs = getArgs (Shape->getGenSigArgumentLayoutSizeInWords ());
899
+
900
+ // Pull out the existential type from the mangled type name.
901
+ Demangler dem;
902
+ auto mangledExistentialAddr =
903
+ resolveRelativeField (Shape, Shape->ExistentialType );
904
+ auto node = readMangledName (RemoteAddress (mangledExistentialAddr),
905
+ MangledNameKind::Type, dem);
906
+ if (!node)
907
+ return BuiltType ();
908
+
909
+ BuiltType builtProto = decodeMangledType (node).getType ();
910
+ if (!builtProto)
911
+ return BuiltType ();
912
+
913
+ if (builtArgs) {
914
+ // Build up a substitution map for the generalized signature.
915
+ BuiltGenericSignature sig =
916
+ decodeRuntimeGenericSignature (Shape,
917
+ Shape->getGeneralizationSignature ())
918
+ .getType ();
919
+ if (!sig)
920
+ return BuiltType ();
921
+
922
+ BuiltSubstitutionMap subst =
923
+ Builder.createSubstitutionMap (sig, *builtArgs);
924
+ if (subst.empty ())
925
+ return BuiltType ();
926
+
927
+ builtProto = Builder.subst (builtProto, subst);
928
+ if (!builtProto)
929
+ return BuiltType ();
930
+ }
931
+
932
+ // Read the type expression to build up any remaining layers of
933
+ // existential metatype.
934
+ if (Shape->Flags .hasTypeExpression ()) {
935
+ Demangler dem;
936
+
937
+ // Read the mangled name.
938
+ auto mangledContextName = Shape->getTypeExpression ();
939
+ auto mangledNameAddress =
940
+ resolveRelativeField (Shape, mangledContextName->name );
941
+ auto node = readMangledName (RemoteAddress (mangledNameAddress),
942
+ MangledNameKind::Type, dem);
943
+ if (!node)
944
+ return BuiltType ();
945
+
946
+ while (node->getKind () == Demangle::Node::Kind::Type &&
947
+ node->getNumChildren () &&
948
+ node->getChild (0 )->getKind () == Demangle::Node::Kind::Metatype &&
949
+ node->getChild (0 )->getNumChildren ()) {
950
+ builtProto = Builder.createExistentialMetatypeType (builtProto);
951
+ node = node->getChild (0 )->getChild (0 );
952
+ }
953
+ }
954
+ return builtProto;
955
+ }
956
+
889
957
// / Given a remote pointer to metadata, attempt to turn it into a type.
890
958
BuiltType
891
959
readTypeFromMetadata (StoredPointer MetadataAddress,
@@ -1081,79 +1149,25 @@ class MetadataReader {
1081
1149
}
1082
1150
case MetadataKind::ExtendedExistential: {
1083
1151
auto Exist = cast<TargetExtendedExistentialTypeMetadata<Runtime>>(Meta);
1084
-
1085
1152
// Read the shape for this existential.
1086
1153
StoredPointer shapeAddress = stripSignedPointer (Exist->Shape );
1087
- ShapeRef Shape = readShape (shapeAddress);
1088
- if (!Shape)
1089
- return BuiltType ();
1090
-
1091
- const unsigned shapeArgumentCount
1092
- = Shape->getGenSigArgumentLayoutSizeInWords ();
1093
- // Pull out the arguments to the generalization signature.
1094
- assert (Shape->hasGeneralizationSignature ());
1095
- std::vector<BuiltType> builtArgs;
1096
- for (unsigned i = 0 ; i < shapeArgumentCount; ++i) {
1097
- auto remoteArg = Exist->getGeneralizationArguments ()[i];
1098
- auto builtArg = readTypeFromMetadata (remoteArg, false , recursion_limit);
1099
- if (!builtArg)
1100
- return BuiltType ();
1101
- builtArgs.push_back (builtArg);
1102
- }
1103
-
1104
- // Pull out the existential type from the mangled type name.
1105
- Demangler dem;
1106
- auto mangledExistentialAddr =
1107
- resolveRelativeField (Shape, Shape->ExistentialType );
1108
- auto node = readMangledName (RemoteAddress (mangledExistentialAddr),
1109
- MangledNameKind::Type, dem);
1110
- if (!node)
1111
- return BuiltType ();
1112
-
1113
- BuiltType builtProto = decodeMangledType (node).getType ();
1114
- if (!builtProto)
1115
- return BuiltType ();
1116
-
1117
- // Build up a substitution map for the generalized signature.
1118
- BuiltGenericSignature sig =
1119
- decodeRuntimeGenericSignature (Shape,
1120
- Shape->getGeneralizationSignature ())
1121
- .getType ();
1122
- if (!sig)
1123
- return BuiltType ();
1124
-
1125
- BuiltSubstitutionMap subst =
1126
- Builder.createSubstitutionMap (sig, builtArgs);
1127
- if (subst.empty ())
1128
- return BuiltType ();
1129
-
1130
- builtProto = Builder.subst (builtProto, subst);
1131
- if (!builtProto)
1132
- return BuiltType ();
1133
-
1134
- // Read the type expression to build up any remaining layers of
1135
- // existential metatype.
1136
- if (Shape->Flags .hasTypeExpression ()) {
1137
- Demangler dem;
1138
-
1139
- // Read the mangled name.
1140
- auto mangledContextName = Shape->getTypeExpression ();
1141
- auto mangledNameAddress =
1142
- resolveRelativeField (Shape, mangledContextName->name );
1143
- auto node = readMangledName (RemoteAddress (mangledNameAddress),
1144
- MangledNameKind::Type, dem);
1145
- if (!node)
1146
- return BuiltType ();
1147
-
1148
- while (node->getKind () == Demangle::Node::Kind::Type &&
1149
- node->getNumChildren () &&
1150
- node->getChild (0 )->getKind () == Demangle::Node::Kind::Metatype &&
1151
- node->getChild (0 )->getNumChildren ()) {
1152
- builtProto = Builder.createExistentialMetatypeType (builtProto);
1153
- node = node->getChild (0 )->getChild (0 );
1154
- }
1155
- }
1156
1154
1155
+ auto builtProto = readTypeFromShape (
1156
+ RemoteAddress (shapeAddress),
1157
+ [&](unsigned shapeArgumentCount)
1158
+ -> std::optional<std::vector<BuiltType>> {
1159
+ // Pull out the arguments to the generalization signature.
1160
+ std::vector<BuiltType> builtArgs;
1161
+ for (unsigned i = 0 ; i < shapeArgumentCount; ++i) {
1162
+ auto remoteArg = Exist->getGeneralizationArguments ()[i];
1163
+ auto builtArg =
1164
+ readTypeFromMetadata (remoteArg, false , recursion_limit);
1165
+ if (!builtArg)
1166
+ return std::nullopt;
1167
+ builtArgs.push_back (builtArg);
1168
+ }
1169
+ return builtArgs;
1170
+ });
1157
1171
TypeCache[TypeCacheKey] = builtProto;
1158
1172
return builtProto;
1159
1173
}
@@ -1366,69 +1380,60 @@ class MetadataReader {
1366
1380
if (address.getOffset () == 0 )
1367
1381
return ParentContextDescriptorRef (address.getSymbol ());
1368
1382
}
1369
-
1383
+
1370
1384
return ParentContextDescriptorRef (
1371
- readContextDescriptor (address.getResolvedAddress ().getAddressData ()));
1385
+ readContextDescriptor (address.getResolvedAddress ().getAddressData ()));
1372
1386
}
1373
1387
1374
- ShapeRef
1375
- readShape (StoredPointer address) {
1388
+ ShapeRef readShape (StoredPointer address) {
1376
1389
if (address == 0 )
1377
1390
return nullptr ;
1378
1391
1392
+ using ShapeHeader = TargetExtendedExistentialTypeShape<Runtime>;
1379
1393
auto cached = ShapeCache.find (address);
1380
1394
if (cached != ShapeCache.end ())
1381
- return ShapeRef (address,
1382
- reinterpret_cast <const TargetExtendedExistentialTypeShape<Runtime> *>(
1383
- cached->second .get ()));
1384
-
1385
- ExtendedExistentialTypeShapeFlags flags;
1386
- if (!Reader->readBytes (RemoteAddress (address), (uint8_t *)&flags,
1387
- sizeof (flags)))
1388
- return nullptr ;
1395
+ return ShapeRef (
1396
+ address, reinterpret_cast <const ShapeHeader *>(cached->second .get ()));
1389
1397
1390
- // Read the size of the requirement signature.
1391
- uint64_t reqSigGenericSize = 0 ;
1392
- uint64_t genericHeaderSize = sizeof (GenericContextDescriptorHeader);
1398
+ uint64_t descriptorSize;
1393
1399
{
1394
- GenericContextDescriptorHeader header;
1395
- auto headerAddr = address + sizeof (flags);
1396
-
1397
- if (!Reader->readBytes (RemoteAddress (headerAddr),
1398
- (uint8_t *)&header, sizeof (header)))
1400
+ auto readResult =
1401
+ Reader->readBytes (RemoteAddress (address), sizeof (ShapeHeader));
1402
+ if (!readResult)
1399
1403
return nullptr ;
1400
-
1401
- reqSigGenericSize = reqSigGenericSize
1402
- + (header.NumParams + 3u & ~3u )
1403
- + header.NumRequirements
1404
- * sizeof (TargetGenericRequirementDescriptor<Runtime>);
1405
- }
1406
- uint64_t typeExprSize = flags.hasTypeExpression () ? sizeof (StoredPointer) : 0 ;
1407
- uint64_t suggestedVWSize = flags.hasSuggestedValueWitnesses () ? sizeof (StoredPointer) : 0 ;
1408
-
1409
- uint64_t size = sizeof (ExtendedExistentialTypeShapeFlags) +
1410
- sizeof (TargetRelativeDirectPointer<Runtime, const char ,
1411
- /* nullable*/ false >) +
1412
- genericHeaderSize + typeExprSize + suggestedVWSize +
1413
- reqSigGenericSize;
1414
- if (size > MaxMetadataSize)
1404
+ auto shapeHeader =
1405
+ reinterpret_cast <const ShapeHeader *>(readResult.get ());
1406
+
1407
+ // Read the size of the requirement signature.
1408
+ uint64_t reqSigGenericSize = 0 ;
1409
+ auto flags = shapeHeader->Flags ;
1410
+ auto &reqSigHeader = shapeHeader->ReqSigHeader ;
1411
+ reqSigGenericSize =
1412
+ reqSigGenericSize + (reqSigHeader.NumParams + 3u & ~3u ) +
1413
+ reqSigHeader.NumRequirements *
1414
+ sizeof (TargetGenericRequirementDescriptor<Runtime>);
1415
+ uint64_t typeExprSize =
1416
+ flags.hasTypeExpression () ? sizeof (StoredPointer) : 0 ;
1417
+ uint64_t suggestedVWSize =
1418
+ flags.hasSuggestedValueWitnesses () ? sizeof (StoredPointer) : 0 ;
1419
+
1420
+ descriptorSize = sizeof (shapeHeader) + typeExprSize + suggestedVWSize +
1421
+ reqSigGenericSize;
1422
+ }
1423
+ if (descriptorSize > MaxMetadataSize)
1415
1424
return nullptr ;
1416
- auto readResult = Reader->readBytes (RemoteAddress (address), size );
1425
+ auto readResult = Reader->readBytes (RemoteAddress (address), descriptorSize );
1417
1426
if (!readResult)
1418
1427
return nullptr ;
1419
1428
1420
- auto descriptor =
1421
- reinterpret_cast <const TargetExtendedExistentialTypeShape<Runtime> *>(
1422
- readResult.get ());
1429
+ auto descriptor = reinterpret_cast <const ShapeHeader *>(readResult.get ());
1423
1430
1424
- ShapeCache.insert (
1425
- std::make_pair (address, std::move (readResult)));
1431
+ ShapeCache.insert (std::make_pair (address, std::move (readResult)));
1426
1432
return ShapeRef (address, descriptor);
1427
1433
}
1428
1434
1429
1435
// / Given the address of a context descriptor, attempt to read it.
1430
- ContextDescriptorRef
1431
- readContextDescriptor (StoredPointer address) {
1436
+ ContextDescriptorRef readContextDescriptor (StoredPointer address) {
1432
1437
if (address == 0 )
1433
1438
return nullptr ;
1434
1439
0 commit comments