35#include "llvm/ADT/Twine.h"
45 bool artificial,
bool location_is_constant_data,
48 m_symfile_type_sp(symfile_type_sp), m_scope(scope),
49 m_owner_scope(context), m_scope_range(scope_range),
50 m_declaration(decl_ptr), m_location_list(location_list), m_external(external),
51 m_artificial(artificial), m_loc_is_const_data(location_is_constant_data),
52 m_static_member(static_member) {}
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 =
231 loclist_base_load_addr,
246 bool valid_in_scope_range =
249 if (!valid_in_scope_range)
261 addr_t loclist_base_file_addr =
279 return frame !=
nullptr;
292 Block *deepest_frame_block =
294 if (deepest_frame_block) {
300 if (variable_sc.
block ==
nullptr)
304 if (variable_sc.
block != deepest_frame_block &&
327 GetVariableCallback callback,
void *baton,
VariableList &variable_list,
330 if (!callback || variable_expr_path.empty()) {
331 error.SetErrorString(
"unknown error");
335 switch (variable_expr_path.front()) {
338 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
341 error.SetErrorString(
"unknown error");
344 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
348 if (tmp_error.
Fail()) {
359 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
361 if (
error.Success()) {
362 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
366 if (tmp_error.
Fail()) {
375 error.SetErrorString(
"unknown error");
382 llvm::StringRef(
"^([A-Za-z_:][A-Za-z_0-9:]*)(.*)"));
383 llvm::SmallVector<llvm::StringRef, 2> matches;
384 variable_list.
Clear();
385 if (!g_regex.
Execute(variable_expr_path, &matches)) {
386 error.SetErrorStringWithFormatv(
387 "unable to extract a variable name from '{0}'", variable_expr_path);
390 std::string variable_name = matches[1].str();
391 if (!callback(baton, variable_name.c_str(), variable_list)) {
392 error.SetErrorString(
"unknown error");
396 while (i < variable_list.
GetSize()) {
405 if (!variable_valobj_sp) {
410 llvm::StringRef variable_sub_expr_path =
411 variable_expr_path.drop_front(variable_name.size());
412 if (!variable_sub_expr_path.empty()) {
413 valobj_sp = variable_valobj_sp->GetValueForExpressionPath(
414 variable_sub_expr_path);
416 error.SetErrorStringWithFormatv(
417 "invalid expression path '{0}' for variable '{1}'",
418 variable_sub_expr_path, var_sp->GetName().GetCString());
424 valobj_sp = variable_valobj_sp;
427 valobj_list.
Append(valobj_sp);
431 if (variable_list.
GetSize() > 0) {
437 error.SetErrorString(
"unknown error");
453 addr_t loclist_base_file_addr =
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)
Address & GetBaseAddress()
Get accessor for the base address of the range.
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.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
bool IsAlwaysValidSingleExpr() const
void GetDescription(Stream *s, lldb::DescriptionLevel level, ABI *abi) const
Dump all locaitons with each separated by new line.
bool IsValid() const
Return true if the location expression contains data.
bool DumpLocations(Stream *s, lldb::DescriptionLevel level, lldb::addr_t func_load_addr, lldb::addr_t file_addr, ABI *abi) const
Dump locations that contains file_addr if it's valid.
bool ContainsAddress(lldb::addr_t func_load_addr, lldb::addr_t addr) const
Search for a load address in the dwarf location list.
A class that describes the declaration location of a lldb object.
void Dump(Stream *s, bool show_fullpaths) const
Dump a description of this object to a Stream.
bool DumpStopContext(Stream *s, bool show_fullpaths) const
"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 AddressRange & GetAddressRange()
bool NameMatches(ConstString name) const
Check if "name" matches either the mangled or demangled name.
lldb::LanguageType GuessLanguage() const
Try to guess the language from the mangling.
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
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 that are in scope at this StackFrame's pc.
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
bool Fail() const
Test for error condition.
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...
virtual void DumpSymbolContext(Stream *s)=0
Dump the object's symbol context to the stream s.
virtual Function * CalculateSymbolContextFunction()
virtual CompileUnit * CalculateSymbolContextCompileUnit()
virtual void CalculateSymbolContext(SymbolContext *sc)=0
Reconstruct the object's symbol context into sc.
virtual lldb::ModuleSP CalculateSymbolContextModule()
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
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)
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).
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)
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.
A mix in class that contains a generic user ID.
lldb::user_id_t GetID() const
Get accessor for the user ID.