33#include "llvm/ADT/Twine.h"
43 bool artificial,
bool location_is_constant_data,
46 m_symfile_type_sp(symfile_type_sp), m_scope(scope),
47 m_owner_scope(context), m_scope_range(scope_range),
48 m_declaration(decl_ptr), m_location_list(location_list), m_external(external),
49 m_artificial(artificial), m_loc_is_const_data(location_is_constant_data),
50 m_static_member(static_member) {}
62 }
else if (
auto *comp_unit =
103 s->
Printf(
"%p: ",
static_cast<const void *
>(
this));
105 *s <<
"Variable" << (
const UserID &)*
this;
108 *s <<
", name = \"" <<
m_name <<
"\"";
113 s->
Format(
", type = {{{0:x-16}} {1} (", type->
GetID(), type);
145 bool show_fullpaths =
false;
170 bool dumped_declaration_info =
false;
176 bool show_inlined_frames =
false;
177 const bool show_function_arguments =
true;
178 const bool show_function_name =
true;
181 s,
nullptr,
Address(), show_fullpaths, show_module, show_inlined_frames,
182 show_function_arguments, show_function_name);
188 dumped_declaration_info =
true;
189 return dumped_declaration_info;
221 addr_t loclist_base_load_addr =
229 loclist_base_load_addr,
243 bool valid_in_scope_range =
246 if (!valid_in_scope_range)
258 addr_t loclist_base_file_addr =
276 return frame !=
nullptr;
289 Block *deepest_frame_block =
291 if (deepest_frame_block) {
297 if (variable_sc.
block ==
nullptr)
301 if (variable_sc.
block != deepest_frame_block &&
324 GetVariableCallback callback,
void *baton,
VariableList &variable_list,
327 if (!callback || variable_expr_path.empty()) {
328 error.SetErrorString(
"unknown error");
332 switch (variable_expr_path.front()) {
335 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
338 error.SetErrorString(
"unknown error");
341 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
345 if (tmp_error.
Fail()) {
356 variable_expr_path.drop_front(), scope, callback, baton, variable_list,
358 if (
error.Success()) {
359 for (uint32_t i = 0; i < valobj_list.
GetSize();) {
363 if (tmp_error.
Fail()) {
372 error.SetErrorString(
"unknown error");
379 llvm::StringRef(
"^([A-Za-z_:][A-Za-z_0-9:]*)(.*)"));
380 llvm::SmallVector<llvm::StringRef, 2> matches;
381 variable_list.
Clear();
382 if (!g_regex.
Execute(variable_expr_path, &matches)) {
383 error.SetErrorStringWithFormatv(
384 "unable to extract a variable name from '{0}'", variable_expr_path);
387 std::string variable_name = matches[1].str();
388 if (!callback(baton, variable_name.c_str(), variable_list)) {
389 error.SetErrorString(
"unknown error");
393 while (i < variable_list.
GetSize()) {
402 if (!variable_valobj_sp) {
407 llvm::StringRef variable_sub_expr_path =
408 variable_expr_path.drop_front(variable_name.size());
409 if (!variable_sub_expr_path.empty()) {
410 valobj_sp = variable_valobj_sp->GetValueForExpressionPath(
411 variable_sub_expr_path);
413 error.SetErrorStringWithFormatv(
414 "invalid expression path '{0}' for variable '{1}'",
415 variable_sub_expr_path, var_sp->GetName().GetCString());
421 valobj_sp = variable_valobj_sp;
424 valobj_list.
Append(valobj_sp);
428 if (variable_list.
GetSize() > 0) {
434 error.SetErrorString(
"unknown error");
450 addr_t loclist_base_file_addr =
455 loclist_base_file_addr, file_addr,
462 StackFrame *frame, llvm::StringRef partial_path,
468 StackFrame *frame,
const std::string &partial_member_name,
469 llvm::StringRef partial_path,
478 for (uint32_t i = 0; i < num_bases; ++i) {
490 if (num_vbases > 0) {
491 for (uint32_t i = 0; i < num_vbases; ++i) {
502 const uint32_t num_fields = compiler_type.
GetNumFields();
504 if (num_fields > 0) {
505 for (uint32_t i = 0; i < num_fields; ++i) {
506 std::string member_name;
509 i, member_name,
nullptr,
nullptr,
nullptr);
511 if (partial_member_name.empty() ||
512 llvm::StringRef(member_name).startswith(partial_member_name)) {
513 if (member_name == partial_member_name) {
516 prefix_path + member_name,
528 StackFrame *frame, llvm::StringRef partial_path,
534 std::string remaining_partial_path;
536 const lldb::TypeClass type_class = compiler_type.
GetTypeClass();
537 if (partial_path.empty()) {
539 switch (type_class) {
541 case eTypeClassArray:
542 case eTypeClassBlockPointer:
543 case eTypeClassBuiltin:
544 case eTypeClassComplexFloat:
545 case eTypeClassComplexInteger:
546 case eTypeClassEnumeration:
547 case eTypeClassFunction:
548 case eTypeClassMemberPointer:
549 case eTypeClassReference:
550 case eTypeClassTypedef:
551 case eTypeClassVector: {
555 case eTypeClassClass:
556 case eTypeClassStruct:
557 case eTypeClassUnion:
558 if (prefix_path.str().back() !=
'.')
562 case eTypeClassObjCObject:
563 case eTypeClassObjCInterface:
565 case eTypeClassObjCObjectPointer:
566 case eTypeClassPointer: {
567 bool omit_empty_base_classes =
true;
568 if (compiler_type.
GetNumChildren(omit_empty_base_classes,
nullptr) > 0)
577 const bool get_file_globals =
true;
583 for (
const VariableSP &var_sp : *variable_list)
589 const char ch = partial_path[0];
592 if (prefix_path.str().empty()) {
599 if (prefix_path.isTriviallyEmpty()) {
601 compiler_type, request);
606 if (partial_path.size() > 1 && partial_path[1] ==
'>' &&
607 !prefix_path.str().empty()) {
608 switch (type_class) {
609 case lldb::eTypeClassPointer: {
611 if (partial_path.size() > 2 && partial_path[2]) {
619 frame, std::string(), std::string(), prefix_path +
"->",
631 switch (type_class) {
632 case lldb::eTypeClassUnion:
633 case lldb::eTypeClassStruct:
634 case lldb::eTypeClassClass:
635 if (partial_path.size() > 1 && partial_path[1]) {
638 prefix_path +
".", compiler_type, request);
643 prefix_path +
".", compiler_type,
653 if (isalpha(ch) || ch ==
'_' || ch ==
'$') {
654 const size_t partial_path_len = partial_path.size();
656 while (pos < partial_path_len) {
657 const char curr_ch = partial_path[pos];
658 if (isalnum(curr_ch) || curr_ch ==
'_' || curr_ch ==
'$') {
665 std::string token(std::string(partial_path), 0, pos);
666 remaining_partial_path = std::string(partial_path.substr(pos));
670 prefix_path, compiler_type, request);
673 const bool get_file_globals =
true;
686 llvm::StringRef variable_name = var_sp->GetName().GetStringRef();
687 if (variable_name.startswith(token)) {
688 if (variable_name == token) {
689 Type *variable_type = var_sp->GetType();
694 frame, remaining_partial_path,
701 }
else if (remaining_partial_path.empty()) {
718 "", 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
uint32_t GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) 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...
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 seperated 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.
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.
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) const
Dump the stop context in this object to a Stream.
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.
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.