Skip to content

Commit 9381a54

Browse files
committed
[RemoteInspection] Change RemoteAbsolutePointer (NFC)
This patch changes RemoteAbsolutePointer to store both the symbol and the resolved address. This allows us to retire some ugly workarounds to deal with non-symbolic addresses and it fixes code paths that would need these workarounds, but haven't implemented them yet (i.e., the pack shape handling in the symbolicReferenceResolver in MetadatyaReader. Addresses parts of rdar://146273066. rdar://153687085
1 parent e42b564 commit 9381a54

File tree

6 files changed

+46
-70
lines changed

6 files changed

+46
-70
lines changed

include/swift/Remote/MemoryReader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class MemoryReader {
147147
virtual RemoteAbsolutePointer resolvePointer(RemoteAddress address,
148148
uint64_t readValue) {
149149
// Default implementation returns the read value as is.
150-
return RemoteAbsolutePointer("", readValue);
150+
return RemoteAbsolutePointer(RemoteAddress(readValue));
151151
}
152152

153153
/// Performs the inverse operation of \ref resolvePointer.
@@ -166,7 +166,7 @@ class MemoryReader {
166166
virtual RemoteAbsolutePointer getSymbol(RemoteAddress address) {
167167
if (auto symbol = resolvePointerAsSymbol(address))
168168
return *symbol;
169-
return RemoteAbsolutePointer("", address.getAddressData());
169+
return RemoteAbsolutePointer(address);
170170
}
171171

172172
/// Lookup a dynamic symbol name (ie dynamic loader binding) for the given

include/swift/Remote/MetadataReader.h

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -416,11 +416,9 @@ class MetadataReader {
416416
}
417417

418418
RemoteAbsolutePointer stripSignedPointer(const RemoteAbsolutePointer &P) {
419-
if (P.isResolved()) {
420-
return RemoteAbsolutePointer("",
421-
P.getResolvedAddress().getAddressData() & PtrAuthMask);
422-
}
423-
return P;
419+
return RemoteAbsolutePointer(
420+
P.getSymbol(), P.getOffset(),
421+
RemoteAddress(P.getResolvedAddress().getAddressData() & PtrAuthMask));
424422
}
425423

426424
StoredPointer queryPtrAuthMask() {
@@ -519,29 +517,13 @@ class MetadataReader {
519517
// The second entry is a relative address to the mangled protocol
520518
// without symbolic references.
521519

522-
// lldb might return an unresolved remote absolute pointer from its
523-
// resolvePointerAsSymbol implementation -- workaround this.
524-
if (!resolved.isResolved()) {
525-
auto remoteAddr = RemoteAddress(remoteAddress);
526-
resolved =
527-
RemoteAbsolutePointer("", remoteAddr.getAddressData());
528-
}
529-
530520
auto addr =
531521
resolved.getResolvedAddress().getAddressData() + sizeof(int32_t);
532522
int32_t offset;
533523
Reader->readInteger(RemoteAddress(addr), &offset);
534524
auto addrOfTypeRef = addr + offset;
535525
resolved = Reader->getSymbol(RemoteAddress(addrOfTypeRef));
536526

537-
// lldb might return an unresolved remote absolute pointer from its
538-
// resolvePointerAsSymbol implementation -- workaround this.
539-
if (!resolved.isResolved()) {
540-
auto remoteAddr = RemoteAddress(addrOfTypeRef);
541-
resolved =
542-
RemoteAbsolutePointer("", remoteAddr.getAddressData());
543-
}
544-
545527
// Dig out the protocol from the protocol list.
546528
auto protocolList = readMangledName(resolved.getResolvedAddress(),
547529
MangledNameKind::Type, dem);
@@ -1379,12 +1361,10 @@ class MetadataReader {
13791361
ParentContextDescriptorRef
13801362
readContextDescriptor(const RemoteAbsolutePointer &address) {
13811363
// Map an unresolved pointer to an unresolved context ref.
1382-
if (!address.isResolved()) {
1364+
if (!address.getSymbol().empty()) {
13831365
// We can only handle references to a symbol without an offset currently.
1384-
if (address.getOffset() != 0) {
1385-
return ParentContextDescriptorRef();
1386-
}
1387-
return ParentContextDescriptorRef(address.getSymbol());
1366+
if (address.getOffset() == 0)
1367+
return ParentContextDescriptorRef(address.getSymbol());
13881368
}
13891369

13901370
return ParentContextDescriptorRef(
@@ -2016,7 +1996,7 @@ class MetadataReader {
20161996

20171997
std::optional<StoredPointer> readResolvedPointerValue(StoredPointer address) {
20181998
if (auto pointer = readPointer(address)) {
2019-
if (!pointer->isResolved())
1999+
if (!pointer->getResolvedAddress())
20202000
return std::nullopt;
20212001
return (StoredPointer)pointer->getResolvedAddress().getAddressData();
20222002
}
@@ -2079,7 +2059,7 @@ class MetadataReader {
20792059
return std::nullopt;
20802060
}
20812061

2082-
return RemoteAbsolutePointer("", resultAddress);
2062+
return RemoteAbsolutePointer(RemoteAddress(resultAddress));
20832063
}
20842064

20852065
/// Given a pointer to an Objective-C class, try to read its class name.
@@ -2335,13 +2315,11 @@ class MetadataReader {
23352315
auto parentAddress = resolveRelativeIndirectableField(base, base->Parent);
23362316
if (!parentAddress)
23372317
return std::nullopt;
2338-
if (!parentAddress->isResolved()) {
2318+
if (!parentAddress->getSymbol().empty()) {
23392319
// Currently we can only handle references directly to a symbol without
23402320
// an offset.
2341-
if (parentAddress->getOffset() != 0) {
2342-
return std::nullopt;
2343-
}
2344-
return ParentContextDescriptorRef(parentAddress->getSymbol());
2321+
if (parentAddress->getOffset() == 0)
2322+
return ParentContextDescriptorRef(parentAddress->getSymbol());
23452323
}
23462324
auto addr = parentAddress->getResolvedAddress();
23472325
if (!addr)

include/swift/Remote/RemoteAddress.h

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -63,35 +63,30 @@ class RemoteAddress {
6363

6464
/// A symbolic relocated absolute pointer value.
6565
class RemoteAbsolutePointer {
66-
/// The symbol name that the pointer refers to. Empty if the value is absolute.
66+
/// The symbol name that the pointer refers to. Empty if only an absolute
67+
/// address is available.
6768
std::string Symbol;
68-
/// The offset from the symbol, or the resolved remote address if \c Symbol is empty.
69-
int64_t Offset;
69+
/// The offset from the symbol.
70+
int64_t Offset = 0;
71+
/// The resolved remote address.
72+
RemoteAddress Address = RemoteAddress{(uint64_t)0};
7073

7174
public:
72-
RemoteAbsolutePointer()
73-
: Symbol(), Offset(0)
74-
{}
75-
76-
RemoteAbsolutePointer(std::nullptr_t)
77-
: RemoteAbsolutePointer()
78-
{}
79-
80-
RemoteAbsolutePointer(llvm::StringRef Symbol, int64_t Offset)
81-
: Symbol(Symbol), Offset(Offset)
82-
{}
83-
84-
bool isResolved() const { return Symbol.empty(); }
75+
RemoteAbsolutePointer() = default;
76+
RemoteAbsolutePointer(std::nullptr_t) : RemoteAbsolutePointer() {}
77+
78+
RemoteAbsolutePointer(llvm::StringRef Symbol, int64_t Offset,
79+
RemoteAddress Address)
80+
: Symbol(Symbol), Offset(Offset), Address(Address) {}
81+
RemoteAbsolutePointer(RemoteAddress Address) : Address(Address) {}
82+
8583
llvm::StringRef getSymbol() const { return Symbol; }
8684
int64_t getOffset() const { return Offset; }
87-
88-
RemoteAddress getResolvedAddress() const {
89-
assert(isResolved());
90-
return RemoteAddress(Offset);
91-
}
92-
85+
86+
RemoteAddress getResolvedAddress() const { return Address; }
87+
9388
explicit operator bool() const {
94-
return Offset != 0 || !Symbol.empty();
89+
return Address || !Symbol.empty();
9590
}
9691
};
9792

include/swift/RemoteInspection/ReflectionContext.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ class ReflectionContext
10191019
auto CDAddr = this->readCaptureDescriptorFromMetadata(*MetadataAddress);
10201020
if (!CDAddr)
10211021
return nullptr;
1022-
if (!CDAddr->isResolved())
1022+
if (!CDAddr->getResolvedAddress())
10231023
return nullptr;
10241024

10251025
// FIXME: Non-generic SIL boxes also use the HeapLocalVariable metadata

include/swift/RemoteInspection/TypeRefBuilder.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,7 +1871,7 @@ class TypeRefBuilder {
18711871
if (auto symbol = OpaquePointerReader(
18721872
remote::RemoteAddress(adjustedProtocolDescriptorTarget),
18731873
PointerSize)) {
1874-
if (!symbol->getSymbol().empty()) {
1874+
if (!symbol->getSymbol().empty() && symbol->getOffset() == 0) {
18751875
Demangle::Context Ctx;
18761876
auto demangledRoot =
18771877
Ctx.demangleSymbolAsNode(symbol->getSymbol().str());
@@ -1882,7 +1882,8 @@ class TypeRefBuilder {
18821882
nodeToString(demangledRoot->getChild(0)->getChild(0));
18831883
} else {
18841884
// This is an absolute address of a protocol descriptor
1885-
auto protocolDescriptorAddress = (uintptr_t)symbol->getOffset();
1885+
auto protocolDescriptorAddress =
1886+
(uintptr_t)symbol->getResolvedAddress().getAddressData();
18861887
protocolName = readFullyQualifiedProtocolNameFromProtocolDescriptor(
18871888
protocolDescriptorAddress);
18881889
}
@@ -2026,7 +2027,7 @@ class TypeRefBuilder {
20262027
if (auto symbol = OpaquePointerReader(
20272028
remote::RemoteAddress(adjustedParentTargetAddress),
20282029
PointerSize)) {
2029-
if (!symbol->getSymbol().empty()) {
2030+
if (!symbol->getSymbol().empty() && symbol->getOffset() == 0) {
20302031
Demangle::Context Ctx;
20312032
auto demangledRoot =
20322033
Ctx.demangleSymbolAsNode(symbol->getSymbol().str());
@@ -2264,7 +2265,7 @@ class TypeRefBuilder {
22642265
// external, check that first
22652266
if (auto symbol = OpaqueDynamicSymbolResolver(
22662267
remote::RemoteAddress(contextTypeDescriptorAddress))) {
2267-
if (!symbol->isResolved()) {
2268+
if (!symbol->getSymbol().empty() && symbol->getOffset() == 0) {
22682269
Demangle::Context Ctx;
22692270
auto demangledRoot =
22702271
Ctx.demangleSymbolAsNode(symbol->getSymbol().str());
@@ -2283,10 +2284,11 @@ class TypeRefBuilder {
22832284
mangledTypeName = typeMangling.result();
22842285

22852286
return std::make_pair(mangledTypeName, typeName);
2286-
} else if (symbol->getOffset()) {
2287+
} else if (symbol->getResolvedAddress()) {
22872288
// If symbol is empty and has an offset, this is the resolved remote
22882289
// address
2289-
contextTypeDescriptorAddress = symbol->getOffset();
2290+
contextTypeDescriptorAddress =
2291+
symbol->getResolvedAddress().getAddressData();
22902292
}
22912293
}
22922294

lib/StaticMirror/ObjectFileContext.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -322,9 +322,9 @@ Image::resolvePointer(uint64_t Addr, uint64_t pointerValue) const {
322322
// 32 bits.
323323
if (isMachOWithPtrAuth()) {
324324
return remote::RemoteAbsolutePointer(
325-
"", HeaderAddress + (pointerValue & 0xffffffffull));
325+
remote::RemoteAddress(HeaderAddress + (pointerValue & 0xffffffffull)));
326326
} else {
327-
return remote::RemoteAbsolutePointer("", pointerValue);
327+
return remote::RemoteAbsolutePointer(remote::RemoteAddress(pointerValue));
328328
}
329329
}
330330

@@ -333,7 +333,8 @@ remote::RemoteAbsolutePointer Image::getDynamicSymbol(uint64_t Addr) const {
333333
if (found == DynamicRelocations.end())
334334
return nullptr;
335335
return remote::RemoteAbsolutePointer(found->second.Symbol,
336-
found->second.Offset);
336+
found->second.Offset,
337+
remote::RemoteAddress((uint64_t)0));
337338
}
338339

339340
std::pair<const Image *, uint64_t>
@@ -526,8 +527,8 @@ ObjectMemoryReader::resolvePointer(reflection::RemoteAddress Addr,
526527
// Mix in the image index again to produce a remote address pointing into the
527528
// same image.
528529
return remote::RemoteAbsolutePointer(
529-
"", encodeImageIndexAndAddress(
530-
image, resolved.getResolvedAddress().getAddressData()));
530+
remote::RemoteAddress(encodeImageIndexAndAddress(
531+
image, resolved.getResolvedAddress().getAddressData())));
531532
}
532533

533534
remote::RemoteAbsolutePointer

0 commit comments

Comments
 (0)