LLDB mainline
Public Member Functions | Static Public Member Functions | Private Attributes | List of all members
lldb_private::DWARFExpression Class Reference

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

#include <DWARFExpression.h>

Public Member Functions

 DWARFExpression ()
 
 DWARFExpression (const DataExtractor &data)
 Constructor.
 
 ~DWARFExpression ()
 Destructor.
 
bool IsValid () const
 Return true if the location expression contains data.
 
lldb::addr_t GetLocation_DW_OP_addr (const plugin::dwarf::DWARFUnit *dwarf_cu, bool &error) 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 plugin::dwarf::DWARFUnit *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 plugin::dwarf::DWARFUnit *dwarf_cu) const
 
bool LinkThreadLocalStorage (const plugin::dwarf::DWARFUnit *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) const
 
bool MatchesOperand (StackFrame &frame, const Instruction::Operand &op) const
 

Static Public Member Functions

static bool Evaluate (ExecutionContext *exe_ctx, RegisterContext *reg_ctx, lldb::ModuleSP module_sp, const DataExtractor &opcodes, const plugin::dwarf::DWARFUnit *dwarf_cu, const lldb::RegisterKind reg_set, const Value *initial_value_ptr, const Value *object_address_ptr, Value &result, Status *error_ptr)
 Evaluate a DWARF location expression in a particular context.
 
static bool ParseDWARFLocationList (const plugin::dwarf::DWARFUnit *dwarf_cu, const DataExtractor &data, DWARFExpressionList *loc_list)
 

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 40 of file DWARFExpression.h.

Constructor & Destructor Documentation

◆ DWARFExpression() [1/2]

DWARFExpression::DWARFExpression ( )

Definition at line 51 of file DWARFExpression.cpp.

Referenced by ParseDWARFLocationList().

◆ 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 53 of file DWARFExpression.cpp.

◆ ~DWARFExpression()

DWARFExpression::~DWARFExpression ( )
default

Destructor.

Member Function Documentation

◆ ContainsThreadLocalStorage()

bool DWARFExpression::ContainsThreadLocalStorage ( const plugin::dwarf::DWARFUnit dwarf_cu) const

◆ DumpLocation()

void DWARFExpression::DumpLocation ( Stream s,
lldb::DescriptionLevel  level,
ABI abi 
) const

◆ Evaluate()

bool DWARFExpression::Evaluate ( ExecutionContext exe_ctx,
RegisterContext reg_ctx,
lldb::ModuleSP  module_sp,
const DataExtractor opcodes,
const plugin::dwarf::DWARFUnit dwarf_cu,
const lldb::RegisterKind  reg_set,
const Value initial_value_ptr,
const Value object_address_ptr,
Value result,
Status error_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 865 of file DWARFExpression.cpp.

References lldb_private::Value::AppendDataToHostBuffer(), lldb_private::Value::ClearContext(), DerefSizeExtractDataHelper(), lldb_private::plugin::dwarf::DW_OP_value_to_name(), lldb_private::ArchSpec::eCore_wasm32, error(), Evaluate_DW_OP_entry_value(), lldb_private::Expressions, lldb_private::Scalar::ExtractBitfield(), lldb_private::Value::FileAddress, lldb_private::Process::GetABI(), lldb_private::DataExtractor::GetAddress(), lldb_private::DataExtractor::GetAddressByteSize(), lldb_private::Target::GetArchitecture(), lldb_private::plugin::dwarf::DWARFBaseDIE::GetAttributeValueAsUnsigned(), lldb_private::Value::GetBuffer(), lldb_private::Process::GetByteOrder(), lldb_private::ObjectFile::GetByteOrder(), lldb_private::WritableDataBuffer::GetBytes(), lldb_private::DataExtractor::GetByteSize(), lldb_private::Scalar::GetByteSize(), lldb_private::DataBufferHeap::GetByteSize(), lldb_private::StackID::GetCallFrameAddress(), lldb_private::ArchSpec::GetCore(), lldb_private::StreamString::GetData(), lldb_private::DataExtractor::GetData(), lldb_private::StackFrame::GetFrameBaseValue(), lldb_private::ExecutionContext::GetFramePtr(), lldb_private::GetLog(), lldb_private::plugin::dwarf::DWARFUnit::GetOffset(), lldb_private::ExecutionContext::GetProcessPtr(), lldb_private::StackFrame::GetRegisterContext(), lldb_private::Value::GetScalar(), lldb_private::DataExtractor::GetSLEB128(), lldb_private::StackFrame::GetStackID(), lldb_private::plugin::dwarf::DWARFUnit::GetSymbolFileDWARF(), lldb_private::ExecutionContext::GetTargetPtr(), lldb_private::Thread::GetThreadLocalData(), 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_ERRORF, LLDB_INVALID_ADDRESS, LLDB_LOG, LLDB_LOGF, lldb_private::Value::LoadAddress, lldb_private::Scalar::MakeSigned(), lldb_private::Memory, lldb_private::plugin::dwarf::SymbolFileDWARF::ParseVendorDWARFOpcode(), lldb_private::Stream::Printf(), lldb_private::plugin::dwarf::DWARFUnit::ReadAddressFromDebugAddrSection(), lldb_private::Target::ReadMemory(), lldb_private::Process::ReadMemory(), lldb_private::Process::ReadPointerFromMemory(), ReadRegisterValueAsScalar(), lldb_private::Value::ResizeData(), ResolveLoadAddress(), lldb_private::Value::ResolveValue(), lldb_private::Value::Scalar, lldb_private::Status::SetErrorString(), lldb_private::Status::SetErrorStringWithFormat(), lldb_private::Status::SetErrorStringWithFormatv(), lldb_private::Scalar::TruncOrExtendTo(), lldb_private::Scalar::UInt128(), 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()

lldb::addr_t DWARFExpression::GetLocation_DW_OP_addr ( const plugin::dwarf::DWARFUnit dwarf_cu,
bool &  error 
) 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}.
[out]errorIf the location stream contains unknown DW_OP opcodes or the data is missing, error will be set to true.
Returns
The address specified by the operation, if the operation exists, or LLDB_INVALID_ADDRESS otherwise.

Definition at line 358 of file DWARFExpression.cpp.

References error(), lldb_private::DataExtractor::GetAddress(), GetOpcodeDataSize(), lldb_private::DataExtractor::GetU8(), lldb_private::DataExtractor::GetULEB128(), LLDB_INVALID_ADDRESS, LLDB_INVALID_OFFSET, m_data, lldb_private::plugin::dwarf::DWARFUnit::ReadAddressFromDebugAddrSection(), and lldb_private::DataExtractor::ValidOffset().

Referenced by lldb_private::plugin::dwarf::SymbolFileDWARF::ParseVariableDIE().

◆ GetRegisterKind()

RegisterKind DWARFExpression::GetRegisterKind ( ) const

Return the call-frame-info style register kind.

Definition at line 91 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 58 of file DWARFExpression.cpp.

References lldb_private::DataExtractor::GetByteSize(), and m_data.

◆ LinkThreadLocalStorage()

bool DWARFExpression::LinkThreadLocalStorage ( const plugin::dwarf::DWARFUnit dwarf_cu,
std::function< lldb::addr_t(lldb::addr_t file_addr)> const &  link_address_callback 
)

◆ MatchesOperand()

bool DWARFExpression::MatchesOperand ( StackFrame frame,
const Instruction::Operand op 
) const

◆ ParseDWARFLocationList()

bool DWARFExpression::ParseDWARFLocationList ( const plugin::dwarf::DWARFUnit dwarf_cu,
const DataExtractor data,
DWARFExpressionList loc_list 
)
static

◆ SetRegisterKind()

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

◆ Update_DW_OP_addr()

bool DWARFExpression::Update_DW_OP_addr ( const plugin::dwarf::DWARFUnit dwarf_cu,
lldb::addr_t  file_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 161 of file DWARFExpression.h.

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


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