@@ -843,6 +843,7 @@ class TypeRefBuilder {
843
843
using ByteReader = std::function<remote::MemoryReader::ReadBytesResult (remote::RemoteAddress, unsigned )>;
844
844
using StringReader = std::function<bool (remote::RemoteAddress, std::string &)>;
845
845
using PointerReader = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress, unsigned )>;
846
+ using DynamicSymbolResolver = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress)>;
846
847
using IntVariableReader = std::function<llvm::Optional<uint64_t > (std::string, unsigned )>;
847
848
848
849
// These fields are captured from the MetadataReader template passed into the
@@ -856,6 +857,7 @@ class TypeRefBuilder {
856
857
ByteReader OpaqueByteReader;
857
858
StringReader OpaqueStringReader;
858
859
PointerReader OpaquePointerReader;
860
+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
859
861
IntVariableReader OpaqueIntVariableReader;
860
862
861
863
public:
@@ -883,6 +885,9 @@ class TypeRefBuilder {
883
885
OpaquePointerReader ([&reader](remote::RemoteAddress address, unsigned size) -> llvm::Optional<remote::RemoteAbsolutePointer> {
884
886
return reader.Reader ->readPointer (address, size);
885
887
}),
888
+ OpaqueDynamicSymbolResolver ([&reader](remote::RemoteAddress address) -> llvm::Optional<remote::RemoteAbsolutePointer> {
889
+ return reader.Reader ->getDynamicSymbol (address);
890
+ }),
886
891
OpaqueIntVariableReader (
887
892
[&reader](std::string symbol, unsigned size) -> llvm::Optional<uint64_t> {
888
893
llvm::Optional<uint64_t > result;
@@ -1007,13 +1012,16 @@ class TypeRefBuilder {
1007
1012
ByteReader OpaqueByteReader;
1008
1013
StringReader OpaqueStringReader;
1009
1014
PointerReader OpaquePointerReader;
1015
+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
1010
1016
1011
1017
ProtocolConformanceDescriptorReader (ByteReader byteReader,
1012
1018
StringReader stringReader,
1013
- PointerReader pointerReader)
1019
+ PointerReader pointerReader,
1020
+ DynamicSymbolResolver dynamicSymbolResolver)
1014
1021
: Error(" " ), OpaqueByteReader(byteReader),
1015
- OpaqueStringReader (stringReader), OpaquePointerReader(pointerReader) {
1016
- }
1022
+ OpaqueStringReader (stringReader),
1023
+ OpaquePointerReader(pointerReader),
1024
+ OpaqueDynamicSymbolResolver(dynamicSymbolResolver) {}
1017
1025
1018
1026
llvm::Optional<std::string>
1019
1027
getParentContextName (uintptr_t contextDescriptorAddress) {
@@ -1236,17 +1244,16 @@ class TypeRefBuilder {
1236
1244
return llvm::None;
1237
1245
}
1238
1246
auto contextDescriptorOffset =
1239
- (const uint32_t *)contextDescriptorOffsetBytes.get ();
1247
+ (const int32_t *)contextDescriptorOffsetBytes.get ();
1240
1248
1241
1249
// Read the type descriptor itself using the address computed above
1242
1250
auto contextTypeDescriptorAddress = detail::applyRelativeOffset (
1243
1251
(const char *)contextDescriptorFieldAddress,
1244
- ( int32_t ) *contextDescriptorOffset);
1252
+ *contextDescriptorOffset);
1245
1253
1246
1254
// Instead of a type descriptor this may just be a symbol reference, check that first
1247
- if (auto symbol = OpaquePointerReader (remote::RemoteAddress (contextTypeDescriptorAddress),
1248
- PointerSize)) {
1249
- if (!symbol->getSymbol ().empty ()) {
1255
+ if (auto symbol = OpaqueDynamicSymbolResolver (remote::RemoteAddress (contextTypeDescriptorAddress))) {
1256
+ if (!symbol->isResolved ()) {
1250
1257
mangledTypeName = symbol->getSymbol ().str ();
1251
1258
Demangle::Context Ctx;
1252
1259
auto demangledRoot =
@@ -1255,6 +1262,9 @@ class TypeRefBuilder {
1255
1262
typeName =
1256
1263
nodeToString (demangledRoot->getChild (0 )->getChild (0 ));
1257
1264
return std::make_pair (mangledTypeName, typeName);
1265
+ } else if (symbol->getOffset ()) {
1266
+ // If symbol is empty and has an offset, this is the resolved remote address
1267
+ contextTypeDescriptorAddress = symbol->getOffset ();
1258
1268
}
1259
1269
}
1260
1270
@@ -1450,7 +1460,7 @@ class TypeRefBuilder {
1450
1460
std::unordered_map<std::string, std::vector<std::string>> typeConformances;
1451
1461
ProtocolConformanceDescriptorReader<ObjCInteropKind, PointerSize>
1452
1462
conformanceReader (OpaqueByteReader, OpaqueStringReader,
1453
- OpaquePointerReader);
1463
+ OpaquePointerReader, OpaqueDynamicSymbolResolver );
1454
1464
for (const auto §ion : ReflectionInfos) {
1455
1465
auto ConformanceBegin = section.Conformance .startAddress ();
1456
1466
auto ConformanceEnd = section.Conformance .endAddress ();
0 commit comments