35#include "llvm/ADT/Twine.h"
45 bool artificial,
bool location_is_constant_data,
61 if (
auto *func =
m_owner_scope->CalculateSymbolContextFunction()) {
64 }
else if (
auto *comp_unit =
105 s->
Printf(
"%p: ",
static_cast<const void *
>(
this));
107 *s <<
"Variable" << (
const UserID &)*
this;
110 *s <<
", name = \"" <<
m_name <<
"\"";
115 s->
Format(
", type = {{{0:x-16}} {1} (", type->
GetID(), type);
147 bool show_fullpaths =
false;
172 bool dumped_declaration_info =
false;
178 bool show_inlined_frames =
false;
179 const bool show_function_arguments =
true;
180 const bool show_function_name =
true;
183 s,
nullptr,
Address(), show_fullpaths, show_module, show_inlined_frames,
184 show_function_arguments, show_function_name);
190 dumped_declaration_info =
true;
191 return dumped_declaration_info;
223 addr_t loclist_base_load_addr =
230 loclist_base_load_addr,
245 bool valid_in_scope_range =
248 if (!valid_in_scope_range)
260 addr_t loclist_base_file_addr =
278 return frame !=
nullptr;
291 Block *deepest_frame_block =
294 if (deepest_frame_block)
295 return IsInScope(*deepest_frame_block, frame_addr);
311 if (variable_sc.
block ==
nullptr)
331 if (!callback || variable_expr_path.empty()) {
336 switch (variable_expr_path.front()) {
339 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
345 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
349 if (tmp_error.
Fail()) {
360 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
362 if (
error.Success()) {
363 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
367 if (tmp_error.
Fail()) {
383 llvm::StringRef(
"^([A-Za-z_:][A-Za-z_0-9:]*)(.*)"));
384 llvm::SmallVector<llvm::StringRef, 2> matches;
385 variable_list.
Clear();
386 if (!g_regex.
Execute(variable_expr_path, &matches)) {
388 "unable to extract a variable name from '{0}'", variable_expr_path);
391 std::string variable_name = matches[1].str();
392 if (!callback(baton, variable_name.c_str(), variable_list)) {
397 while (i < variable_list.
GetSize()) {
406 if (!variable_valobj_sp) {
411 llvm::StringRef variable_sub_expr_path =
412 variable_expr_path.drop_front(variable_name.size());
413 if (!variable_sub_expr_path.empty()) {
414 valobj_sp = variable_valobj_sp->GetValueForExpressionPath(
415 variable_sub_expr_path);
418 "invalid expression path '{0}' for variable '{1}'",
419 variable_sub_expr_path, var_sp->GetName().GetCString());
425 valobj_sp = variable_valobj_sp;
428 valobj_list.
Append(valobj_sp);
432 if (variable_list.
GetSize() > 0) {
458 loclist_base_file_addr, file_addr,
465 StackFrame *frame, llvm::StringRef partial_path,
471 StackFrame *frame,
const std::string &partial_member_name,
472 llvm::StringRef partial_path,
481 for (uint32_t i = 0; i < num_bases; ++i) {
493 if (num_vbases > 0) {
494 for (uint32_t i = 0; i < num_vbases; ++i) {
505 const uint32_t num_fields = compiler_type.
GetNumFields();
507 if (num_fields > 0) {
508 for (uint32_t i = 0; i < num_fields; ++i) {
509 std::string member_name;
512 i, member_name,
nullptr,
nullptr,
nullptr);
514 if (partial_member_name.empty()) {
516 }
else if (llvm::StringRef(member_name)
517 .starts_with(partial_member_name)) {
518 if (member_name == partial_member_name) {
521 prefix_path + member_name,
524 }
else if (partial_path.empty()) {
533 StackFrame *frame, llvm::StringRef partial_path,
539 std::string remaining_partial_path;
541 const lldb::TypeClass type_class = compiler_type.
GetTypeClass();
542 if (partial_path.empty()) {
544 switch (type_class) {
546 case eTypeClassArray:
547 case eTypeClassBlockPointer:
548 case eTypeClassBuiltin:
549 case eTypeClassComplexFloat:
550 case eTypeClassComplexInteger:
551 case eTypeClassEnumeration:
552 case eTypeClassFunction:
553 case eTypeClassMemberPointer:
554 case eTypeClassReference:
555 case eTypeClassTypedef:
556 case eTypeClassVector: {
560 case eTypeClassClass:
561 case eTypeClassStruct:
562 case eTypeClassUnion:
563 if (prefix_path.str().back() !=
'.')
567 case eTypeClassObjCObject:
568 case eTypeClassObjCInterface:
570 case eTypeClassObjCObjectPointer:
571 case eTypeClassPointer: {
572 bool omit_empty_base_classes =
true;
573 if (llvm::expectedToStdOptional(
584 const bool get_file_globals =
true;
590 for (
const VariableSP &var_sp : *variable_list)
596 const char ch = partial_path[0];
599 if (prefix_path.str().empty()) {
606 if (prefix_path.isTriviallyEmpty()) {
608 compiler_type, request);
613 if (partial_path.size() > 1 && partial_path[1] ==
'>' &&
614 !prefix_path.str().empty()) {
615 switch (type_class) {
616 case lldb::eTypeClassPointer: {
618 if (partial_path.size() > 2 && partial_path[2]) {
626 frame, std::string(), std::string(), prefix_path +
"->",
638 switch (type_class) {
639 case lldb::eTypeClassUnion:
640 case lldb::eTypeClassStruct:
641 case lldb::eTypeClassClass:
642 if (partial_path.size() > 1 && partial_path[1]) {
645 prefix_path +
".", compiler_type, request);
650 prefix_path +
".", compiler_type,
660 if (isalpha(ch) || ch ==
'_' || ch ==
'$') {
661 const size_t partial_path_len = partial_path.size();
663 while (pos < partial_path_len) {
664 const char curr_ch = partial_path[pos];
665 if (isalnum(curr_ch) || curr_ch ==
'_' || curr_ch ==
'$') {
672 std::string token(std::string(partial_path), 0, pos);
673 remaining_partial_path = std::string(partial_path.substr(pos));
677 prefix_path, compiler_type, request);
680 const bool get_file_globals =
true;
693 llvm::StringRef variable_name = var_sp->GetName().GetStringRef();
694 if (variable_name.starts_with(token)) {
695 if (variable_name == token) {
696 Type *variable_type = var_sp->GetType();
701 frame, remaining_partial_path,
708 }
else if (remaining_partial_path.empty()) {
725 "", compiler_type, request);
static llvm::raw_ostream & error(Stream &strm)
static void PrivateAutoCompleteMembers(StackFrame *frame, const std::string &partial_member_name, llvm::StringRef partial_path, const llvm::Twine &prefix_path, const CompilerType &compiler_type, CompletionRequest &request)
static void PrivateAutoComplete(StackFrame *frame, llvm::StringRef partial_path, const llvm::Twine &prefix_path, const CompilerType &compiler_type, CompletionRequest &request)
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
lldb::ModuleSP GetModule() const
Get accessor for the module for this address.
lldb::addr_t GetFileAddress() const
Get the file address.
bool IsSectionOffset() const
Check if an address is section offset.
A class that describes a single lexical block.
bool Contains(lldb::addr_t range_offset) const
Check if an offset is in one of the block offset ranges.
Represents a generic declaration context in a program.
Represents a generic declaration such as a function declaration.
Generic representation of a type in a programming language.
CompilerType GetVirtualBaseClassAtIndex(size_t idx, uint32_t *bit_offset_ptr) const
CompilerType GetFieldAtIndex(size_t idx, std::string &name, uint64_t *bit_offset_ptr, uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr) const
lldb::TypeClass GetTypeClass() const
uint32_t GetNumVirtualBaseClasses() const
uint32_t GetNumFields() const
uint32_t GetNumDirectBaseClasses() const
CompilerType GetDirectBaseClassAtIndex(size_t idx, uint32_t *bit_offset_ptr) const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
llvm::Expected< uint32_t > GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) const
CompilerType GetCanonicalType() const
"lldb/Utility/ArgCompletionRequest.h"
void AddCompletion(llvm::StringRef completion, llvm::StringRef description="", CompletionMode mode=CompletionMode::Normal)
Adds a possible completion string.
llvm::StringRef GetCursorArgumentPrefix() const
A uniqued constant string class.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
A class that describes the declaration location of a lldb object.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
A class that describes a function.
const Address & GetAddress() const
Return the address of the function (its entry point).
const Entry * FindEntryThatContains(B addr) const
bool Execute(llvm::StringRef string, llvm::SmallVectorImpl< llvm::StringRef > *matches=nullptr) const
Execute a regular expression match using the compiled regular expression that is already in this obje...
This base class provides an interface to stack frames.
VariableList * GetVariableList(bool get_file_globals, Status *error_ptr)
Retrieve the list of variables whose scope either:
Address GetFrameCodeAddressForSymbolication()
Get the current code Address suitable for symbolication, may not be the same as GetFrameCodeAddress()...
const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
const Address & GetFrameCodeAddress()
Get an Address for the current pc value in this StackFrame.
lldb::TargetSP CalculateTarget() override
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
A stream class that can stream formatted output to a file.
void Format(const char *format, Args &&... args)
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t EOL()
Output and End of Line character to the stream.
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
bool DumpStopContext(Stream *s, ExecutionContextScope *exe_scope, const Address &so_addr, bool show_fullpaths, bool show_module, bool show_inlined_frames, bool show_function_arguments, bool show_function_name, bool show_function_display_name=false, std::optional< Stream::HighlightSettings > settings=std::nullopt) const
Dump the stop context in this object to a Stream.
void Clear(bool clear_target)
Clear the object's state.
Variable * variable
The global variable matching the given query.
LineEntry line_entry
The LineEntry for a given query.
virtual CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid)
virtual CompilerDecl GetDeclForUID(lldb::user_id_t uid)
CompilerType GetForwardCompilerType()
SymbolFile * GetSymbolFile()
void DumpTypeName(Stream *s)
A collection of ValueObject values that.
void SetValueObjectAtIndex(size_t idx, const lldb::ValueObjectSP &valobj_sp)
void Append(const lldb::ValueObjectSP &val_obj_sp)
lldb::ValueObjectSP GetValueObjectAtIndex(size_t idx)
lldb::ValueObjectSP RemoveValueObjectAtIndex(size_t idx)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
lldb::VariableSP GetVariableAtIndex(size_t idx) const
lldb::VariableSP RemoveVariableAtIndex(size_t idx)
bool DumpDeclaration(Stream *s, bool show_fullpaths, bool show_module)
const RangeList & GetScopeRange() const
unsigned m_static_member
Non-zero if variable is static member of a class or struct.
bool IsInScope(StackFrame *frame)
static void AutoComplete(const ExecutionContext &exe_ctx, CompletionRequest &request)
CompilerDeclContext GetDeclContext()
unsigned m_artificial
Non-zero if the variable is not explicitly declared in source.
unsigned m_external
Visible outside the containing compile unit?
bool LocationIsValidForAddress(const Address &address)
unsigned m_loc_is_const_data
The m_location expression contains the constant variable value data, not a DWARF location.
lldb::SymbolFileTypeSP m_symfile_type_sp
The type pointer of the variable (int, struct, class, etc) global, parameter, local.
RangeList m_scope_range
The list of ranges inside the owner's scope where this variable is valid.
ConstString GetUnqualifiedName() const
static Status GetValuesForVariableExpressionPath(llvm::StringRef variable_expr_path, ExecutionContextScope *scope, GetVariableCallback callback, void *baton, VariableList &variable_list, ValueObjectList &valobj_list)
Mangled m_mangled
The mangled name of the variable.
bool NameMatches(ConstString name) const
Since a variable can have a basename "i" and also a mangled named "_ZN12_GLOBAL__N_11iE" and a demang...
void Dump(Stream *s, bool show_context) const
SymbolContextScope * m_owner_scope
The symbol file scope that this variable was defined in.
ConstString GetName() const
ConstString m_name
The basename of the variable (no namespaces).
RangeVector< lldb::addr_t, lldb::addr_t > RangeList
Declaration m_declaration
Declaration location for this item.
void CalculateSymbolContext(SymbolContext *sc)
Variable(lldb::user_id_t uid, const char *name, const char *mangled, const lldb::SymbolFileTypeSP &symfile_type_sp, lldb::ValueType scope, SymbolContextScope *owner_scope, const RangeList &scope_range, Declaration *decl, const DWARFExpressionList &location, bool external, bool artificial, bool location_is_constant_data, bool static_member=false)
Constructors and Destructors.
bool DumpLocations(Stream *s, const Address &address)
lldb::LanguageType GetLanguage() const
size_t MemorySize() const
bool LocationIsValidForFrame(StackFrame *frame)
size_t(* GetVariableCallback)(void *baton, const char *name, VariableList &var_list)
DWARFExpressionList m_location_list
The location of this variable that can be fed to DWARFExpression::Evaluate().
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::SymbolFileType > SymbolFileTypeSP
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
@ eValueTypeVariableGlobal
globals variable
@ eValueTypeConstResult
constant result variables
@ eValueTypeVariableLocal
function local variables
@ eValueTypeVariableArgument
function argument variables
@ eValueTypeRegister
stack frame register value
@ eValueTypeVariableStatic
static variable
@ eValueTypeRegisterSet
A collection of stack frame register values.
@ eValueTypeVariableThreadLocal
thread local storage variable
void Clear()
Clear the object's state.
UserID(lldb::user_id_t uid=LLDB_INVALID_UID)
Construct with optional user ID.
lldb::user_id_t GetID() const
Get accessor for the user ID.