LLDB mainline
lldb_private::DWARFExpression Class Reference

"lldb/Expression/DWARFExpression.h" Encapsulates a DWARF location expression and interprets it. More...

#include <DWARFExpression.h>

Classes

class  Delegate

Public Types

using Stack = std::vector<Value>

Public Member Functions

 DWARFExpression ()
 DWARFExpression (const DataExtractor &data)
 Constructor.
 ~DWARFExpression ()
 Destructor.
bool IsValid () const
 Return true if the location expression contains data.
llvm::Expected< lldb::addr_tGetLocation_DW_OP_addr (const Delegate *dwarf_cu) const
 Return the address specified by the first DW_OP_{addr, addrx, GNU_addr_index} in the operation stream.
bool Update_DW_OP_addr (const Delegate *dwarf_cu, lldb::addr_t file_addr)
void UpdateValue (uint64_t const_value, lldb::offset_t const_value_byte_size, uint8_t addr_byte_size)
bool ContainsThreadLocalStorage (const Delegate *dwarf_cu) const
bool LinkThreadLocalStorage (const Delegate *dwarf_cu, std::function< lldb::addr_t(lldb::addr_t file_addr)> const &link_address_callback)
lldb::RegisterKind GetRegisterKind () const
 Return the call-frame-info style register kind.
void SetRegisterKind (lldb::RegisterKind reg_kind)
 Set the call-frame-info style register kind.
bool GetExpressionData (DataExtractor &data) const
void DumpLocation (Stream *s, lldb::DescriptionLevel level, ABI *abi, llvm::DIDumpOptions options={}) const
bool MatchesOperand (StackFrame &frame, const Instruction::Operand &op) const

Static Public Member Functions

static llvm::Expected< ValueEvaluate (ExecutionContext *exe_ctx, RegisterContext *reg_ctx, lldb::ModuleSP module_sp, const DataExtractor &opcodes, const Delegate *dwarf_cu, const lldb::RegisterKind reg_set, const Value *initial_value_ptr, const Value *object_address_ptr)
 Evaluate a DWARF location expression in a particular context.
static llvm::Error ReadRegisterValueAsScalar (RegisterContext *reg_ctx, lldb::RegisterKind reg_kind, uint32_t reg_num, Value &value)

Private Attributes

DataExtractor m_data
 A data extractor capable of reading opcode bytes.
lldb::RegisterKind m_reg_kind = lldb::eRegisterKindDWARF
 One of the defines that starts with LLDB_REGKIND_.

Detailed Description

"lldb/Expression/DWARFExpression.h" Encapsulates a DWARF location expression and interprets it.

DWARF location expressions are used in two ways by LLDB. The first use is to find entities specified in the debug information, since their locations are specified in precisely this language. The second is to interpret expressions without having to run the target in cases where the overhead from copying JIT-compiled code into the target is too high or where the target cannot be run. This class encapsulates a single DWARF location expression or a location list and interprets it.

Definition at line 36 of file DWARFExpression.h.

Member Typedef Documentation

◆ Stack

Definition at line 38 of file DWARFExpression.h.

Constructor & Destructor Documentation

◆ DWARFExpression() [1/2]

DWARFExpression::DWARFExpression ( )

Definition at line 48 of file DWARFExpression.cpp.

References m_data.

◆ DWARFExpression() [2/2]

DWARFExpression::DWARFExpression ( const DataExtractor & data)

Constructor.

Parameters
[in]dataA data extractor configured to read the DWARF location expression's bytecode.

Definition at line 50 of file DWARFExpression.cpp.

References m_data.

◆ ~DWARFExpression()

DWARFExpression::~DWARFExpression ( )
default

Destructor.

Member Function Documentation

◆ ContainsThreadLocalStorage()

bool DWARFExpression::ContainsThreadLocalStorage ( const Delegate * dwarf_cu) const

◆ DumpLocation()

void DWARFExpression::DumpLocation ( Stream * s,
lldb::DescriptionLevel level,
ABI * abi,
llvm::DIDumpOptions options = {} ) const

◆ Evaluate()

llvm::Expected< Value > DWARFExpression::Evaluate ( ExecutionContext * exe_ctx,
RegisterContext * reg_ctx,
lldb::ModuleSP module_sp,
const DataExtractor & opcodes,
const Delegate * dwarf_cu,
const lldb::RegisterKind reg_set,
const Value * initial_value_ptr,
const Value * object_address_ptr )
static

Evaluate a DWARF location expression in a particular context.

Parameters
[in]exe_ctxThe execution context in which to evaluate the location expression. The location expression may access the target's memory, especially if it comes from the expression parser.
[in]opcode_ctxThe module which defined the expression.
[in]opcodesThis is a static method so the opcodes need to be provided explicitly.
[in]reg_ctxAn optional parameter which provides a RegisterContext for use when evaluating the expression (i.e. for fetching register values). Normally this will come from the ExecutionContext's StackFrame but in the case where an expression needs to be evaluated while building the stack frame list, this short-cut is available.
[in]reg_setThe call-frame-info style register kind.
[in]initial_value_ptrA value to put on top of the interpreter stack before evaluating the expression, if the expression is parametrized. Can be NULL.
[in]resultA value into which the result of evaluating the expression is to be placed.
[in]error_ptrIf non-NULL, used to report errors in expression evaluation.
Returns
True on success; false otherwise. If error_ptr is non-NULL, details of the failure are provided through it.

Insertion point for evaluating multi-piece expression.

Definition at line 942 of file DWARFExpression.cpp.

References lldb_private::Value::AppendDataToHostBuffer(), lldb_private::Value::ClearContext(), lldb_private::Value::ConvertToLoadAddress(), DerefSizeExtractDataHelper(), DW_OP_value_to_name(), lldb_private::ArchSpec::eCore_wasm32, error(), Evaluate_DW_OP_deref(), Evaluate_DW_OP_entry_value(), lldb_private::Expressions, lldb_private::Scalar::ExtractBitfield(), lldb_private::Value::FileAddress, lldb_private::DataExtractor::GetAddress(), lldb_private::DataExtractor::GetAddressByteSize(), lldb_private::Target::GetArchitecture(), lldb_private::Value::GetBuffer(), lldb_private::ObjectFile::GetByteOrder(), lldb_private::Process::GetByteOrder(), lldb_private::WritableDataBuffer::GetBytes(), lldb_private::DataBufferHeap::GetByteSize(), lldb_private::DataExtractor::GetByteSize(), lldb_private::Scalar::GetByteSize(), lldb_private::ArchSpec::GetCore(), lldb_private::DataExtractor::GetData(), lldb_private::StreamString::GetData(), lldb_private::DWARFExpression::Delegate::GetDIEBitSizeAndSign(), lldb_private::StackFrame::GetFrameBaseValue(), lldb_private::ExecutionContext::GetFramePtr(), lldb_private::GetLog(), lldb_private::ExecutionContext::GetProcessPtr(), lldb_private::StackFrame::GetRegisterContext(), lldb_private::Value::GetScalar(), lldb_private::DataExtractor::GetSLEB128(), lldb_private::StackFrame::GetStackID(), lldb_private::ExecutionContext::GetTargetPtr(), lldb_private::ExecutionContext::GetThreadPtr(), lldb_private::DataExtractor::GetU16(), lldb_private::DataExtractor::GetU32(), lldb_private::DataExtractor::GetU64(), lldb_private::DataExtractor::GetU8(), lldb_private::DataExtractor::GetULEB128(), lldb_private::Value::GetValueType(), lldb_private::Log::GetVerbose(), lldb_private::Value::HostAddress, lldb_private::Value::Invalid, lldb_private::Address::IsSectionOffset(), lldb_private::Scalar::IsZero(), LLDB_INVALID_ADDRESS, LLDB_LOG, LLDB_LOGF, lldb_private::Value::LoadAddress, lldb_private::Scalar::MakeSigned(), lldb_private::Memory, lldb_private::DWARFExpression::Delegate::ParseVendorDWARFOpcode(), lldb_private::Stream::Printf(), lldb_private::DWARFExpression::Delegate::ReadAddressFromDebugAddrSection(), lldb_private::Process::ReadMemory(), lldb_private::Target::ReadMemory(), ReadRegisterValueAsScalar(), lldb_private::Value::ResizeData(), ResolveLoadAddress(), lldb_private::Value::ResolveValue(), lldb_private::Value::Scalar, lldb_private::Scalar::TruncOrExtendTo(), lldb_private::Scalar::ULongLong(), and lldb_private::DataExtractor::ValidOffset().

Referenced by lldb_private::DWARFExpressionList::Evaluate(), and ExtractDataMemberLocation().

◆ GetExpressionData()

bool lldb_private::DWARFExpression::GetExpressionData ( DataExtractor & data) const
inline

◆ GetLocation_DW_OP_addr()

llvm::Expected< lldb::addr_t > DWARFExpression::GetLocation_DW_OP_addr ( const Delegate * dwarf_cu) const

Return the address specified by the first DW_OP_{addr, addrx, GNU_addr_index} in the operation stream.

Parameters
[in]dwarf_cuThe dwarf unit this expression belongs to. Only required to resolve DW_OP{addrx, GNU_addr_index}.
Returns
The address specified by the operation, if the operation exists, or an llvm::Error otherwise.

Definition at line 405 of file DWARFExpression.cpp.

References DW_OP_value_to_name(), GetOpcodeDataSize(), LLDB_INVALID_ADDRESS, LLDB_INVALID_OFFSET, m_data, and lldb_private::DWARFExpression::Delegate::ReadAddressFromDebugAddrSection().

◆ GetRegisterKind()

RegisterKind DWARFExpression::GetRegisterKind ( ) const

Return the call-frame-info style register kind.

Definition at line 88 of file DWARFExpression.cpp.

References m_reg_kind.

Referenced by lldb_private::DWARFExpressionList::Evaluate().

◆ IsValid()

bool DWARFExpression::IsValid ( ) const

Return true if the location expression contains data.

Definition at line 55 of file DWARFExpression.cpp.

References m_data.

◆ LinkThreadLocalStorage()

bool DWARFExpression::LinkThreadLocalStorage ( const Delegate * dwarf_cu,
std::function< lldb::addr_t(lldb::addr_t file_addr)> const & link_address_callback )

◆ MatchesOperand()

◆ ReadRegisterValueAsScalar()

◆ SetRegisterKind()

void DWARFExpression::SetRegisterKind ( lldb::RegisterKind reg_kind)

◆ Update_DW_OP_addr()

◆ UpdateValue()

void DWARFExpression::UpdateValue ( uint64_t const_value,
lldb::offset_t const_value_byte_size,
uint8_t addr_byte_size )

Member Data Documentation

◆ m_data

DataExtractor lldb_private::DWARFExpression::m_data
private

◆ m_reg_kind

lldb::RegisterKind lldb_private::DWARFExpression::m_reg_kind = lldb::eRegisterKindDWARF
private

One of the defines that starts with LLDB_REGKIND_.

Definition at line 176 of file DWARFExpression.h.

Referenced by GetRegisterKind(), MatchesOperand(), and SetRegisterKind().


The documentation for this class was generated from the following files: