[Lldb-commits] [lldb] [lldb-dap] Support inspecting memory (PR #104317)
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 14 23:18:45 PDT 2024
================
@@ -1085,6 +1085,19 @@ std::string VariableDescription::GetResult(llvm::StringRef context) {
return description.trim().str();
}
+lldb::addr_t GetMemoryReference(lldb::SBValue v) {
+ if (!v.GetType().IsPointerType() && !v.GetType().IsArrayType()) {
+ return LLDB_INVALID_ADDRESS;
+ }
+
+ lldb::SBValue deref = v.Dereference();
+ if (!deref.IsValid()) {
+ return LLDB_INVALID_ADDRESS;
+ }
+
+ return deref.GetLoadAddress();
----------------
clayborg wrote:
We can return the address of a SBValue by calling `v.GetLoadAddress();`. But as you know, if the value is a pointer, then we want to dereference it. We want to dereference reference values as well. This code should be:
```
std::optional<lldb::addr_t> GetMemoryReference(lldb::SBValue v) {
SBType v_type = v.GetType();
// Dereference and pointers or C++ references.
if (v_type.IsPointerType() || v_type.IsReferenceType())
v = v.Dereference();
lldb::addr_t load_addr = v.GetLoadAddress();
if (load_addr != LLDB_INVALID_ADDRESS)
return load_addr;
return std::nullopt;
}
```
Any value that lives in memory should return a valid load address. If a variable lives in a register, or is a constant, then `v.GetLoadAddress()` will return `LLDB_INVALID_ADDRESS`. Also, no need to check if `v.Dereference();` succeeded, because if it doesn't, then the `SBValue` will be invalid and also return `LLDB_INVALID_ADDRESS`
https://github.com/llvm/llvm-project/pull/104317
More information about the lldb-commits
mailing list