Skip to content

Commit 316f6d2

Browse files
committed
Properly convert file addresses to load addresses when resolving global Swift variables
1 parent fd49e86 commit 316f6d2

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

lldb/source/Core/ValueObjectVariable.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -231,19 +231,26 @@ bool ValueObjectVariable::UpdateValue() {
231231
if (type->GetForwardCompilerType()
232232
.GetTypeSystem()
233233
.dyn_cast_or_null<TypeSystemSwift>() &&
234-
TypePayloadSwift(type->GetPayload()).IsFixedValueBuffer())
234+
TypePayloadSwift(type->GetPayload()).IsFixedValueBuffer() &&
235+
m_value.GetValueType() == Value::ValueType::FileAddress)
235236
if (auto process_sp = GetProcessSP())
236237
if (auto runtime = process_sp->GetLanguageRuntime(
237238
compiler_type.GetMinimumLanguage())) {
238239
if (!runtime->IsStoredInlineInBuffer(compiler_type)) {
239-
lldb::addr_t addr =
240-
m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
241-
if (addr != LLDB_INVALID_ADDRESS) {
242-
Target &target = process_sp->GetTarget();
243-
size_t ptr_size = process_sp->GetAddressByteSize();
244-
lldb::addr_t deref_addr;
245-
target.ReadMemory(addr, &deref_addr, ptr_size, m_error, true);
246-
m_value.GetScalar() = deref_addr;
240+
if (auto *scs = variable->GetSymbolContextScope()) {
241+
if (auto module_sp = scs->CalculateSymbolContextModule()) {
242+
lldb::addr_t file_addr =
243+
m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
244+
Address address(file_addr, module_sp->GetSectionList());
245+
Target &target = process_sp->GetTarget();
246+
size_t ptr_size = process_sp->GetAddressByteSize();
247+
lldb::addr_t deref_addr;
248+
lldb::addr_t load_addr = address.GetLoadAddress(&target);
249+
// FIXME: Add error handling!
250+
if (target.ReadMemory(load_addr, &deref_addr, ptr_size,
251+
m_error, process_is_alive))
252+
m_value.GetScalar() = deref_addr;
253+
}
247254
}
248255
}
249256
}

0 commit comments

Comments
 (0)