@@ -855,6 +855,7 @@ class TypeRefBuilder {
855
855
using ByteReader = std::function<remote::MemoryReader::ReadBytesResult (remote::RemoteAddress, unsigned )>;
856
856
using StringReader = std::function<bool (remote::RemoteAddress, std::string &)>;
857
857
using PointerReader = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress, unsigned )>;
858
+ using DynamicSymbolResolver = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress)>;
858
859
using IntVariableReader = std::function<llvm::Optional<uint64_t > (std::string, unsigned )>;
859
860
860
861
// These fields are captured from the MetadataReader template passed into the
@@ -868,6 +869,7 @@ class TypeRefBuilder {
868
869
ByteReader OpaqueByteReader;
869
870
StringReader OpaqueStringReader;
870
871
PointerReader OpaquePointerReader;
872
+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
871
873
IntVariableReader OpaqueIntVariableReader;
872
874
873
875
public:
@@ -895,6 +897,9 @@ class TypeRefBuilder {
895
897
OpaquePointerReader ([&reader](remote::RemoteAddress address, unsigned size) -> llvm::Optional<remote::RemoteAbsolutePointer> {
896
898
return reader.Reader ->readPointer (address, size);
897
899
}),
900
+ OpaqueDynamicSymbolResolver ([&reader](remote::RemoteAddress address) -> llvm::Optional<remote::RemoteAbsolutePointer> {
901
+ return reader.Reader ->getDynamicSymbol (address);
902
+ }),
898
903
OpaqueIntVariableReader (
899
904
[&reader](std::string symbol, unsigned size) -> llvm::Optional<uint64_t> {
900
905
llvm::Optional<uint64_t > result;
@@ -1019,13 +1024,16 @@ class TypeRefBuilder {
1019
1024
ByteReader OpaqueByteReader;
1020
1025
StringReader OpaqueStringReader;
1021
1026
PointerReader OpaquePointerReader;
1027
+ DynamicSymbolResolver OpaqueDynamicSymbolResolver;
1022
1028
1023
1029
ProtocolConformanceDescriptorReader (ByteReader byteReader,
1024
1030
StringReader stringReader,
1025
- PointerReader pointerReader)
1031
+ PointerReader pointerReader,
1032
+ DynamicSymbolResolver dynamicSymbolResolver)
1026
1033
: Error(" " ), OpaqueByteReader(byteReader),
1027
- OpaqueStringReader (stringReader), OpaquePointerReader(pointerReader) {
1028
- }
1034
+ OpaqueStringReader (stringReader),
1035
+ OpaquePointerReader(pointerReader),
1036
+ OpaqueDynamicSymbolResolver(dynamicSymbolResolver) {}
1029
1037
1030
1038
llvm::Optional<std::string>
1031
1039
getParentContextName (uintptr_t contextDescriptorAddress) {
@@ -1248,17 +1256,16 @@ class TypeRefBuilder {
1248
1256
return llvm::None;
1249
1257
}
1250
1258
auto contextDescriptorOffset =
1251
- (const uint32_t *)contextDescriptorOffsetBytes.get ();
1259
+ (const int32_t *)contextDescriptorOffsetBytes.get ();
1252
1260
1253
1261
// Read the type descriptor itself using the address computed above
1254
1262
auto contextTypeDescriptorAddress = detail::applyRelativeOffset (
1255
1263
(const char *)contextDescriptorFieldAddress,
1256
- ( int32_t ) *contextDescriptorOffset);
1264
+ *contextDescriptorOffset);
1257
1265
1258
1266
// 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 ()) {
1262
1269
mangledTypeName = symbol->getSymbol ().str ();
1263
1270
Demangle::Context Ctx;
1264
1271
auto demangledRoot =
@@ -1267,6 +1274,9 @@ class TypeRefBuilder {
1267
1274
typeName =
1268
1275
nodeToString (demangledRoot->getChild (0 )->getChild (0 ));
1269
1276
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 ();
1270
1280
}
1271
1281
}
1272
1282
@@ -1462,7 +1472,7 @@ class TypeRefBuilder {
1462
1472
std::unordered_map<std::string, std::vector<std::string>> typeConformances;
1463
1473
ProtocolConformanceDescriptorReader<ObjCInteropKind, PointerSize>
1464
1474
conformanceReader (OpaqueByteReader, OpaqueStringReader,
1465
- OpaquePointerReader);
1475
+ OpaquePointerReader, OpaqueDynamicSymbolResolver );
1466
1476
for (const auto §ion : ReflectionInfos) {
1467
1477
auto ConformanceBegin = section.Conformance .startAddress ();
1468
1478
auto ConformanceEnd = section.Conformance .endAddress ();
0 commit comments