@@ -457,18 +457,20 @@ class MetadataReader {
457457 swift::Demangle::NodePointer {
458458 // Resolve the reference to a remote address.
459459 auto offsetInMangledName =
460- (const char *)base - mangledName.getLocalBuffer ();
461- auto remoteAddress =
462- mangledName.getRemoteAddress () + offsetInMangledName + offset;
460+ (const char *)base - mangledName.getLocalBuffer ();
461+ auto offsetAddress = mangledName.getRemoteAddress () + offsetInMangledName;
463462
464463 RemoteAbsolutePointer resolved;
465464 if (directness == Directness::Indirect) {
465+ auto remoteAddress = Reader->resolveIndirectAddressAtOffset (
466+ offsetAddress, offset, /* directnessEncodedInOffset=*/ false );
466467 if (auto indirectAddress = readPointer (remoteAddress)) {
467468 resolved = stripSignedPointer (*indirectAddress);
468469 } else {
469470 return nullptr ;
470471 }
471472 } else {
473+ auto remoteAddress = offsetAddress + offset;
472474 resolved = Reader->getSymbol (remoteAddress);
473475 }
474476
@@ -2084,17 +2086,19 @@ class MetadataReader {
20842086
20852087 using SignedPointer = typename std::make_signed<StoredPointer>::type;
20862088
2087- RemoteAddress resultAddress = getAddress (fieldRef) + (SignedPointer)offset;
2088-
20892089 // Low bit set in the offset indicates that the offset leads to the absolute
20902090 // address in memory.
20912091 if (indirect) {
2092+ RemoteAddress resultAddress = Reader->resolveIndirectAddressAtOffset (
2093+ getAddress (fieldRef), (SignedPointer)offset,
2094+ /* directnessEncodedInOffset=*/ true );
20922095 if (auto ptr = readPointer (resultAddress)) {
20932096 return stripSignedPointer (*ptr);
20942097 }
20952098 return std::nullopt ;
20962099 }
20972100
2101+ RemoteAddress resultAddress = getAddress (fieldRef) + (SignedPointer)offset;
20982102 return RemoteAbsolutePointer (resultAddress);
20992103 }
21002104
0 commit comments