Skip to content

Commit 8e6684a

Browse files
committed
[lldb] Make LLDBMemoryReader::resolvePointer strip the pointer
In order to know if the pointer we're dealing with is mapped by LLDBMemoryReader, we need to strip it first. rdar://94239864
1 parent e41a0a1 commit 8e6684a

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
189189
if (!readMetadataFromFileCacheEnabled())
190190
return process_pointer;
191191

192+
// Try to strip the pointer before checking if we have it mapped.
193+
auto strippedPointer = signedPointerStripper(process_pointer);
194+
if (strippedPointer.isResolved())
195+
readValue = strippedPointer.getOffset();
196+
192197
auto &target = m_process.GetTarget();
193198
Address addr;
194199
if (!target.ResolveLoadAddress(readValue, addr)) {

lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717
namespace lldb_private {
1818
class LLDBMemoryReader : public swift::remote::MemoryReader {
1919
public:
20-
LLDBMemoryReader(Process &p, size_t max_read_amount = INT32_MAX)
21-
: m_process(p), m_range_module_map() {
20+
LLDBMemoryReader(Process &p,
21+
std::function<swift::remote::RemoteAbsolutePointer(
22+
swift::remote::RemoteAbsolutePointer)>
23+
stripper,
24+
size_t max_read_amount = INT32_MAX)
25+
: m_process(p), signedPointerStripper(stripper), m_range_module_map() {
2226
m_max_read_amount = max_read_amount;
2327
}
2428

@@ -84,6 +88,10 @@ llvm::Optional<Address> resolveRemoteAddressFromSymbolObjectFile(uint64_t addres
8488
llvm::Optional<uint64_t> m_local_buffer;
8589
uint64_t m_local_buffer_size = 0;
8690

91+
std::function<swift::remote::RemoteAbsolutePointer(
92+
swift::remote::RemoteAbsolutePointer)>
93+
signedPointerStripper;
94+
8795
/// LLDBMemoryReader prefers to read reflection metadata from the
8896
/// binary on disk, which is faster than reading it out of process
8997
/// memory, especially when debugging remotely. To achieve this LLDB

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ class TargetReflectionContext
350350
return m_reflection_ctx.isValueInlinedInExistentialContainer(
351351
existential_address);
352352
}
353+
354+
swift::remote::RemoteAbsolutePointer
355+
stripSignedPointer(swift::remote::RemoteAbsolutePointer pointer) override {
356+
return m_reflection_ctx.stripSignedPointer(pointer);
357+
}
353358
};
354359

355360
} // namespace
@@ -406,8 +411,13 @@ const CompilerType &SwiftLanguageRuntimeImpl::GetBoxMetadataType() {
406411

407412
std::shared_ptr<LLDBMemoryReader>
408413
SwiftLanguageRuntimeImpl::GetMemoryReader() {
409-
if (!m_memory_reader_sp)
410-
m_memory_reader_sp.reset(new LLDBMemoryReader(m_process));
414+
if (!m_memory_reader_sp) {
415+
m_memory_reader_sp.reset(new LLDBMemoryReader(
416+
m_process, [&](swift::remote::RemoteAbsolutePointer pointer) {
417+
auto *reflection_context = GetReflectionContext();
418+
return reflection_context->stripSignedPointer(pointer);
419+
}));
420+
}
411421

412422
return m_memory_reader_sp;
413423
}

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeImpl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ class SwiftLanguageRuntimeImpl {
243243
virtual swift::reflection::TypeRefBuilder &getBuilder() = 0;
244244
virtual llvm::Optional<bool> isValueInlinedInExistentialContainer(
245245
swift::remote::RemoteAddress existential_address) = 0;
246+
virtual swift::remote::RemoteAbsolutePointer
247+
stripSignedPointer(swift::remote::RemoteAbsolutePointer pointer) = 0;
246248
};
247249

248250
protected:

0 commit comments

Comments
 (0)