Skip to content

Commit 8ed8c54

Browse files
[lldb] Add DWARFExpressionEntry and GetExpressionEntryAtAddress() to DWARFExpressionList
This introduces a new API for retrieving DWARF expression metadata associated with variable location entries at a given PC address. It provides the base, end, and expression pointer for downstream consumers such as disassembler annotations. Intended for use in richer instruction annotations in Instruction::Dump().
1 parent 90daed3 commit 8ed8c54

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

lldb/include/lldb/Expression/DWARFExpressionList.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ class DWARFExpressionList {
5959

6060
lldb::addr_t GetFuncFileAddress() { return m_func_file_addr; }
6161

62+
/// Represents an entry in the DWARFExpressionList with all needed metadata
63+
struct DWARFExpressionEntry {
64+
lldb::addr_t base;
65+
lldb::addr_t end;
66+
const DWARFExpression *expr;
67+
};
68+
69+
/// Returns the entry (base, end, data) for a given PC address
70+
llvm::Expected<DWARFExpressionEntry>
71+
GetExpressionEntryAtAddress(lldb::addr_t func_load_addr,
72+
lldb::addr_t load_addr) const;
73+
6274
const DWARFExpression *GetExpressionAtAddress(lldb::addr_t func_load_addr,
6375
lldb::addr_t load_addr) const;
6476

lldb/source/Expression/DWARFExpressionList.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,27 @@ bool DWARFExpressionList::ContainsAddress(lldb::addr_t func_load_addr,
5353
return GetExpressionAtAddress(func_load_addr, addr) != nullptr;
5454
}
5555

56+
llvm::Expected<DWARFExpressionList::DWARFExpressionEntry>
57+
DWARFExpressionList::GetExpressionEntryAtAddress(lldb::addr_t func_load_addr,
58+
lldb::addr_t load_addr) const {
59+
if (const DWARFExpression *expr = GetAlwaysValidExpr()) {
60+
return DWARFExpressionEntry{0, LLDB_INVALID_ADDRESS, expr};
61+
}
62+
63+
if (func_load_addr == LLDB_INVALID_ADDRESS)
64+
func_load_addr = m_func_file_addr;
65+
66+
addr_t addr = load_addr - func_load_addr + m_func_file_addr;
67+
uint32_t index = m_exprs.FindEntryIndexThatContains(addr);
68+
if (index == UINT32_MAX) {
69+
return llvm::createStringError(llvm::inconvertibleErrorCode(),
70+
"No DWARF expression found for address 0x%llx", addr);
71+
}
72+
73+
const Entry &entry = *m_exprs.GetEntryAtIndex(index);
74+
return DWARFExpressionEntry{entry.base, entry.GetRangeEnd(), &entry.data};
75+
}
76+
5677
const DWARFExpression *
5778
DWARFExpressionList::GetExpressionAtAddress(lldb::addr_t func_load_addr,
5879
lldb::addr_t load_addr) const {

0 commit comments

Comments
 (0)