@@ -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
}
@@ -1371,8 +1385,7 @@ class MetadataReader {
1371
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
@@ -1382,38 +1395,42 @@ class MetadataReader {
1382
1395
reinterpret_cast <const TargetExtendedExistentialTypeShape<Runtime> *>(
1383
1396
cached->second .get ()));
1384
1397
1385
- ExtendedExistentialTypeShapeFlags flags;
1386
- if (!Reader->readBytes (RemoteAddress (address), (uint8_t *)&flags,
1387
- sizeof (flags)))
1388
- return nullptr ;
1389
1398
1390
- // Read the size of the requirement signature.
1391
- uint64_t reqSigGenericSize = 0 ;
1392
- uint64_t genericHeaderSize = sizeof (GenericContextDescriptorHeader);
1399
+ uint64_t descriptorSize;
1393
1400
{
1394
- GenericContextDescriptorHeader header;
1395
- auto headerAddr = address + sizeof (flags);
1396
-
1397
- if (!Reader->readBytes (RemoteAddress (headerAddr),
1398
- (uint8_t *)&header, sizeof (header)))
1401
+ using RelativeOffset = TargetRelativeDirectPointer<Runtime, const char ,
1402
+ /* nullable*/ false >;
1403
+ constexpr size_t buffer_size = sizeof (ExtendedExistentialTypeShapeFlags) +
1404
+ sizeof (RelativeOffset) +
1405
+ sizeof (GenericContextDescriptorHeader);
1406
+ uint8_t buffer[buffer_size];
1407
+ if (!Reader->readBytes (RemoteAddress (address), buffer, sizeof (buffer)))
1399
1408
return nullptr ;
1400
1409
1410
+ // Read the size of the requirement signature.
1411
+ uint64_t reqSigGenericSize = 0 ;
1412
+ uint64_t genericHeaderSize = sizeof (GenericContextDescriptorHeader);
1413
+ ExtendedExistentialTypeShapeFlags flags;
1414
+ memcpy ((uint8_t *)&flags, buffer, sizeof (flags));
1415
+ GenericContextDescriptorHeader header;
1416
+ memcpy ((uint8_t *)&header,
1417
+ buffer + sizeof (flags) + sizeof (RelativeOffset), sizeof (header));
1401
1418
reqSigGenericSize = reqSigGenericSize
1402
1419
+ (header.NumParams + 3u & ~3u )
1403
1420
+ header.NumRequirements
1404
1421
* sizeof (TargetGenericRequirementDescriptor<Runtime>);
1405
- }
1406
- uint64_t typeExprSize = flags.hasTypeExpression () ? sizeof (StoredPointer) : 0 ;
1407
- uint64_t suggestedVWSize = flags.hasSuggestedValueWitnesses () ? sizeof (StoredPointer) : 0 ;
1422
+ uint64_t typeExprSize =
1423
+ flags.hasTypeExpression () ? sizeof (StoredPointer) : 0 ;
1424
+ uint64_t suggestedVWSize =
1425
+ flags.hasSuggestedValueWitnesses () ? sizeof (StoredPointer) : 0 ;
1408
1426
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)
1427
+ descriptorSize = sizeof (flags) + sizeof (RelativeOffset) +
1428
+ genericHeaderSize + typeExprSize + suggestedVWSize +
1429
+ reqSigGenericSize;
1430
+ }
1431
+ if (descriptorSize > MaxMetadataSize)
1415
1432
return nullptr ;
1416
- auto readResult = Reader->readBytes (RemoteAddress (address), size );
1433
+ auto readResult = Reader->readBytes (RemoteAddress (address), descriptorSize );
1417
1434
if (!readResult)
1418
1435
return nullptr ;
1419
1436
0 commit comments