|  | /* GDB variable objects API. | 
|  | Copyright (C) 1999-2025 Free Software Foundation, Inc. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef GDB_VAROBJ_H | 
|  | #define GDB_VAROBJ_H | 
|  |  | 
|  | #include "symtab.h" | 
|  | #include "gdbtypes.h" | 
|  | #include "value.h" | 
|  |  | 
|  | /* Enumeration for the format types */ | 
|  | enum varobj_display_formats | 
|  | { | 
|  | FORMAT_NATURAL,		/* What gdb actually calls 'natural' */ | 
|  | FORMAT_BINARY,		/* Binary display                    */ | 
|  | FORMAT_DECIMAL,		/* Decimal display                   */ | 
|  | FORMAT_HEXADECIMAL,		/* Hex display                       */ | 
|  | FORMAT_OCTAL,		/* Octal display                     */ | 
|  | FORMAT_ZHEXADECIMAL		/* Zero padded hexadecimal	     */ | 
|  | }; | 
|  |  | 
|  | enum varobj_type | 
|  | { | 
|  | USE_SPECIFIED_FRAME,        /* Use the frame passed to varobj_create.  */ | 
|  | USE_CURRENT_FRAME,          /* Use the current frame.  */ | 
|  | USE_SELECTED_FRAME          /* Always reevaluate in selected frame.  */ | 
|  | }; | 
|  |  | 
|  | /* Enumerator describing if a variable object is in scope.  */ | 
|  | enum varobj_scope_status | 
|  | { | 
|  | VAROBJ_IN_SCOPE = 0,        /* Varobj is scope, value available.  */ | 
|  | VAROBJ_NOT_IN_SCOPE = 1,    /* Varobj is not in scope, value not | 
|  | available, but varobj can become in | 
|  | scope later.  */ | 
|  | VAROBJ_INVALID = 2,         /* Varobj no longer has any value, and never | 
|  | will.  */ | 
|  | }; | 
|  |  | 
|  | /* String representations of gdb's format codes (defined in varobj.c).  */ | 
|  | extern const char *varobj_format_string[]; | 
|  |  | 
|  | /* Struct that describes a variable object instance.  */ | 
|  |  | 
|  | struct varobj; | 
|  |  | 
|  | struct varobj_update_result | 
|  | { | 
|  | varobj_update_result (struct varobj *varobj_, | 
|  | varobj_scope_status status_ = VAROBJ_IN_SCOPE) | 
|  | : varobj (varobj_), status (status_) | 
|  | {} | 
|  |  | 
|  | varobj_update_result (varobj_update_result &&other) = default; | 
|  |  | 
|  | DISABLE_COPY_AND_ASSIGN (varobj_update_result); | 
|  |  | 
|  | struct varobj *varobj; | 
|  | bool type_changed = false; | 
|  | bool children_changed = false; | 
|  | bool changed = false; | 
|  | enum varobj_scope_status status; | 
|  | /* This variable is used internally by varobj_update to indicate if the | 
|  | new value of varobj is already computed and installed, or has to | 
|  | be yet installed.  Don't use this outside varobj.c.  */ | 
|  | bool value_installed = false; | 
|  |  | 
|  | /* This will be non-NULL when new children were added to the varobj. | 
|  | It lists the new children (which must necessarily come at the end | 
|  | of the child list) added during an update.  The caller is | 
|  | responsible for freeing this vector.  */ | 
|  | std::vector<struct varobj *> newobj; | 
|  | }; | 
|  |  | 
|  | struct varobj_root; | 
|  | struct varobj_dynamic; | 
|  |  | 
|  | /* Every variable in the system has a structure of this type defined | 
|  | for it.  This structure holds all information necessary to manipulate | 
|  | a particular object variable.  */ | 
|  | struct varobj | 
|  | { | 
|  | explicit varobj (varobj_root *root_); | 
|  | ~varobj (); | 
|  |  | 
|  | /* Name of the variable for this object.  If this variable is a | 
|  | child, then this name will be the child's source name. | 
|  | (bar, not foo.bar).  */ | 
|  | /* NOTE: This is the "expression".  */ | 
|  | std::string name; | 
|  |  | 
|  | /* Expression for this child.  Can be used to create a root variable | 
|  | corresponding to this child.  */ | 
|  | std::string path_expr; | 
|  |  | 
|  | /* The name for this variable's object.  This is here for | 
|  | convenience when constructing this object's children.  */ | 
|  | std::string obj_name; | 
|  |  | 
|  | /* Index of this variable in its parent or -1.  */ | 
|  | int index = -1; | 
|  |  | 
|  | /* The type of this variable.  This can be NULL | 
|  | for artificial variable objects -- currently, the "accessibility" | 
|  | variable objects in C++.  */ | 
|  | struct type *type = NULL; | 
|  |  | 
|  | /* The value of this expression or subexpression.  A NULL value | 
|  | indicates there was an error getting this value. | 
|  | Invariant: if varobj_value_is_changeable_p (this) is non-zero, | 
|  | the value is either NULL, or not lazy.  */ | 
|  | value_ref_ptr value; | 
|  |  | 
|  | /* The number of (immediate) children this variable has.  */ | 
|  | int num_children = -1; | 
|  |  | 
|  | /* If this object is a child, this points to its immediate parent.  */ | 
|  | struct varobj *parent = NULL; | 
|  |  | 
|  | /* Children of this object.  */ | 
|  | std::vector<varobj *> children; | 
|  |  | 
|  | /* Description of the root variable.  Points to root variable for | 
|  | children.  */ | 
|  | struct varobj_root *root; | 
|  |  | 
|  | /* The format of the output for this object.  */ | 
|  | enum varobj_display_formats format = FORMAT_NATURAL; | 
|  |  | 
|  | /* Was this variable updated via a varobj_set_value operation.  */ | 
|  | bool updated = false; | 
|  |  | 
|  | /* Last print value.  */ | 
|  | std::string print_value; | 
|  |  | 
|  | /* Is this variable frozen.  Frozen variables are never implicitly | 
|  | updated by -var-update * | 
|  | or -var-update <direct-or-indirect-parent>.  */ | 
|  | bool frozen = false; | 
|  |  | 
|  | /* Is the value of this variable intentionally not fetched?  It is | 
|  | not fetched if either the variable is frozen, or any parents is | 
|  | frozen.  */ | 
|  | bool not_fetched = false; | 
|  |  | 
|  | /* Sub-range of children which the MI consumer has requested.  If | 
|  | FROM < 0 or TO < 0, means that all children have been | 
|  | requested.  */ | 
|  | int from = -1; | 
|  | int to = -1; | 
|  |  | 
|  | /* Dynamic part of varobj.  */ | 
|  | struct varobj_dynamic *dynamic; | 
|  | }; | 
|  |  | 
|  | /* Is the variable X one of our "fake" children?  */ | 
|  | #define CPLUS_FAKE_CHILD(x) \ | 
|  | ((x) != NULL && (x)->type == NULL && (x)->value == NULL) | 
|  |  | 
|  | /* The language specific vector */ | 
|  |  | 
|  | struct lang_varobj_ops | 
|  | { | 
|  | /* The number of children of PARENT.  */ | 
|  | int (*number_of_children) (const struct varobj *parent); | 
|  |  | 
|  | /* The name (expression) of a root varobj.  */ | 
|  | std::string (*name_of_variable) (const struct varobj *parent); | 
|  |  | 
|  | /* The name of the INDEX'th child of PARENT.  */ | 
|  | std::string (*name_of_child) (const struct varobj *parent, int index); | 
|  |  | 
|  | /* Returns the rooted expression of CHILD, which is a variable | 
|  | obtain that has some parent.  */ | 
|  | std::string (*path_expr_of_child) (const struct varobj *child); | 
|  |  | 
|  | /* The ``struct value *'' of the INDEX'th child of PARENT.  */ | 
|  | struct value *(*value_of_child) (const struct varobj *parent, int index); | 
|  |  | 
|  | /* The type of the INDEX'th child of PARENT.  */ | 
|  | struct type *(*type_of_child) (const struct varobj *parent, int index); | 
|  |  | 
|  | /* The current value of VAR.  */ | 
|  | std::string (*value_of_variable) (const struct varobj *var, | 
|  | enum varobj_display_formats format); | 
|  |  | 
|  | /* Return true if changes in value of VAR must be detected and | 
|  | reported by -var-update.  Return false if -var-update should never | 
|  | report changes of such values.  This makes sense for structures | 
|  | (since the changes in children values will be reported separately), | 
|  | or for artificial objects (like 'public' pseudo-field in C++). | 
|  |  | 
|  | Return value of false means that gdb need not call value_fetch_lazy | 
|  | for the value of this variable object.  */ | 
|  | bool (*value_is_changeable_p) (const struct varobj *var); | 
|  |  | 
|  | /* Return true if the type of VAR has mutated. | 
|  |  | 
|  | VAR's value is still the varobj's previous value, while NEW_VALUE | 
|  | is VAR's new value and NEW_TYPE is the var's new type.  NEW_VALUE | 
|  | may be NULL indicating that there is no value available (the varobj | 
|  | may be out of scope, of may be the child of a null pointer, for | 
|  | instance).  NEW_TYPE, on the other hand, must never be NULL. | 
|  |  | 
|  | This function should also be able to assume that var's number of | 
|  | children is set (not < 0). | 
|  |  | 
|  | Languages where types do not mutate can set this to NULL.  */ | 
|  | bool (*value_has_mutated) (const struct varobj *var, struct value *new_value, | 
|  | struct type *new_type); | 
|  |  | 
|  | /* Return true if VAR is a suitable path expression parent. | 
|  |  | 
|  | For C like languages with anonymous structures and unions an anonymous | 
|  | structure or union is not a suitable parent.  */ | 
|  | bool (*is_path_expr_parent) (const struct varobj *var); | 
|  | }; | 
|  |  | 
|  | extern const struct lang_varobj_ops c_varobj_ops; | 
|  | extern const struct lang_varobj_ops cplus_varobj_ops; | 
|  | extern const struct lang_varobj_ops ada_varobj_ops; | 
|  |  | 
|  | /* Non-zero if we want to see trace of varobj level stuff.  */ | 
|  |  | 
|  | extern unsigned int varobjdebug; | 
|  |  | 
|  | /* API functions */ | 
|  |  | 
|  | extern struct varobj *varobj_create (const char *objname, | 
|  | const char *expression, CORE_ADDR frame, | 
|  | enum varobj_type type); | 
|  |  | 
|  | extern std::string varobj_gen_name (void); | 
|  |  | 
|  | extern struct varobj *varobj_get_handle (const char *name); | 
|  |  | 
|  | extern const char *varobj_get_objname (const struct varobj *var); | 
|  |  | 
|  | extern std::string varobj_get_expression (const struct varobj *var); | 
|  |  | 
|  | /* Delete a varobj and all its children if only_children is false, otherwise | 
|  | delete only the children.  Return the number of deleted variables.  */ | 
|  |  | 
|  | extern int varobj_delete (struct varobj *var, bool only_children); | 
|  |  | 
|  | extern enum varobj_display_formats varobj_set_display_format ( | 
|  | struct varobj *var, | 
|  | enum varobj_display_formats format); | 
|  |  | 
|  | extern enum varobj_display_formats varobj_get_display_format ( | 
|  | const struct varobj *var); | 
|  |  | 
|  | extern int varobj_get_thread_id (const struct varobj *var); | 
|  |  | 
|  | extern void varobj_set_frozen (struct varobj *var, bool frozen); | 
|  |  | 
|  | extern bool varobj_get_frozen (const struct varobj *var); | 
|  |  | 
|  | extern void varobj_get_child_range (const struct varobj *var, int *from, | 
|  | int *to); | 
|  |  | 
|  | extern void varobj_set_child_range (struct varobj *var, int from, int to); | 
|  |  | 
|  | extern gdb::unique_xmalloc_ptr<char> | 
|  | varobj_get_display_hint (const struct varobj *var); | 
|  |  | 
|  | extern int varobj_get_num_children (struct varobj *var); | 
|  |  | 
|  | /* Return the list of children of VAR.  The returned vector should not | 
|  | be modified in any way.  FROM and TO are in/out parameters | 
|  | indicating the range of children to return.  If either *FROM or *TO | 
|  | is less than zero on entry, then all children will be returned.  On | 
|  | return, *FROM and *TO will be updated to indicate the real range | 
|  | that was returned.  The resulting vector will contain at least the | 
|  | children from *FROM to just before *TO; it might contain more | 
|  | children, depending on whether any more were available.  */ | 
|  | extern const std::vector<varobj *> & | 
|  | varobj_list_children (struct varobj *var, int *from, int *to); | 
|  |  | 
|  | extern std::string varobj_get_type (struct varobj *var); | 
|  |  | 
|  | extern struct type *varobj_get_gdb_type (const struct varobj *var); | 
|  |  | 
|  | extern const char *varobj_get_path_expr (const struct varobj *var); | 
|  |  | 
|  | extern const struct language_defn * | 
|  | varobj_get_language (const struct varobj *var); | 
|  |  | 
|  | extern int varobj_get_attributes (const struct varobj *var); | 
|  |  | 
|  | extern std::string | 
|  | varobj_get_formatted_value (struct varobj *var, | 
|  | enum varobj_display_formats format); | 
|  |  | 
|  | extern std::string varobj_get_value (struct varobj *var); | 
|  |  | 
|  | extern bool varobj_set_value (struct varobj *var, const char *expression); | 
|  |  | 
|  | extern void all_root_varobjs (gdb::function_view<void (struct varobj *var)>); | 
|  |  | 
|  | extern std::vector<varobj_update_result> | 
|  | varobj_update (struct varobj **varp, bool is_explicit); | 
|  |  | 
|  | /* Try to recreate any global or floating varobj.  This is called after | 
|  | changing symbol files.  */ | 
|  |  | 
|  | extern void varobj_re_set (void); | 
|  |  | 
|  | extern bool varobj_editable_p (const struct varobj *var); | 
|  |  | 
|  | extern bool varobj_floating_p (const struct varobj *var); | 
|  |  | 
|  | extern void varobj_set_visualizer (struct varobj *var, | 
|  | const char *visualizer); | 
|  |  | 
|  | extern void varobj_enable_pretty_printing (void); | 
|  |  | 
|  | extern bool varobj_has_more (const struct varobj *var, int to); | 
|  |  | 
|  | extern bool varobj_is_dynamic_p (const struct varobj *var); | 
|  |  | 
|  | extern bool varobj_default_value_is_changeable_p (const struct varobj *var); | 
|  | extern bool varobj_value_is_changeable_p (const struct varobj *var); | 
|  |  | 
|  | extern struct type *varobj_get_value_type (const struct varobj *var); | 
|  |  | 
|  | extern bool varobj_is_anonymous_child (const struct varobj *child); | 
|  |  | 
|  | extern const struct varobj * | 
|  | varobj_get_path_expr_parent (const struct varobj *var); | 
|  |  | 
|  | extern std::string | 
|  | varobj_value_get_print_value (struct value *value, | 
|  | enum varobj_display_formats format, | 
|  | const struct varobj *var); | 
|  |  | 
|  | extern void varobj_formatted_print_options (struct value_print_options *opts, | 
|  | enum varobj_display_formats format); | 
|  |  | 
|  | extern void varobj_restrict_range (const std::vector<varobj *> &children, | 
|  | int *from, int *to); | 
|  |  | 
|  | extern bool varobj_default_is_path_expr_parent (const struct varobj *var); | 
|  |  | 
|  | #endif /* GDB_VAROBJ_H */ |