@@ -855,6 +855,7 @@ class TypeRefBuilder {
855855 using ByteReader = std::function<remote::MemoryReader::ReadBytesResult (remote::RemoteAddress, unsigned )>;
856856 using StringReader = std::function<bool (remote::RemoteAddress, std::string &)>;
857857 using PointerReader = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress, unsigned )>;
858+ using DynamicSymbolResolver = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress)>;
858859 using IntVariableReader = std::function<llvm::Optional<uint64_t > (std::string, unsigned )>;
859860
860861 // These fields are captured from the MetadataReader template passed into the
@@ -868,6 +869,7 @@ class TypeRefBuilder {
868869 ByteReader OpaqueByteReader;
869870 StringReader OpaqueStringReader;
870871 PointerReader OpaquePointerReader;
872+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
871873 IntVariableReader OpaqueIntVariableReader;
872874
873875public:
@@ -895,6 +897,9 @@ class TypeRefBuilder {
895897 OpaquePointerReader ([&reader](remote::RemoteAddress address, unsigned size) -> llvm::Optional<remote::RemoteAbsolutePointer> {
896898 return reader.Reader ->readPointer (address, size);
897899 }),
900+ OpaqueDynamicSymbolResolver ([&reader](remote::RemoteAddress address) -> llvm::Optional<remote::RemoteAbsolutePointer> {
901+ return reader.Reader ->getDynamicSymbol (address);
902+ }),
898903 OpaqueIntVariableReader (
899904 [&reader](std::string symbol, unsigned size) -> llvm::Optional<uint64_t> {
900905 llvm::Optional<uint64_t > result;
@@ -1019,13 +1024,16 @@ class TypeRefBuilder {
10191024 ByteReader OpaqueByteReader;
10201025 StringReader OpaqueStringReader;
10211026 PointerReader OpaquePointerReader;
1027+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
10221028
10231029 ProtocolConformanceDescriptorReader (ByteReader byteReader,
10241030 StringReader stringReader,
1025- PointerReader pointerReader)
1031+ PointerReader pointerReader,
1032+ DynamicSymbolResolver dynamicSymbolResolver)
10261033 : Error(" " ), OpaqueByteReader(byteReader),
1027- OpaqueStringReader (stringReader), OpaquePointerReader(pointerReader) {
1028- }
1034+ OpaqueStringReader (stringReader),
1035+ OpaquePointerReader(pointerReader),
1036+ OpaqueDynamicSymbolResolver(dynamicSymbolResolver) {}
10291037
10301038 llvm::Optional<std::string>
10311039 getParentContextName (uintptr_t contextDescriptorAddress) {
@@ -1248,17 +1256,16 @@ class TypeRefBuilder {
12481256 return llvm::None;
12491257 }
12501258 auto contextDescriptorOffset =
1251- (const uint32_t *)contextDescriptorOffsetBytes.get ();
1259+ (const int32_t *)contextDescriptorOffsetBytes.get ();
12521260
12531261 // Read the type descriptor itself using the address computed above
12541262 auto contextTypeDescriptorAddress = detail::applyRelativeOffset (
12551263 (const char *)contextDescriptorFieldAddress,
1256- ( int32_t ) *contextDescriptorOffset);
1264+ *contextDescriptorOffset);
12571265
12581266 // Instead of a type descriptor this may just be a symbol reference, check that first
1259- if (auto symbol = OpaquePointerReader (remote::RemoteAddress (contextTypeDescriptorAddress),
1260- PointerSize)) {
1261- if (!symbol->getSymbol ().empty ()) {
1267+ if (auto symbol = OpaqueDynamicSymbolResolver (remote::RemoteAddress (contextTypeDescriptorAddress))) {
1268+ if (!symbol->isResolved ()) {
12621269 mangledTypeName = symbol->getSymbol ().str ();
12631270 Demangle::Context Ctx;
12641271 auto demangledRoot =
@@ -1267,6 +1274,9 @@ class TypeRefBuilder {
12671274 typeName =
12681275 nodeToString (demangledRoot->getChild (0 )->getChild (0 ));
12691276 return std::make_pair (mangledTypeName, typeName);
1277+ } else if (symbol->getOffset ()) {
1278+ // If symbol is empty and has an offset, this is the resolved remote address
1279+ contextTypeDescriptorAddress = symbol->getOffset ();
12701280 }
12711281 }
12721282
@@ -1462,7 +1472,7 @@ class TypeRefBuilder {
14621472 std::unordered_map<std::string, std::vector<std::string>> typeConformances;
14631473 ProtocolConformanceDescriptorReader<ObjCInteropKind, PointerSize>
14641474 conformanceReader (OpaqueByteReader, OpaqueStringReader,
1465- OpaquePointerReader);
1475+ OpaquePointerReader, OpaqueDynamicSymbolResolver );
14661476 for (const auto §ion : ReflectionInfos) {
14671477 auto ConformanceBegin = section.Conformance .startAddress ();
14681478 auto ConformanceEnd = section.Conformance .endAddress ();
0 commit comments