Skip to content

Commit 267d063

Browse files
Merge pull request #82325 from adrian-prantl/153687085
[RemoteInspection] Change RemoteAbsolutePointer (NFC)
2 parents 3c8a8a8 + 9381a54 commit 267d063

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
@@ -1020,7 +1020,7 @@ class ReflectionContext
10201020
auto CDAddr = this->readCaptureDescriptorFromMetadata(*MetadataAddress);
10211021
if (!CDAddr)
10221022
return nullptr;
1023-
if (!CDAddr->isResolved())
1023+
if (!CDAddr->getResolvedAddress())
10241024
return nullptr;
10251025

10261026
// 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)