Skip to content

Commit 001ca67

Browse files
committed
[DRAFT][lldb] Replace StoredPointer with RemoteAddress
This patch is still in a draft stage.
1 parent 5246b24 commit 001ca67

File tree

10 files changed

+73
-82
lines changed

10 files changed

+73
-82
lines changed

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

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ swift::remote::RemoteAddress
8484
LLDBMemoryReader::getSymbolAddress(const std::string &name) {
8585
lldbassert(!name.empty());
8686
if (name.empty())
87-
return swift::remote::RemoteAddress(nullptr);
87+
return swift::remote::RemoteAddress();
8888

8989
Log *log = GetLog(LLDBLog::Types);
9090

@@ -97,7 +97,7 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
9797
name_cs, lldb::eSymbolTypeAny, sc_list);
9898
if (!sc_list.GetSize()) {
9999
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
100-
return swift::remote::RemoteAddress(nullptr);
100+
return swift::remote::RemoteAddress();
101101
}
102102

103103
SymbolContext sym_ctx;
@@ -118,14 +118,14 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
118118
if (sym_ctx.symbol) {
119119
auto load_addr = sym_ctx.symbol->GetLoadAddress(&m_process.GetTarget());
120120
LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0:x}", load_addr);
121-
return swift::remote::RemoteAddress(load_addr);
121+
return swift::remote::RemoteAddress::makeAddress(load_addr);
122122
}
123123
}
124124

125125
// Empty list, resolution failed.
126126
if (sc_list.GetSize() == 0) {
127127
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
128-
return swift::remote::RemoteAddress(nullptr);
128+
return swift::remote::RemoteAddress();
129129
}
130130

131131
// If there's a single symbol, then we're golden. If there's more than
@@ -140,11 +140,11 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
140140
load_addr, m_process.GetAddressByteSize(), 0, error, true);
141141
if (sym_value != other_sym_value) {
142142
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
143-
return swift::remote::RemoteAddress(nullptr);
143+
return swift::remote::RemoteAddress();
144144
}
145145
}
146146
LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0}", load_addr);
147-
return swift::remote::RemoteAddress(load_addr);
147+
return swift::remote::RemoteAddress::makeAddress(load_addr);
148148
}
149149

150150
static std::unique_ptr<swift::SwiftObjectFileFormat>
@@ -214,7 +214,7 @@ LLDBMemoryReader::resolvePointerAsSymbol(swift::remote::RemoteAddress address) {
214214
// aware of local symbols, so avoid returning those.
215215
using namespace swift::Demangle;
216216
if (isSwiftSymbol(mangledName) && !isOldFunctionTypeMangling(mangledName))
217-
return {{mangledName, 0}};
217+
return {{mangledName, swift::remote::RemoteAddress()}};
218218
}
219219

220220
return {};
@@ -228,15 +228,16 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
228228
// We may have gotten a pointer to a process address, try to map it back
229229
// to a tagged address so further memory reads originating from it benefit
230230
// from the file-cache optimization.
231-
swift::remote::RemoteAbsolutePointer process_pointer("", readValue);
231+
swift::remote::RemoteAbsolutePointer process_pointer(
232+
"", swift::remote::RemoteAddress::makeAddress(readValue));
232233

233234
if (!readMetadataFromFileCacheEnabled())
234235
return process_pointer;
235236

236237
// Try to strip the pointer before checking if we have it mapped.
237238
auto strippedPointer = signedPointerStripper(process_pointer);
238239
if (strippedPointer.isResolved())
239-
readValue = strippedPointer.getOffset();
240+
readValue = strippedPointer.getOffset().getAddressData();
240241

241242
auto &target = m_process.GetTarget();
242243
Address addr;
@@ -293,9 +294,11 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
293294
return process_pointer;
294295
}
295296

296-
swift::remote::RemoteAbsolutePointer tagged_pointer("", tagged_address);
297-
if (tagged_address !=
298-
(uint64_t)signedPointerStripper(tagged_pointer).getOffset()) {
297+
swift::remote::RemoteAbsolutePointer tagged_pointer(
298+
"", swift::remote::RemoteAddress::makeAddress(tagged_address));
299+
if (tagged_address != (uint64_t)signedPointerStripper(tagged_pointer)
300+
.getOffset()
301+
.getAddressData()) {
299302
lldbassert(false &&
300303
"Tagged pointer runs into pointer authentication mask!");
301304
return process_pointer;
@@ -535,8 +538,11 @@ LLDBMemoryReader::addModuleToAddressMap(ModuleSP module,
535538

536539
if (module_end_address !=
537540
(uint64_t)signedPointerStripper(
538-
swift::remote::RemoteAbsolutePointer("", module_end_address))
539-
.getOffset()) {
541+
swift::remote::RemoteAbsolutePointer(
542+
"",
543+
swift::remote::RemoteAddress::makeAddress(module_end_address)))
544+
.getOffset()
545+
.getAddressData()) {
540546
LLDB_LOG(GetLog(LLDBLog::Types),
541547
"[MemoryReader] module to address map ran into pointer "
542548
"authentication mask!");
@@ -614,7 +620,7 @@ LLDBMemoryReader::resolveRemoteAddress(
614620
return {};
615621
lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget());
616622
if (addr != LLDB_INVALID_ADDRESS)
617-
return swift::reflection::RemoteAddress(addr);
623+
return swift::reflection::RemoteAddress::makeAddress(addr);
618624
return {};
619625
}
620626

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
223223
lldb::addr_t instance, swift::remote::TypeInfoProvider *provider,
224224
swift::reflection::DescriptorFinder *descriptor_finder) override {
225225
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
226-
auto *ti = m_reflection_ctx.getInstanceTypeInfo(instance, provider);
226+
auto *ti = m_reflection_ctx.getInstanceTypeInfo(
227+
swift::remote::RemoteAddress::makeAddress(instance), provider);
227228
if (!ti)
228229
return llvm::createStringError("could not get instance type info");
229230
return *ti;
@@ -273,7 +274,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
273274
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
274275
// Guard against faulty self-referential metadata.
275276
unsigned limit = 256;
276-
auto md_ptr = m_reflection_ctx.readMetadataFromInstance(pointer);
277+
auto md_ptr = m_reflection_ctx.readMetadataFromInstance(
278+
swift::remote::RemoteAddress::makeAddress(pointer));
277279
if (!md_ptr)
278280
return false;
279281

@@ -345,7 +347,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
345347
bool skip_artificial_subclasses) override {
346348
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
347349
if (auto *tr = m_reflection_ctx.readTypeFromMetadata(
348-
metadata_address, skip_artificial_subclasses))
350+
swift::remote::RemoteAddress::makeAddress(metadata_address),
351+
skip_artificial_subclasses))
349352
return *tr;
350353
return llvm::createStringError("could not read type from metadata");
351354
}
@@ -355,8 +358,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
355358
swift::reflection::DescriptorFinder *descriptor_finder,
356359
bool skip_artificial_subclasses) override {
357360
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
358-
auto metadata_address =
359-
m_reflection_ctx.readMetadataFromInstance(instance_address);
361+
auto metadata_address = m_reflection_ctx.readMetadataFromInstance(
362+
swift::remote::RemoteAddress::makeAddress(instance_address));
360363
if (!metadata_address)
361364
return llvm::createStringError(
362365
llvm::formatv("could not read heap metadata for object at {0:x}",
@@ -370,7 +373,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
370373

371374
std::optional<swift::remote::RemoteAbsolutePointer>
372375
ReadPointer(lldb::addr_t instance_address) override {
373-
auto ptr = m_reflection_ctx.readPointer(instance_address);
376+
auto ptr = m_reflection_ctx.readPointer(
377+
swift::remote::RemoteAddress::makeAddress(instance_address));
374378
return ptr;
375379
}
376380

@@ -392,14 +396,15 @@ class TargetReflectionContext : public ReflectionContextInterface {
392396

393397
swift::remote::RemoteAbsolutePointer
394398
StripSignedPointer(swift::remote::RemoteAbsolutePointer pointer) override {
395-
return m_reflection_ctx.stripSignedPointer(pointer);
399+
return m_reflection_ctx.stripSignedPointer3(pointer);
396400
}
397401

398402
llvm::Expected<AsyncTaskInfo>
399403
asyncTaskInfo(lldb::addr_t AsyncTaskPtr, unsigned ChildTaskLimit,
400404
unsigned AsyncBacktraceLimit) override {
401405
auto [error, task_info] = m_reflection_ctx.asyncTaskInfo(
402-
AsyncTaskPtr, ChildTaskLimit, AsyncBacktraceLimit);
406+
swift::remote::RemoteAddress::makeAddress(AsyncTaskPtr), ChildTaskLimit,
407+
AsyncBacktraceLimit);
403408
if (error)
404409
return llvm::createStringError(*error);
405410

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,10 @@ bool SwiftLanguageRuntime::AddJitObjectFileToReflectionContext(
584584

585585
auto *Buf = malloc(size);
586586
std::memcpy(Buf, data.begin(), size);
587-
swift::remote::RemoteRef<void> remote_ref(section->GetFileAddress(),
588-
Buf);
587+
swift::remote::RemoteRef<void> remote_ref(
588+
swift::remote::RemoteAddress::makeAddress(
589+
section->GetFileAddress()),
590+
Buf);
589591

590592
return {remote_ref, size};
591593
}
@@ -723,7 +725,8 @@ std::optional<uint32_t> SwiftLanguageRuntime::AddObjectFileToReflectionContext(
723725
section_list->GetSectionAtIndex(0)->GetFileAddress();
724726
assert(address <= end_address && "Address outside of range!");
725727

726-
swift::remote::RemoteRef<void> remote_ref(address, Buf);
728+
swift::remote::RemoteRef<void> remote_ref(
729+
swift::remote::RemoteAddress::makeAddress(address), Buf);
727730
return {remote_ref, size};
728731
}
729732
}
@@ -794,18 +797,20 @@ bool SwiftLanguageRuntime::AddModuleToReflectionContext(
794797
const uint8_t *file_data = extractor.GetDataStart();
795798
llvm::sys::MemoryBlock file_buffer((void *)file_data, size);
796799
info_id = m_reflection_ctx->ReadELF(
797-
swift::remote::RemoteAddress(load_ptr),
800+
swift::remote::RemoteAddress::makeAddress(load_ptr),
798801
std::optional<llvm::sys::MemoryBlock>(file_buffer),
799802
likely_module_names);
800803
} else if (read_from_file_cache &&
801804
obj_file->GetPluginName() == "mach-o") {
802805
info_id = AddObjectFileToReflectionContext(module_sp, likely_module_names);
803806
if (!info_id)
804-
info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr),
805-
likely_module_names);
807+
info_id = m_reflection_ctx->AddImage(
808+
swift::remote::RemoteAddress::makeAddress(load_ptr),
809+
likely_module_names);
806810
} else {
807-
info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr),
808-
likely_module_names);
811+
info_id = m_reflection_ctx->AddImage(
812+
swift::remote::RemoteAddress::makeAddress(load_ptr),
813+
likely_module_names);
809814
}
810815

811816
if (!info_id) {

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,8 @@ llvm::Expected<std::string> SwiftLanguageRuntime::GetEnumCaseName(
14371437

14381438
auto *eti = llvm::cast<EnumTypeInfo>(ti);
14391439
auto buffer_holder = PushLocalBuffer((int64_t)data.GetDataStart(), data.GetByteSize());
1440-
RemoteAddress addr(data.GetDataStart());
1440+
RemoteAddress addr =
1441+
RemoteAddress::makeAddress((uint64_t)data.GetDataStart());
14411442
int case_index;
14421443
if (eti->projectEnumValue(*GetMemoryReader(), addr, &case_index))
14431444
return eti->getCases()[case_index].Name;
@@ -1550,7 +1551,7 @@ SwiftLanguageRuntime::ProjectEnum(ValueObject &valobj) {
15501551
}
15511552
}
15521553

1553-
swift::reflection::RemoteAddress remote_addr(addr);
1554+
auto remote_addr = swift::reflection::RemoteAddress::makeAddress(addr);
15541555
int case_index;
15551556
auto *eti = llvm::cast<swift::reflection::EnumTypeInfo>(ti);
15561557
if (!eti->projectEnumValue(*GetMemoryReader(), remote_addr, &case_index))
@@ -2036,7 +2037,8 @@ CompilerType SwiftLanguageRuntime::GetDynamicTypeAndAddress_EmbeddedClass(
20362037
if (pointer->isResolved()) {
20372038
// Find the symbol name at this address.
20382039
Address address;
2039-
address.SetLoadAddress(pointer->getOffset(), &GetProcess().GetTarget());
2040+
address.SetLoadAddress(pointer->getOffset().getAddressData(),
2041+
&GetProcess().GetTarget());
20402042
Symbol *symbol = address.CalculateSymbolContextSymbol();
20412043
if (!symbol)
20422044
return {};
@@ -2290,7 +2292,8 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
22902292
existential_address,
22912293
llvm::expectedToOptional(in_value.GetByteSize()).value_or(0));
22922294

2293-
swift::remote::RemoteAddress remote_existential(existential_address);
2295+
auto remote_existential =
2296+
swift::remote::RemoteAddress::makeAddress(existential_address);
22942297

22952298
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext();
22962299
if (!reflection_ctx)
@@ -2315,7 +2318,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
23152318
}
23162319

23172320
const swift::reflection::TypeRef *typeref;
2318-
swift::remote::RemoteAddress out_address(nullptr);
2321+
swift::remote::RemoteAddress out_address;
23192322
std::tie(typeref, out_address) = *pair;
23202323

23212324
auto ts = tss->GetTypeSystemSwiftTypeRef();
@@ -2338,7 +2341,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
23382341

23392342
uint64_t address = 0;
23402343
if (maybe_addr_or_symbol->isResolved()) {
2341-
address = maybe_addr_or_symbol->getOffset();
2344+
address = maybe_addr_or_symbol->getOffset().getAddressData();
23422345
} else {
23432346
SymbolContextList sc_list;
23442347
auto &module_list = GetProcess().GetTarget().GetImages();
@@ -2357,7 +2360,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
23572360
GetDynamicTypeAndAddress_EmbeddedClass(address, existential_type);
23582361
if (!dynamic_type)
23592362
return false;
2360-
dynamic_address = maybe_addr_or_symbol->getOffset();
2363+
dynamic_address = maybe_addr_or_symbol->getOffset().getAddressData();
23612364
}
23622365
class_type_or_name.SetCompilerType(dynamic_type);
23632366
address.SetRawAddress(dynamic_address);
@@ -2826,7 +2829,8 @@ Value::ValueType SwiftLanguageRuntime::GetValueType(
28262829

28272830
// Read the value witness table and check if the data is inlined in
28282831
// the existential container or not.
2829-
swift::remote::RemoteAddress remote_existential(existential_address);
2832+
auto remote_existential =
2833+
swift::remote::RemoteAddress::makeAddress(existential_address);
28302834
if (ThreadSafeReflectionContext reflection_ctx = GetReflectionContext()) {
28312835
std::optional<bool> is_inlined =
28322836
reflection_ctx->IsValueInlinedInExistentialContainer(

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ std::optional<uint64_t> SwiftLanguageRuntime::GetMemberVariableOffsetRemoteAST(
106106

107107
// Dig out metadata describing the type, if it's easy to find.
108108
// FIXME: the Remote AST library should make this easier.
109-
swift::remote::RemoteAddress optmeta(nullptr);
109+
swift::remote::RemoteAddress optmeta;
110110
const swift::TypeKind type_kind = swift_type->getKind();
111111
switch (type_kind) {
112112
case swift::TypeKind::Class:
@@ -119,7 +119,7 @@ std::optional<uint64_t> SwiftLanguageRuntime::GetMemberVariableOffsetRemoteAST(
119119
lldb::addr_t pointer = instance->GetPointerValue();
120120
if (!pointer || pointer == LLDB_INVALID_ADDRESS)
121121
break;
122-
swift::remote::RemoteAddress address(pointer);
122+
auto address = swift::remote::RemoteAddress::makeAddress(pointer);
123123
if (auto metadata = remote_ast->getHeapMetadataForObject(address))
124124
optmeta = metadata.getValue();
125125
}
@@ -202,7 +202,7 @@ ConstString SwiftLanguageRuntime::GetDynamicTypeName_ClassRemoteAST(
202202

203203
auto &remote_ast = GetRemoteASTContext(*swift_ast_ctx);
204204
auto remote_ast_metadata_address = remote_ast.getHeapMetadataForObject(
205-
swift::remote::RemoteAddress(instance_ptr));
205+
swift::remote::RemoteAddress::makeAddress(instance_ptr));
206206
if (remote_ast_metadata_address) {
207207
auto instance_type = remote_ast.getTypeForRemoteTypeMetadata(
208208
remote_ast_metadata_address.getValue(),
@@ -239,7 +239,8 @@ SwiftLanguageRuntime::GetDynamicTypeAndAddress_ExistentialRemoteAST(
239239
if (!swift_ast_ctx)
240240
return {};
241241

242-
swift::remote::RemoteAddress remote_existential(existential_address);
242+
auto remote_existential =
243+
swift::remote::RemoteAddress::makeAddress(existential_address);
243244
auto &remote_ast = GetRemoteASTContext(*swift_ast_ctx);
244245
auto swift_type =
245246
llvm::expectedToStdOptional(swift_ast_ctx->GetSwiftType(existential_type))
@@ -377,7 +378,7 @@ SwiftLanguageRuntime::BindGenericTypeParametersRemoteAST(
377378
->getAs<swift::GenericTypeParamType>();
378379
auto underlying_type_result =
379380
remote_ast.getUnderlyingTypeForOpaqueType(
380-
swift::remote::RemoteAddress(addr),
381+
swift::remote::RemoteAddress::makeAddress(addr),
381382
opaque_type->getSubstitutions(),
382383
genericParam->getIndex());
383384

@@ -475,7 +476,7 @@ CompilerType SwiftLanguageRuntime::MetadataPromise::FulfillTypePromise(
475476
auto &remote_ast = m_swift_runtime.GetRemoteASTContext(*swift_ast_ctx);
476477
swift::remoteAST::Result<swift::Type> result =
477478
remote_ast.getTypeForRemoteTypeMetadata(
478-
swift::remote::RemoteAddress(m_metadata_location));
479+
swift::remote::RemoteAddress::makeAddress(m_metadata_location));
479480

480481
if (result) {
481482
m_compiler_type = {swift_ast_ctx->weak_from_this(),

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,9 @@ SwiftMetadataCache::generateHashTableBlob(
172172
auto &mangled_name = std::get<1>(pair);
173173
if (mangled_name.empty())
174174
continue;
175-
auto offset = field_descriptor.getAddressData() -
176-
field_descriptors.startAddress().getAddressData();
175+
auto offset =
176+
field_descriptor.getAddressData().getAddressData() -
177+
field_descriptors.startAddress().getAddressData().getAddressData();
177178
table_generator.insert(mangled_name, offset, m_info);
178179
}
179180

0 commit comments

Comments
 (0)