@@ -895,23 +895,29 @@ class MetadataReader {
895
895
return targetAddress + signext;
896
896
}
897
897
898
- private:
899
- template <template <class R > class M >
900
- MetadataRef _readMetadata (StoredPointer address) {
901
- return _readMetadata (address, sizeof (M<Runtime>));
902
- }
898
+ // / Given a pointer to an Objective-C class, try to read its class name.
899
+ bool readObjCClassName (StoredPointer classAddress, std::string &className) {
900
+ // The following algorithm only works on the non-fragile Apple runtime.
903
901
904
- MetadataRef _readMetadata (StoredPointer address, size_t sizeAfter) {
905
- auto size = sizeAfter;
906
- uint8_t *buffer = (uint8_t *) malloc (size);
907
- if (!Reader->readBytes (RemoteAddress (address), buffer, size)) {
908
- free (buffer);
909
- return nullptr ;
910
- }
902
+ // Grab the RO-data pointer. This part is not ABI.
903
+ StoredPointer roDataPtr = readObjCRODataPtr (classAddress);
904
+ if (!roDataPtr) return false ;
911
905
912
- auto metadata = reinterpret_cast <TargetMetadata<Runtime>*>(buffer);
913
- MetadataCache.insert (std::make_pair (address, OwnedMetadataRef (metadata)));
914
- return MetadataRef (address, metadata);
906
+ // This is ABI.
907
+ static constexpr auto OffsetToName =
908
+ roundUpToAlignment (size_t (12 ), sizeof (StoredPointer))
909
+ + sizeof (StoredPointer);;
910
+
911
+ // Read the name pointer.
912
+ StoredPointer namePtr;
913
+ if (!Reader->readInteger (RemoteAddress (roDataPtr + OffsetToName), &namePtr))
914
+ return false ;
915
+
916
+ // If the name pointer is null, treat that as an error.
917
+ if (!namePtr)
918
+ return false ;
919
+
920
+ return Reader->readString (RemoteAddress (namePtr), className);
915
921
}
916
922
917
923
MetadataRef readMetadata (StoredPointer address) {
@@ -924,64 +930,83 @@ class MetadataReader {
924
930
return nullptr ;
925
931
926
932
switch (getEnumeratedMetadataKind (KindValue)) {
927
- case MetadataKind::Class:
928
- return _readMetadata<TargetClassMetadata>(address);
929
- case MetadataKind::Enum:
930
- return _readMetadata<TargetEnumMetadata>(address);
931
- case MetadataKind::ErrorObject:
932
- return _readMetadata<TargetEnumMetadata>(address);
933
- case MetadataKind::Existential: {
934
- StoredPointer numProtocolsAddress = address +
933
+ case MetadataKind::Class:
934
+ return _readMetadata<TargetClassMetadata>(address);
935
+ case MetadataKind::Enum:
936
+ return _readMetadata<TargetEnumMetadata>(address);
937
+ case MetadataKind::ErrorObject:
938
+ return _readMetadata<TargetEnumMetadata>(address);
939
+ case MetadataKind::Existential: {
940
+ StoredPointer numProtocolsAddress = address +
935
941
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
936
- StoredPointer numProtocols;
937
- if (!Reader->readInteger (RemoteAddress (numProtocolsAddress),
938
- &numProtocols))
939
- return nullptr ;
942
+ StoredPointer numProtocols;
943
+ if (!Reader->readInteger (RemoteAddress (numProtocolsAddress),
944
+ &numProtocols))
945
+ return nullptr ;
940
946
941
- auto totalSize = sizeof (TargetExistentialTypeMetadata<Runtime>)
942
- + numProtocols *
943
- sizeof (ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
947
+ auto totalSize = sizeof (TargetExistentialTypeMetadata<Runtime>)
948
+ + numProtocols *
949
+ sizeof (ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
944
950
945
- return _readMetadata (address, totalSize);
946
- }
947
- case MetadataKind::ExistentialMetatype:
948
- return _readMetadata<TargetExistentialMetatypeMetadata>(address);
949
- case MetadataKind::ForeignClass:
950
- return _readMetadata<TargetForeignClassMetadata>(address);
951
- case MetadataKind::Function:
952
- return _readMetadata<TargetFunctionTypeMetadata>(address);
953
- case MetadataKind::HeapGenericLocalVariable:
954
- return _readMetadata<TargetHeapLocalVariableMetadata>(address);
955
- case MetadataKind::HeapLocalVariable:
956
- return _readMetadata<TargetHeapLocalVariableMetadata>(address);
957
- case MetadataKind::Metatype:
958
- return _readMetadata<TargetMetatypeMetadata>(address);
959
- case MetadataKind::ObjCClassWrapper:
960
- return _readMetadata<TargetObjCClassWrapperMetadata>(address);
961
- case MetadataKind::Opaque:
962
- return _readMetadata<TargetOpaqueMetadata>(address);
963
- case MetadataKind::Optional:
964
- return _readMetadata<TargetEnumMetadata>(address);
965
- case MetadataKind::Struct:
966
- return _readMetadata<TargetStructMetadata>(address);
967
- case MetadataKind::Tuple: {
968
- auto numElementsAddress = address +
951
+ return _readMetadata (address, totalSize);
952
+ }
953
+ case MetadataKind::ExistentialMetatype:
954
+ return _readMetadata<TargetExistentialMetatypeMetadata>(address);
955
+ case MetadataKind::ForeignClass:
956
+ return _readMetadata<TargetForeignClassMetadata>(address);
957
+ case MetadataKind::Function:
958
+ return _readMetadata<TargetFunctionTypeMetadata>(address);
959
+ case MetadataKind::HeapGenericLocalVariable:
960
+ return _readMetadata<TargetHeapLocalVariableMetadata>(address);
961
+ case MetadataKind::HeapLocalVariable:
962
+ return _readMetadata<TargetHeapLocalVariableMetadata>(address);
963
+ case MetadataKind::Metatype:
964
+ return _readMetadata<TargetMetatypeMetadata>(address);
965
+ case MetadataKind::ObjCClassWrapper:
966
+ return _readMetadata<TargetObjCClassWrapperMetadata>(address);
967
+ case MetadataKind::Opaque:
968
+ return _readMetadata<TargetOpaqueMetadata>(address);
969
+ case MetadataKind::Optional:
970
+ return _readMetadata<TargetEnumMetadata>(address);
971
+ case MetadataKind::Struct:
972
+ return _readMetadata<TargetStructMetadata>(address);
973
+ case MetadataKind::Tuple: {
974
+ auto numElementsAddress = address +
969
975
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
970
- StoredSize numElements;
971
- if (!Reader->readInteger (RemoteAddress (numElementsAddress),
972
- &numElements))
973
- return nullptr ;
974
- auto totalSize = sizeof (TargetTupleTypeMetadata<Runtime>)
975
- + numElements * sizeof (StoredPointer);
976
- return _readMetadata (address, totalSize);
977
- }
976
+ StoredSize numElements;
977
+ if (!Reader->readInteger (RemoteAddress (numElementsAddress),
978
+ &numElements))
979
+ return nullptr ;
980
+ auto totalSize = sizeof (TargetTupleTypeMetadata<Runtime>)
981
+ + numElements * sizeof (StoredPointer);
982
+ return _readMetadata (address, totalSize);
983
+ }
978
984
}
979
985
980
986
// We can fall out here if the value wasn't actually a valid
981
987
// MetadataKind.
982
988
return nullptr ;
983
989
}
984
990
991
+ private:
992
+ template <template <class R > class M >
993
+ MetadataRef _readMetadata (StoredPointer address) {
994
+ return _readMetadata (address, sizeof (M<Runtime>));
995
+ }
996
+
997
+ MetadataRef _readMetadata (StoredPointer address, size_t sizeAfter) {
998
+ auto size = sizeAfter;
999
+ uint8_t *buffer = (uint8_t *) malloc (size);
1000
+ if (!Reader->readBytes (RemoteAddress (address), buffer, size)) {
1001
+ free (buffer);
1002
+ return nullptr ;
1003
+ }
1004
+
1005
+ auto metadata = reinterpret_cast <TargetMetadata<Runtime>*>(buffer);
1006
+ MetadataCache.insert (std::make_pair (address, OwnedMetadataRef (metadata)));
1007
+ return MetadataRef (address, metadata);
1008
+ }
1009
+
985
1010
StoredPointer readAddressOfNominalTypeDescriptor (MetadataRef metadata) {
986
1011
switch (metadata->getKind ()) {
987
1012
case MetadataKind::Class: {
@@ -1144,31 +1169,6 @@ class MetadataReader {
1144
1169
return nominal;
1145
1170
}
1146
1171
1147
- // / Given a pointer to an Objective-C class, try to read its class name.
1148
- bool readObjCClassName (StoredPointer classAddress, std::string &className) {
1149
- // The following algorithm only works on the non-fragile Apple runtime.
1150
-
1151
- // Grab the RO-data pointer. This part is not ABI.
1152
- StoredPointer roDataPtr = readObjCRODataPtr (classAddress);
1153
- if (!roDataPtr) return false ;
1154
-
1155
- // This is ABI.
1156
- static constexpr auto OffsetToName =
1157
- roundUpToAlignment (size_t (12 ), sizeof (StoredPointer))
1158
- + sizeof (StoredPointer);;
1159
-
1160
- // Read the name pointer.
1161
- StoredPointer namePtr;
1162
- if (!Reader->readInteger (RemoteAddress (roDataPtr + OffsetToName), &namePtr))
1163
- return false ;
1164
-
1165
- // If the name pointer is null, treat that as an error.
1166
- if (!namePtr)
1167
- return false ;
1168
-
1169
- return Reader->readString (RemoteAddress (namePtr), className);
1170
- }
1171
-
1172
1172
// / Given that the remote process is running the non-fragile Apple runtime,
1173
1173
// / grab the ro-data from a class pointer.
1174
1174
StoredPointer readObjCRODataPtr (StoredPointer classAddress) {
0 commit comments