@@ -461,18 +461,20 @@ class MetadataReader {
461461 swift::Demangle::NodePointer {
462462 // Resolve the reference to a remote address.
463463 auto offsetInMangledName =
464- (const char *)base - mangledName.getLocalBuffer ();
465- auto remoteAddress =
466- mangledName.getRemoteAddress () + offsetInMangledName + offset;
464+ (const char *)base - mangledName.getLocalBuffer ();
465+ auto offsetAddress = mangledName.getRemoteAddress () + offsetInMangledName;
467466
468467 RemoteAbsolutePointer resolved;
469468 if (directness == Directness::Indirect) {
469+ auto remoteAddress = Reader->resolveIndirectAddressAtOffset (
470+ offsetAddress, offset, /* directnessEncodedInOffset=*/ false );
470471 if (auto indirectAddress = readPointer (remoteAddress)) {
471472 resolved = stripSignedPointer (*indirectAddress);
472473 } else {
473474 return nullptr ;
474475 }
475476 } else {
477+ auto remoteAddress = offsetAddress + offset;
476478 resolved = Reader->getSymbol (remoteAddress);
477479 }
478480
@@ -2078,17 +2080,19 @@ class MetadataReader {
20782080
20792081 using SignedPointer = typename std::make_signed<StoredPointer>::type;
20802082
2081- RemoteAddress resultAddress = getAddress (fieldRef) + (SignedPointer)offset;
2082-
20832083 // Low bit set in the offset indicates that the offset leads to the absolute
20842084 // address in memory.
20852085 if (indirect) {
2086+ RemoteAddress resultAddress = Reader->resolveIndirectAddressAtOffset (
2087+ getAddress (fieldRef), (SignedPointer)offset,
2088+ /* directnessEncodedInOffset=*/ true );
20862089 if (auto ptr = readPointer (resultAddress)) {
20872090 return stripSignedPointer (*ptr);
20882091 }
20892092 return std::nullopt ;
20902093 }
20912094
2095+ RemoteAddress resultAddress = getAddress (fieldRef) + (SignedPointer)offset;
20922096 return RemoteAbsolutePointer (resultAddress);
20932097 }
20942098
0 commit comments