]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/value.h
Turn allocate_computed_value into static "constructor"
[thirdparty/binutils-gdb.git] / gdb / value.h
index 7249cdcb5c0b91608e2ae04968c58782eb8e094b..dbbb61932b8fbd4acd866826b79eec99984f827c 100644 (file)
@@ -144,6 +144,9 @@ typedef gdb::ref_ptr<struct value, value_ref_policy> value_ref_ptr;
 
 struct value
 {
+private:
+
+  /* Values can only be created via "static constructors".  */
   explicit value (struct type *type_)
     : m_modifiable (1),
       m_lazy (1),
@@ -156,6 +159,22 @@ struct value
   {
   }
 
+public:
+
+  /* Allocate a lazy value for type TYPE.  Its actual content is
+     "lazily" allocated too: the content field of the return value is
+     NULL; it will be allocated when it is fetched from the target.  */
+  static struct value *allocate_lazy (struct type *type);
+
+  /* Allocate a value and its contents for type TYPE.  */
+  static struct value *allocate (struct type *type);
+
+  /* Create a computed lvalue, with type TYPE, function pointers
+     FUNCS, and closure CLOSURE.  */
+  static struct value *allocate_computed (struct type *type,
+                                         const struct lval_funcs *funcs,
+                                         void *closure);
+
   ~value ();
 
   DISABLE_COPY_AND_ASSIGN (value);
@@ -189,6 +208,162 @@ struct value
   void set_bitpos (LONGEST bit)
   { m_bitpos = bit; }
 
+  /* Only used for bitfields; the containing value.  This allows a
+     single read from the target when displaying multiple
+     bitfields.  */
+  value *parent () const
+  { return m_parent.get (); }
+
+  void set_parent (struct value *parent)
+  {  m_parent = value_ref_ptr::new_reference (parent); }
+
+  /* Describes offset of a value within lval of a structure in bytes.
+     If lval == lval_memory, this is an offset to the address.  If
+     lval == lval_register, this is a further offset from
+     location.address within the registers structure.  Note also the
+     member embedded_offset below.  */
+  LONGEST offset () const
+  { return m_offset; }
+
+  void set_offset (LONGEST offset)
+  { m_offset = offset; }
+
+  /* The comment from "struct value" reads: ``Is it modifiable?  Only
+     relevant if lval != not_lval.''.  Shouldn't the value instead be
+     not_lval and be done with it?  */
+  int deprecated_modifiable () const
+  { return m_modifiable; }
+
+  LONGEST pointed_to_offset () const
+  { return m_pointed_to_offset; }
+
+  void set_pointed_to_offset (LONGEST val)
+  { m_pointed_to_offset = val; }
+
+  LONGEST embedded_offset () const
+  { return m_embedded_offset; }
+
+  void set_embedded_offset (LONGEST val)
+  { m_embedded_offset = val; }
+
+  /* If zero, contents of this value are in the contents field.  If
+     nonzero, contents are in inferior.  If the lval field is lval_memory,
+     the contents are in inferior memory at location.address plus offset.
+     The lval field may also be lval_register.
+
+     WARNING: This field is used by the code which handles watchpoints
+     (see breakpoint.c) to decide whether a particular value can be
+     watched by hardware watchpoints.  If the lazy flag is set for some
+     member of a value chain, it is assumed that this member of the
+     chain doesn't need to be watched as part of watching the value
+     itself.  This is how GDB avoids watching the entire struct or array
+     when the user wants to watch a single struct member or array
+     element.  If you ever change the way lazy flag is set and reset, be
+     sure to consider this use as well!  */
+
+  int lazy () const
+  { return m_lazy; }
+
+  void set_lazy (int val)
+  { m_lazy = val; }
+
+
+  /* If a value represents a C++ object, then the `type' field gives the
+     object's compile-time type.  If the object actually belongs to some
+     class derived from `type', perhaps with other base classes and
+     additional members, then `type' is just a subobject of the real
+     thing, and the full object is probably larger than `type' would
+     suggest.
+
+     If `type' is a dynamic class (i.e. one with a vtable), then GDB can
+     actually determine the object's run-time type by looking at the
+     run-time type information in the vtable.  When this information is
+     available, we may elect to read in the entire object, for several
+     reasons:
+
+     - When printing the value, the user would probably rather see the
+     full object, not just the limited portion apparent from the
+     compile-time type.
+
+     - If `type' has virtual base classes, then even printing `type'
+     alone may require reaching outside the `type' portion of the
+     object to wherever the virtual base class has been stored.
+
+     When we store the entire object, `enclosing_type' is the run-time
+     type -- the complete object -- and `embedded_offset' is the offset
+     of `type' within that larger type, in bytes.  The value_contents()
+     macro takes `embedded_offset' into account, so most GDB code
+     continues to see the `type' portion of the value, just as the
+     inferior would.
+
+     If `type' is a pointer to an object, then `enclosing_type' is a
+     pointer to the object's run-time type, and `pointed_to_offset' is
+     the offset in bytes from the full object to the pointed-to object
+     -- that is, the value `embedded_offset' would have if we followed
+     the pointer and fetched the complete object.  (I don't really see
+     the point.  Why not just determine the run-time type when you
+     indirect, and avoid the special case?  The contents don't matter
+     until you indirect anyway.)
+
+     If we're not doing anything fancy, `enclosing_type' is equal to
+     `type', and `embedded_offset' is zero, so everything works
+     normally.  */
+
+  struct type *enclosing_type  () const
+  { return m_enclosing_type; }
+
+  void set_enclosing_type (struct type *new_type);
+
+  int stack () const
+  { return m_stack; }
+
+  void set_stack (int val)
+  { m_stack = val; }
+
+  /* If this value is lval_computed, return its lval_funcs
+     structure.  */
+  const struct lval_funcs *computed_funcs () const;
+
+  /* If this value is lval_computed, return its closure.  The meaning
+     of the returned value depends on the functions this value
+     uses.  */
+  void *computed_closure () const;
+
+  enum lval_type *deprecated_lval_hack ()
+  { return &m_lval; }
+
+  enum lval_type lval () const
+  { return m_lval; }
+
+  /* Set or return field indicating whether a variable is initialized or
+     not, based on debugging information supplied by the compiler.
+     1 = initialized; 0 = uninitialized.  */
+  int initialized () const
+  { return m_initialized; }
+
+  void set_initialized (int value)
+  { m_initialized = value; }
+
+  /* If lval == lval_memory, return the address in the inferior.  If
+     lval == lval_register, return the byte offset into the registers
+     structure.  Otherwise, return 0.  The returned address
+     includes the offset, if any.  */
+  CORE_ADDR address () const;
+
+  /* Like address, except the result does not include value's
+     offset.  */
+  CORE_ADDR raw_address () const;
+
+  /* Set the address of a value.  */
+  void set_address (CORE_ADDR);
+
+  struct internalvar **deprecated_internalvar_hack ()
+  { return &m_location.internalvar; }
+
+  struct frame_id *deprecated_next_frame_id_hack ();
+
+  int *deprecated_regnum_hack ();
+
 
   /* Type of value; either not an lval, or one of the various
      different possible kinds of lval.  */
@@ -365,74 +540,13 @@ struct value
      limited_length will be set to indicate the length in octets that were
      loaded from the inferior.  */
   ULONGEST m_limited_length = 0;
-};
-
-/* Only used for bitfields; the containing value.  This allows a
-   single read from the target when displaying multiple
-   bitfields.  */
-
-struct value *value_parent (const struct value *);
-extern void set_value_parent (struct value *value, struct value *parent);
-
-/* Describes offset of a value within lval of a structure in bytes.
-   If lval == lval_memory, this is an offset to the address.  If lval
-   == lval_register, this is a further offset from location.address
-   within the registers structure.  Note also the member
-   embedded_offset below.  */
-
-extern LONGEST value_offset (const struct value *);
-extern void set_value_offset (struct value *, LONGEST offset);
 
-/* The comment from "struct value" reads: ``Is it modifiable?  Only
-   relevant if lval != not_lval.''.  Shouldn't the value instead be
-   not_lval and be done with it?  */
-
-extern int deprecated_value_modifiable (const struct value *value);
-
-/* If a value represents a C++ object, then the `type' field gives the
-   object's compile-time type.  If the object actually belongs to some
-   class derived from `type', perhaps with other base classes and
-   additional members, then `type' is just a subobject of the real
-   thing, and the full object is probably larger than `type' would
-   suggest.
-
-   If `type' is a dynamic class (i.e. one with a vtable), then GDB can
-   actually determine the object's run-time type by looking at the
-   run-time type information in the vtable.  When this information is
-   available, we may elect to read in the entire object, for several
-   reasons:
-
-   - When printing the value, the user would probably rather see the
-     full object, not just the limited portion apparent from the
-     compile-time type.
-
-   - If `type' has virtual base classes, then even printing `type'
-     alone may require reaching outside the `type' portion of the
-     object to wherever the virtual base class has been stored.
+private:
 
-   When we store the entire object, `enclosing_type' is the run-time
-   type -- the complete object -- and `embedded_offset' is the offset
-   of `type' within that larger type, in bytes.  The value_contents()
-   macro takes `embedded_offset' into account, so most GDB code
-   continues to see the `type' portion of the value, just as the
-   inferior would.
-
-   If `type' is a pointer to an object, then `enclosing_type' is a
-   pointer to the object's run-time type, and `pointed_to_offset' is
-   the offset in bytes from the full object to the pointed-to object
-   -- that is, the value `embedded_offset' would have if we followed
-   the pointer and fetched the complete object.  (I don't really see
-   the point.  Why not just determine the run-time type when you
-   indirect, and avoid the special case?  The contents don't matter
-   until you indirect anyway.)
-
-   If we're not doing anything fancy, `enclosing_type' is equal to
-   `type', and `embedded_offset' is zero, so everything works
-   normally.  */
-
-extern struct type *value_enclosing_type (const struct value *);
-extern void set_value_enclosing_type (struct value *val,
-                                     struct type *new_type);
+  /* Allocate a value and its contents for type TYPE.  If CHECK_SIZE
+     is true, then apply the usual max-value-size checks.  */
+  static struct value *allocate (struct type *type, bool check_size);
+};
 
 /* Returns value_type or value_enclosing_type depending on
    value_print_options.objectprint.
@@ -450,11 +564,6 @@ extern struct type *value_actual_type (struct value *value,
                                       int resolve_simple_types,
                                       int *real_type_found);
 
-extern LONGEST value_pointed_to_offset (const struct value *value);
-extern void set_value_pointed_to_offset (struct value *value, LONGEST val);
-extern LONGEST value_embedded_offset (const struct value *value);
-extern void set_value_embedded_offset (struct value *value, LONGEST val);
-
 /* For lval_computed values, this structure holds functions used to
    retrieve and set the value (or portions of the value).
 
@@ -516,45 +625,8 @@ struct lval_funcs
   void (*free_closure) (struct value *v);
 };
 
-/* Create a computed lvalue, with type TYPE, function pointers FUNCS,
-   and closure CLOSURE.  */
-
-extern struct value *allocate_computed_value (struct type *type,
-                                             const struct lval_funcs *funcs,
-                                             void *closure);
-
 extern struct value *allocate_optimized_out_value (struct type *type);
 
-/* If VALUE is lval_computed, return its lval_funcs structure.  */
-
-extern const struct lval_funcs *value_computed_funcs (const struct value *);
-
-/* If VALUE is lval_computed, return its closure.  The meaning of the
-   returned value depends on the functions VALUE uses.  */
-
-extern void *value_computed_closure (const struct value *value);
-
-/* If zero, contents of this value are in the contents field.  If
-   nonzero, contents are in inferior.  If the lval field is lval_memory,
-   the contents are in inferior memory at location.address plus offset.
-   The lval field may also be lval_register.
-
-   WARNING: This field is used by the code which handles watchpoints
-   (see breakpoint.c) to decide whether a particular value can be
-   watched by hardware watchpoints.  If the lazy flag is set for some
-   member of a value chain, it is assumed that this member of the
-   chain doesn't need to be watched as part of watching the value
-   itself.  This is how GDB avoids watching the entire struct or array
-   when the user wants to watch a single struct member or array
-   element.  If you ever change the way lazy flag is set and reset, be
-   sure to consider this use as well!  */
-
-extern int value_lazy (const struct value *);
-extern void set_value_lazy (struct value *value, int val);
-
-extern int value_stack (const struct value *);
-extern void set_value_stack (struct value *value, int val);
-
 /* Throw an error complaining that the value has been optimized
    out.  */
 
@@ -632,12 +704,6 @@ extern void mark_value_bytes_optimized_out (struct value *value,
 extern void mark_value_bits_optimized_out (struct value *value,
                                           LONGEST offset, LONGEST length);
 
-/* Set or return field indicating whether a variable is initialized or
-   not, based on debugging information supplied by the compiler.
-   1 = initialized; 0 = uninitialized.  */
-extern int value_initialized (const struct value *);
-extern void set_value_initialized (struct value *, int);
-
 /* Set COMPONENT's location as appropriate for a component of WHOLE
    --- regardless of what kind of lvalue WHOLE is.  */
 extern void set_value_component_location (struct value *component,
@@ -648,39 +714,19 @@ extern void set_value_component_location (struct value *component,
    limited to just the first PIECE.  Expect further change.  */
 /* Type of value; either not an lval, or one of the various different
    possible kinds of lval.  */
-extern enum lval_type *deprecated_value_lval_hack (struct value *);
-#define VALUE_LVAL(val) (*deprecated_value_lval_hack (val))
-
-/* Like VALUE_LVAL, except the parameter can be const.  */
-extern enum lval_type value_lval_const (const struct value *value);
-
-/* If lval == lval_memory, return the address in the inferior.  If
-   lval == lval_register, return the byte offset into the registers
-   structure.  Otherwise, return 0.  The returned address
-   includes the offset, if any.  */
-extern CORE_ADDR value_address (const struct value *);
-
-/* Like value_address, except the result does not include value's
-   offset.  */
-extern CORE_ADDR value_raw_address (const struct value *);
-
-/* Set the address of a value.  */
-extern void set_value_address (struct value *, CORE_ADDR);
+#define VALUE_LVAL(val) (*((val)->deprecated_lval_hack ()))
 
 /* Pointer to internal variable.  */
-extern struct internalvar **deprecated_value_internalvar_hack (struct value *);
-#define VALUE_INTERNALVAR(val) (*deprecated_value_internalvar_hack (val))
+#define VALUE_INTERNALVAR(val) (*((val)->deprecated_internalvar_hack ()))
 
 /* Frame ID of "next" frame to which a register value is relative.  A
    register value is indicated by VALUE_LVAL being set to lval_register.
    So, if the register value is found relative to frame F, then the
    frame id of F->next will be stored in VALUE_NEXT_FRAME_ID.  */
-extern struct frame_id *deprecated_value_next_frame_id_hack (struct value *);
-#define VALUE_NEXT_FRAME_ID(val) (*deprecated_value_next_frame_id_hack (val))
+#define VALUE_NEXT_FRAME_ID(val) (*((val)->deprecated_next_frame_id_hack ()))
 
 /* Register number if the value is from a register.  */
-extern int *deprecated_value_regnum_hack (struct value *);
-#define VALUE_REGNUM(val) (*deprecated_value_regnum_hack (val))
+#define VALUE_REGNUM(val) (*((val)->deprecated_regnum_hack ()))
 
 /* Return value after lval_funcs->coerce_ref (after check_typedef).  Return
    NULL if lval_funcs->coerce_ref is not applicable for whatever reason.  */
@@ -764,7 +810,7 @@ extern void mark_value_bits_unavailable (struct value *value,
    example, to compare a complete object value with itself, including
    its enclosing type chunk, you'd do:
 
-     int len = check_typedef (value_enclosing_type (val))->length ();
+   int len = check_typedef (val->enclosing_type ())->length ();
      value_contents_eq (val, 0, val, 0, len);
 
    Returns true iff the set of available/valid contents match.
@@ -973,8 +1019,6 @@ extern struct value *read_var_value (struct symbol *var,
                                     const struct block *var_block,
                                     frame_info_ptr frame);
 
-extern struct value *allocate_value (struct type *type);
-extern struct value *allocate_value_lazy (struct type *type);
 extern void value_contents_copy (struct value *dst, LONGEST dst_offset,
                                 struct value *src, LONGEST src_offset,
                                 LONGEST length);