struct value
{
+private:
+
+ /* Values can only be created via "static constructors". */
explicit value (struct type *type_)
: m_modifiable (1),
m_lazy (1),
{
}
+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);
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. */
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.
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).
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. */
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,
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. */
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.
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);