}
};
-/* Increase VAL's reference count. */
-
-extern void value_incref (struct value *val);
-
-/* Decrease VAL's reference count. When the reference count drops to
- 0, VAL will be freed. */
-
-extern void value_decref (struct value *val);
-
/* A policy class to interface gdb::ref_ptr with struct value. */
struct value_ref_policy
{
- static void incref (struct value *ptr)
- {
- value_incref (ptr);
- }
-
- static void decref (struct value *ptr)
- {
- value_decref (ptr);
- }
+ static void incref (struct value *ptr);
+ static void decref (struct value *ptr);
};
/* A gdb:;ref_ptr pointer to a struct value. */
struct value
{
+private:
+
+ /* Values can only be created via "static constructors". */
explicit value (struct type *type_)
- : m_modifiable (1),
- m_lazy (1),
- m_initialized (1),
- m_stack (0),
+ : m_modifiable (true),
+ m_lazy (true),
+ m_initialized (true),
+ m_stack (false),
m_is_zero (false),
m_in_history (false),
m_type (type_),
{
}
+ /* Values can only be destroyed via the reference-counting
+ mechanism. */
~value ();
DISABLE_COPY_AND_ASSIGN (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);
+
+ /* Allocate NOT_LVAL value for type TYPE being OPTIMIZED_OUT. */
+ static struct value *allocate_optimized_out (struct type *type);
+
+ /* Create a value of type TYPE that is zero, and return it. */
+ static struct value *zero (struct type *type, enum lval_type lv);
+
+ /* Return a copy of the value. It contains the same contents, for
+ the same memory address, but it's a different block of
+ storage. */
+ struct value *copy () const;
+
/* Type of the value. */
struct type *type () const
{ return m_type; }
/* 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
+ bool deprecated_modifiable () const
{ return m_modifiable; }
+ /* Set or clear the modifiable flag. */
+ void set_modifiable (bool val)
+ { m_modifiable = val; }
+
LONGEST pointed_to_offset () const
{ return m_pointed_to_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,
+ /* If false, contents of this value are in the contents field. If
+ true, 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.
element. If you ever change the way lazy flag is set and reset, be
sure to consider this use as well! */
- int lazy () const
+ bool lazy () const
{ return m_lazy; }
- void set_lazy (int val)
+ void set_lazy (bool 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
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
+ of `type' within that larger type, in bytes. The contents()
+ method takes `embedded_offset' into account, so most GDB code
continues to see the `type' portion of the value, just as the
inferior would.
void set_enclosing_type (struct type *new_type);
- int stack () const
+ bool stack () const
{ return m_stack; }
- void set_stack (int val)
+ void set_stack (bool 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 lval () const
+ { return m_lval; }
+
+ /* Set the 'lval' of this value. */
+ void set_lval (lval_type val)
+ { m_lval = val; }
+
+ /* Set or return field indicating whether a variable is initialized or
+ not, based on debugging information supplied by the compiler.
+ true = initialized; false = uninitialized. */
+ bool initialized () const
+ { return m_initialized; }
+
+ void set_initialized (bool 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 ();
+
+ /* contents() and contents_raw() both return the address of the gdb
+ buffer used to hold a copy of the contents of the lval.
+ contents() is used when the contents of the buffer are needed --
+ it uses fetch_lazy() to load the buffer from the process being
+ debugged if it hasn't already been loaded (contents_writeable()
+ is used when a writeable but fetched buffer is required)..
+ contents_raw() is used when data is being stored into the buffer,
+ or when it is certain that the contents of the buffer are valid.
+
+ Note: The contents pointer is adjusted by the offset required to
+ get to the real subobject, if the value happens to represent
+ something embedded in a larger run-time object. */
+ gdb::array_view<gdb_byte> contents_raw ();
+
+ /* Actual contents of the value. For use of this value; setting it
+ uses the stuff above. Not valid if lazy is nonzero. Target
+ byte-order. We force it to be aligned properly for any possible
+ value. Note that a value therefore extends beyond what is
+ declared here. */
+ gdb::array_view<const gdb_byte> contents ();
+
+ /* The ALL variants of the above two methods do not adjust the
+ returned pointer by the embedded_offset value. */
+ gdb::array_view<const gdb_byte> contents_all ();
+ gdb::array_view<gdb_byte> contents_all_raw ();
+
+ gdb::array_view<gdb_byte> contents_writeable ();
+
+ /* Like contents_all, but does not require that the returned bits be
+ valid. This should only be used in situations where you plan to
+ check the validity manually. */
+ gdb::array_view<const gdb_byte> contents_for_printing ();
+
+ /* Like contents_for_printing, but accepts a constant value pointer.
+ Unlike contents_for_printing however, the pointed value must
+ _not_ be lazy. */
+ gdb::array_view<const gdb_byte> contents_for_printing () const;
+
+ /* Load the actual content of a lazy value. Fetch the data from the
+ user's process and clear the lazy flag to indicate that the data in
+ the buffer is valid.
+
+ If the value is zero-length, we avoid calling read_memory, which
+ would abort. We mark the value as fetched anyway -- all 0 bytes of
+ it. */
+ void fetch_lazy ();
+
+ /* Compare LENGTH bytes of this value's contents starting at OFFSET1
+ with LENGTH bytes of VAL2's contents starting at OFFSET2.
+
+ Note that "contents" refers to the whole value's contents
+ (value_contents_all), without any embedded offset adjustment. For
+ example, to compare a complete object value with itself, including
+ its enclosing type chunk, you'd do:
+
+ int len = check_typedef (val->enclosing_type ())->length ();
+ val->contents_eq (0, val, 0, len);
+
+ Returns true iff the set of available/valid contents match.
+
+ Optimized-out contents are equal to optimized-out contents, and are
+ not equal to non-optimized-out contents.
+
+ Unavailable contents are equal to unavailable contents, and are not
+ equal to non-unavailable contents.
+
+ For example, if 'x's represent an unavailable byte, and 'V' and 'Z'
+ represent different available/valid bytes, in a value with length
+ 16:
+
+ offset: 0 4 8 12 16
+ contents: xxxxVVVVxxxxVVZZ
+
+ then:
+
+ val->contents_eq(0, val, 8, 6) => true
+ val->contents_eq(0, val, 4, 4) => false
+ val->contents_eq(0, val, 8, 8) => false
+ val->contents_eq(4, val, 12, 2) => true
+ val->contents_eq(4, val, 12, 4) => true
+ val->contents_eq(3, val, 4, 4) => true
+
+ If 'x's represent an unavailable byte, 'o' represents an optimized
+ out byte, in a value with length 8:
+
+ offset: 0 4 8
+ contents: xxxxoooo
+
+ then:
+
+ val->contents_eq(0, val, 2, 2) => true
+ val->contents_eq(4, val, 6, 2) => true
+ val->contents_eq(0, val, 4, 4) => true
+
+ We only know whether a value chunk is unavailable or optimized out
+ if we've tried to read it. As this routine is used by printing
+ routines, which may be printing values in the value history, long
+ after the inferior is gone, it works with const values. Therefore,
+ this routine must not be called with lazy values. */
+
+ bool contents_eq (LONGEST offset1, const struct value *val2, LONGEST offset2,
+ LONGEST length) const;
+
+ /* An overload of contents_eq that compares the entirety of both
+ values. */
+ bool contents_eq (const struct value *val2) const;
+
+ /* Given a value, determine whether the bits starting at OFFSET and
+ extending for LENGTH bits are a synthetic pointer. */
+
+ bool bits_synthetic_pointer (LONGEST offset, LONGEST length) const;
+
+ /* Increase this value's reference count. */
+ void incref ()
+ { ++m_reference_count; }
+
+ /* Decrease this value's reference count. When the reference count
+ drops to 0, it will be freed. */
+ void decref ();
+
+ /* Given a value, determine whether the contents bytes starting at
+ OFFSET and extending for LENGTH bytes are available. This returns
+ true if all bytes in the given range are available, false if any
+ byte is unavailable. */
+ bool bytes_available (LONGEST offset, ULONGEST length) const;
+
+ /* Given a value, determine whether the contents bits starting at
+ OFFSET and extending for LENGTH bits are available. This returns
+ true if all bits in the given range are available, false if any
+ bit is unavailable. */
+ bool bits_available (LONGEST offset, ULONGEST length) const;
+
+ /* Like bytes_available, but return false if any byte in the
+ whole object is unavailable. */
+ bool entirely_available ();
+
+ /* Like entirely_available, but return false if any byte in the
+ whole object is available. */
+ bool entirely_unavailable ()
+ { return entirely_covered_by_range_vector (m_unavailable); }
+
+ /* Mark this value's content bytes starting at OFFSET and extending
+ for LENGTH bytes as unavailable. */
+ void mark_bytes_unavailable (LONGEST offset, ULONGEST length);
+
+ /* Mark this value's content bits starting at OFFSET and extending
+ for LENGTH bits as unavailable. */
+ void mark_bits_unavailable (LONGEST offset, ULONGEST length);
+
+ /* If true, this is the value of a variable which does not actually
+ exist in the program, at least partially. If the value is lazy,
+ this may fetch it now. */
+ bool optimized_out ();
+
+ /* Given a value, return true if any of the contents bits starting at
+ OFFSET and extending for LENGTH bits is optimized out, false
+ otherwise. */
+ bool bits_any_optimized_out (int bit_offset, int bit_length) const;
+
+ /* Like optimized_out, but return true iff the whole value is
+ optimized out. */
+ bool entirely_optimized_out ()
+ {
+ return entirely_covered_by_range_vector (m_optimized_out);
+ }
+
+ /* Mark this value's content bytes starting at OFFSET and extending
+ for LENGTH bytes as optimized out. */
+ void mark_bytes_optimized_out (int offset, int length);
+
+ /* Mark this value's content bits starting at OFFSET and extending
+ for LENGTH bits as optimized out. */
+ void mark_bits_optimized_out (LONGEST offset, LONGEST length);
+
+ /* Return a version of this that is non-lvalue. */
+ struct value *non_lval ();
+
+ /* Write contents of this value at ADDR and set its lval type to be
+ LVAL_MEMORY. */
+ void force_lval (CORE_ADDR);
+
+ /* Set this values's location as appropriate for a component of
+ WHOLE --- regardless of what kind of lvalue WHOLE is. */
+ void set_component_location (const struct value *whole);
+
+ /* Build a value wrapping and representing WORKER. The value takes
+ ownership of the xmethod_worker object. */
+ static struct value *from_xmethod (xmethod_worker_up &&worker);
+
+ /* Return the type of the result of TYPE_CODE_XMETHOD value METHOD. */
+ struct type *result_type_of_xmethod (gdb::array_view<value *> argv);
+
+ /* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value
+ METHOD. */
+ struct value *call_xmethod (gdb::array_view<value *> argv);
+
+ /* Update this value before discarding OBJFILE. COPIED_TYPES is
+ used to prevent cycles / duplicates. */
+ void preserve (struct objfile *objfile, htab_t copied_types);
+
+ /* Unpack a bitfield of BITSIZE bits found at BITPOS in the object
+ at VALADDR + EMBEDDEDOFFSET that has the type of DEST_VAL and
+ store the contents in DEST_VAL, zero or sign extending if the
+ type of DEST_VAL is wider than BITSIZE. VALADDR points to the
+ contents of this value. If this value's contents required to
+ extract the bitfield from are unavailable/optimized out, DEST_VAL
+ is correspondingly marked unavailable/optimized out. */
+ void unpack_bitfield (struct value *dest_val,
+ LONGEST bitpos, LONGEST bitsize,
+ const gdb_byte *valaddr, LONGEST embedded_offset)
+ const;
+
+ /* Copy LENGTH bytes of this value's (all) contents
+ (value_contents_all) starting at SRC_OFFSET byte, into DST
+ value's (all) contents, starting at DST_OFFSET. If unavailable
+ contents are being copied from this value, the corresponding DST
+ contents are marked unavailable accordingly. DST must not be
+ lazy. If this value is lazy, it will be fetched now.
+
+ It is assumed the contents of DST in the [DST_OFFSET,
+ DST_OFFSET+LENGTH) range are wholly available. */
+ void contents_copy (struct value *dst, LONGEST dst_offset,
+ LONGEST src_offset, LONGEST length);
+
+ /* Given a value (offset by OFFSET bytes)
+ of a struct or union type ARG_TYPE,
+ extract and return the value of one of its (non-static) fields.
+ FIELDNO says which field. */
+ struct value *primitive_field (LONGEST offset, int fieldno,
+ struct type *arg_type);
+
+ /* Create a new value by extracting it from this value. TYPE is the
+ type of the new value. BIT_OFFSET and BIT_LENGTH describe the
+ offset and field width of the value to extract from this value --
+ BIT_LENGTH may differ from TYPE's length in the case where this
+ value's type is packed.
+
+ When the value does come from a non-byte-aligned offset or field
+ width, it will be marked non_lval. */
+ struct value *from_component_bitsize (struct type *type,
+ LONGEST bit_offset,
+ LONGEST bit_length);
+
+ /* Record this value on the value history, and return its location
+ in the history. The value is removed from the value chain. */
+ int record_latest ();
+
+private:
/* Type of value; either not an lval, or one of the various
different possible kinds of lval. */
enum lval_type m_lval = not_lval;
/* Is it modifiable? Only relevant if lval != not_lval. */
- unsigned int m_modifiable : 1;
+ bool m_modifiable : 1;
- /* If zero, contents of this value are in the contents field. If
- nonzero, contents are in inferior. If the lval field is lval_memory,
+ /* If false, contents of this value are in the contents field. If
+ true, 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.
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! */
- unsigned int m_lazy : 1;
+ bool m_lazy : 1;
/* If value is a variable, is it initialized or not. */
- unsigned int m_initialized : 1;
+ bool m_initialized : 1;
/* If value is from the stack. If this is set, read_stack will be
used instead of read_memory to enable extra caching. */
- unsigned int m_stack : 1;
+ bool m_stack : 1;
- /* True if this is a zero value, created by 'value_zero'; false
+ /* True if this is a zero value, created by 'value::zero'; false
otherwise. */
bool m_is_zero : 1;
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 target addressable memory
- units. The value_contents() macro takes `embedded_offset' into account,
+ units. The contents() method takes `embedded_offset' into account,
so most GDB code continues to see the `type' portion of the value, just
as the inferior would.
limited_length will be set to indicate the length in octets that were
loaded from the inferior. */
ULONGEST m_limited_length = 0;
+
+ /* 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);
+
+ /* Helper for fetch_lazy when the value is a bitfield. */
+ void fetch_lazy_bitfield ();
+
+ /* Helper for fetch_lazy when the value is in memory. */
+ void fetch_lazy_memory ();
+
+ /* Helper for fetch_lazy when the value is in a register. */
+ void fetch_lazy_register ();
+
+ /* Try to limit ourselves to only fetching the limited number of
+ elements. However, if this limited number of elements still
+ puts us over max_value_size, then we still refuse it and
+ return failure here, which will ultimately throw an error. */
+ bool set_limited_array_length ();
+
+ /* Allocate the contents of this value if it has not been allocated
+ yet. If CHECK_SIZE is true, then apply the usual max-value-size
+ checks. */
+ void allocate_contents (bool check_size);
+
+ /* Helper function for value_contents_eq. The only difference is that
+ this function is bit rather than byte based.
+
+ Compare LENGTH bits of this value's contents starting at OFFSET1
+ bits with LENGTH bits of VAL2's contents starting at OFFSET2
+ bits. Return true if the available bits match. */
+ bool contents_bits_eq (int offset1, const struct value *val2, int offset2,
+ int length) const;
+
+ void require_not_optimized_out () const;
+ void require_available () const;
+
+ /* Returns true if this value is entirely covered by RANGES. If the
+ value is lazy, it'll be read now. Note that RANGE is a pointer
+ to pointer because reading the value might change *RANGE. */
+ bool entirely_covered_by_range_vector (const std::vector<range> &ranges);
+
+ /* Copy the ranges metadata from this value that overlaps
+ [SRC_BIT_OFFSET, SRC_BIT_OFFSET+BIT_LENGTH) into DST,
+ adjusted. */
+ void ranges_copy_adjusted (struct value *dst, int dst_bit_offset,
+ int src_bit_offset, int bit_length) const;
+
+ /* Copy LENGTH target addressable memory units of this value's (all)
+ contents (value_contents_all) starting at SRC_OFFSET, into DST
+ value's (all) contents, starting at DST_OFFSET. If unavailable
+ contents are being copied from this, the corresponding DST
+ contents are marked unavailable accordingly. Neither DST nor
+ this value may be lazy values.
+
+ It is assumed the contents of DST in the [DST_OFFSET,
+ DST_OFFSET+LENGTH) range are wholly available. */
+ void contents_copy_raw (struct value *dst, LONGEST dst_offset,
+ LONGEST src_offset, LONGEST length);
+
+ /* A helper for value_from_component_bitsize that copies bits from
+ this value to DEST. */
+ void contents_copy_raw_bitwise (struct value *dst, LONGEST dst_bit_offset,
+ LONGEST src_bit_offset, LONGEST bit_length);
};
+inline void
+value_ref_policy::incref (struct value *ptr)
+{
+ ptr->incref ();
+}
+
+inline void
+value_ref_policy::decref (struct value *ptr)
+{
+ ptr->decref ();
+}
+
/* Returns value_type or value_enclosing_type depending on
value_print_options.objectprint.
/* If non-NULL, this is used to determine whether the indicated bits
of VALUE are a synthetic pointer. */
- int (*check_synthetic_pointer) (const struct value *value,
- LONGEST offset, int length);
+ bool (*check_synthetic_pointer) (const struct value *value,
+ LONGEST offset, int length);
/* Return a duplicate of VALUE's closure, for use in a new value.
This may simply return the same closure, if VALUE's is
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);
-
/* Throw an error complaining that the value has been optimized
out. */
extern void error_value_optimized_out (void);
-/* value_contents() and value_contents_raw() both return the address
- of the gdb buffer used to hold a copy of the contents of the lval.
- value_contents() is used when the contents of the buffer are needed
- -- it uses value_fetch_lazy() to load the buffer from the process
- being debugged if it hasn't already been loaded
- (value_contents_writeable() is used when a writeable but fetched
- buffer is required).. value_contents_raw() is used when data is
- being stored into the buffer, or when it is certain that the
- contents of the buffer are valid.
-
- Note: The contents pointer is adjusted by the offset required to
- get to the real subobject, if the value happens to represent
- something embedded in a larger run-time object. */
-
-extern gdb::array_view<gdb_byte> value_contents_raw (struct value *);
-
-/* Actual contents of the value. For use of this value; setting it
- uses the stuff above. Not valid if lazy is nonzero. Target
- byte-order. We force it to be aligned properly for any possible
- value. Note that a value therefore extends beyond what is
- declared here. */
-
-extern gdb::array_view<const gdb_byte> value_contents (struct value *);
-extern gdb::array_view<gdb_byte> value_contents_writeable (struct value *);
-
-/* The ALL variants of the above two macros do not adjust the returned
- pointer by the embedded_offset value. */
-
-extern gdb::array_view<gdb_byte> value_contents_all_raw (struct value *);
-extern gdb::array_view<const gdb_byte> value_contents_all (struct value *);
-
-/* Like value_contents_all, but does not require that the returned
- bits be valid. This should only be used in situations where you
- plan to check the validity manually. */
-extern gdb::array_view<const gdb_byte> value_contents_for_printing (struct value *value);
-
-/* Like value_contents_for_printing, but accepts a constant value
- pointer. Unlike value_contents_for_printing however, the pointed
- value must _not_ be lazy. */
-extern gdb::array_view<const gdb_byte>
- value_contents_for_printing_const (const struct value *value);
-
-extern void value_fetch_lazy (struct value *val);
-
-/* If nonzero, this is the value of a variable which does not actually
- exist in the program, at least partially. If the value is lazy,
- this may fetch it now. */
-extern int value_optimized_out (struct value *value);
-
-/* Given a value, return true if any of the contents bits starting at
- OFFSET and extending for LENGTH bits is optimized out, false
- otherwise. */
-
-extern int value_bits_any_optimized_out (const struct value *value,
- int bit_offset, int bit_length);
-
-/* Like value_optimized_out, but return true iff the whole value is
- optimized out. */
-extern int value_entirely_optimized_out (struct value *value);
-
-/* Mark VALUE's content bytes starting at OFFSET and extending for
- LENGTH bytes as optimized out. */
-
-extern void mark_value_bytes_optimized_out (struct value *value,
- int offset, int length);
-
-/* Mark VALUE's content bits starting at OFFSET and extending for
- LENGTH bits as 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,
- const struct value *whole);
-
-/* While the following fields are per- VALUE .CONTENT .PIECE (i.e., a
- single value might have multiple LVALs), this hacked interface is
- 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);
-
/* 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. */
extern struct value *coerce_array (struct value *value);
-/* Given a value, determine whether the bits starting at OFFSET and
- extending for LENGTH bits are a synthetic pointer. */
-
-extern int value_bits_synthetic_pointer (const struct value *value,
- LONGEST offset, LONGEST length);
-
-/* Given a value, determine whether the contents bytes starting at
- OFFSET and extending for LENGTH bytes are available. This returns
- nonzero if all bytes in the given range are available, zero if any
- byte is unavailable. */
-
-extern int value_bytes_available (const struct value *value,
- LONGEST offset, ULONGEST length);
-
-/* Given a value, determine whether the contents bits starting at
- OFFSET and extending for LENGTH bits are available. This returns
- nonzero if all bits in the given range are available, zero if any
- bit is unavailable. */
-
-extern int value_bits_available (const struct value *value,
- LONGEST offset, ULONGEST length);
-
-/* Like value_bytes_available, but return false if any byte in the
- whole object is unavailable. */
-extern int value_entirely_available (struct value *value);
-
-/* Like value_entirely_available, but return false if any byte in the
- whole object is available. */
-extern int value_entirely_unavailable (struct value *value);
-
-/* Mark VALUE's content bytes starting at OFFSET and extending for
- LENGTH bytes as unavailable. */
-
-extern void mark_value_bytes_unavailable (struct value *value,
- LONGEST offset, ULONGEST length);
-
-/* Mark VALUE's content bits starting at OFFSET and extending for
- LENGTH bits as unavailable. */
-
-extern void mark_value_bits_unavailable (struct value *value,
- LONGEST offset, ULONGEST length);
-
-/* Compare LENGTH bytes of VAL1's contents starting at OFFSET1 with
- LENGTH bytes of VAL2's contents starting at OFFSET2.
-
- Note that "contents" refers to the whole value's contents
- (value_contents_all), without any embedded offset adjustment. For
- example, to compare a complete object value with itself, including
- its enclosing type chunk, you'd do:
-
- 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.
-
- Optimized-out contents are equal to optimized-out contents, and are
- not equal to non-optimized-out contents.
-
- Unavailable contents are equal to unavailable contents, and are not
- equal to non-unavailable contents.
-
- For example, if 'x's represent an unavailable byte, and 'V' and 'Z'
- represent different available/valid bytes, in a value with length
- 16:
-
- offset: 0 4 8 12 16
- contents: xxxxVVVVxxxxVVZZ
-
- then:
-
- value_contents_eq(val, 0, val, 8, 6) => true
- value_contents_eq(val, 0, val, 4, 4) => false
- value_contents_eq(val, 0, val, 8, 8) => false
- value_contents_eq(val, 4, val, 12, 2) => true
- value_contents_eq(val, 4, val, 12, 4) => true
- value_contents_eq(val, 3, val, 4, 4) => true
-
- If 'x's represent an unavailable byte, 'o' represents an optimized
- out byte, in a value with length 8:
-
- offset: 0 4 8
- contents: xxxxoooo
-
- then:
-
- value_contents_eq(val, 0, val, 2, 2) => true
- value_contents_eq(val, 4, val, 6, 2) => true
- value_contents_eq(val, 0, val, 4, 4) => true
-
- We only know whether a value chunk is unavailable or optimized out
- if we've tried to read it. As this routine is used by printing
- routines, which may be printing values in the value history, long
- after the inferior is gone, it works with const values. Therefore,
- this routine must not be called with lazy values. */
-
-extern bool value_contents_eq (const struct value *val1, LONGEST offset1,
- const struct value *val2, LONGEST offset2,
- LONGEST length);
-
-/* An overload of value_contents_eq that compares the entirety of both
- values. */
-
-extern bool value_contents_eq (const struct value *val1,
- const struct value *val2);
-
/* Read LENGTH addressable memory units starting at MEMADDR into BUFFER,
which is (or will be copied to) VAL's contents buffer offset by
BIT_OFFSET bits. Marks value contents ranges as unavailable if
whether the memory is known to be stack memory. */
extern void read_value_memory (struct value *val, LONGEST bit_offset,
- int stack, CORE_ADDR memaddr,
+ bool stack, CORE_ADDR memaddr,
gdb_byte *buffer, size_t length);
/* Cast SCALAR_VALUE to the element type of VECTOR_TYPE, then replicate
extern LONGEST value_as_long (struct value *val);
extern CORE_ADDR value_as_address (struct value *val);
+/* Extract the value from VAL as a MPZ. This coerces arrays and
+ handles various integer-like types as well. */
+
+extern gdb_mpz value_as_mpz (struct value *val);
+
extern LONGEST unpack_long (struct type *type, const gdb_byte *valaddr);
extern CORE_ADDR unpack_pointer (struct type *type, const gdb_byte *valaddr);
LONGEST embedded_offset, int fieldno,
const struct value *val, LONGEST *result);
-extern void unpack_value_bitfield (struct value *dest_val,
- LONGEST bitpos, LONGEST bitsize,
- const gdb_byte *valaddr,
- LONGEST embedded_offset,
- const struct value *val);
-
extern struct value *value_field_bitfield (struct type *type, int fieldno,
const gdb_byte *valaddr,
LONGEST embedded_offset,
extern struct value *value_from_component (struct value *, struct type *,
LONGEST);
+/* Convert the value V into a newly allocated value. */
+extern struct value *value_from_mpz (struct type *type, const gdb_mpz &v);
-/* Create a new value by extracting it from WHOLE. TYPE is the type
- of the new value. BIT_OFFSET and BIT_LENGTH describe the offset
- and field width of the value to extract from WHOLE -- BIT_LENGTH
- may differ from TYPE's length in the case where WHOLE's type is
- packed.
-
- When the value does come from a non-byte-aligned offset or field
- width, it will be marked non_lval. */
+extern struct value *value_at (struct type *type, CORE_ADDR addr);
-extern struct value *value_from_component_bitsize (struct value *whole,
- struct type *type,
- LONGEST bit_offset,
- LONGEST bit_length);
+/* Return a new value given a type and an address. The new value is
+ lazy. If FRAME is given, it is used when resolving dynamic
+ properties. */
-extern struct value *value_at (struct type *type, CORE_ADDR addr);
-extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr);
+extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr,
+ frame_info_ptr frame = nullptr);
/* Like value_at, but ensures that the result is marked not_lval.
This can be important if the memory is "volatile". */
extern struct value *value_from_contents_and_address_unresolved
(struct type *, const gdb_byte *, CORE_ADDR);
-extern struct value *value_from_contents_and_address (struct type *,
- const gdb_byte *,
- CORE_ADDR);
+extern struct value *value_from_contents_and_address
+ (struct type *, const gdb_byte *, CORE_ADDR,
+ frame_info_ptr frame = nullptr);
extern struct value *value_from_contents (struct type *, const gdb_byte *);
extern struct value *default_value_from_register (struct gdbarch *gdbarch,
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);
-
extern struct value *allocate_repeat_value (struct type *type, int count);
extern struct value *value_mark (void);
/* Free the values currently on the value stack. */
void free_to_mark ()
{
- if (m_value != NULL)
+ if (!m_freed)
{
value_free_to_mark (m_value);
- m_value = NULL;
+ m_freed = true;
}
}
private:
const struct value *m_value;
+ bool m_freed = false;
};
-extern struct value *value_cstring (const char *ptr, ssize_t len,
+/* Create not_lval value representing a NULL-terminated C string. The
+ resulting value has type TYPE_CODE_ARRAY. The string passed in should
+ not include embedded null characters.
+
+ PTR points to the string data; COUNT is number of characters (does
+ not include the NULL terminator) pointed to by PTR, each character is of
+ type (and size of) CHAR_TYPE. */
+
+extern struct value *value_cstring (const gdb_byte *ptr, ssize_t count,
struct type *char_type);
-extern struct value *value_string (const char *ptr, ssize_t len,
+
+/* Specialisation of value_cstring above. In this case PTR points to
+ single byte characters. CHAR_TYPE must have a length of 1. */
+inline struct value *value_cstring (const char *ptr, ssize_t count,
+ struct type *char_type)
+{
+ gdb_assert (char_type->length () == 1);
+ return value_cstring ((const gdb_byte *) ptr, count, char_type);
+}
+
+/* Create a not_lval value with type TYPE_CODE_STRING, the resulting value
+ has type TYPE_CODE_STRING.
+
+ PTR points to the string data; COUNT is number of characters pointed to
+ by PTR, each character has the type (and size of) CHAR_TYPE.
+
+ Note that string types are like array of char types with a lower bound
+ defined by the language (usually zero or one). Also the string may
+ contain embedded null characters. */
+
+extern struct value *value_string (const gdb_byte *ptr, ssize_t count,
struct type *char_type);
+/* Specialisation of value_string above. In this case PTR points to
+ single byte characters. CHAR_TYPE must have a length of 1. */
+inline struct value *value_string (const char *ptr, ssize_t count,
+ struct type *char_type)
+{
+ gdb_assert (char_type->length () == 1);
+ return value_string ((const gdb_byte *) ptr, count, char_type);
+}
+
extern struct value *value_array (int lowbound, int highbound,
struct value **elemvec);
extern struct value *value_assign (struct value *toval,
struct value *fromval);
+/* The unary + operation. */
extern struct value *value_pos (struct value *arg1);
+/* The unary - operation. */
extern struct value *value_neg (struct value *arg1);
+/* The unary ~ operation -- but note that it also implements the GCC
+ extension, where ~ of a complex number is the complex
+ conjugate. */
extern struct value *value_complement (struct value *arg1);
extern struct value *value_struct_elt (struct value **argp,
extern struct value *value_field (struct value *arg1, int fieldno);
-extern struct value *value_primitive_field (struct value *arg1, LONGEST offset,
- int fieldno,
- struct type *arg_type);
-
-
extern struct type *value_rtti_indirect_type (struct value *, int *, LONGEST *,
int *);
extern struct value *value_dynamic_cast (struct type *type, struct value *arg);
-extern struct value *value_zero (struct type *type, enum lval_type lv);
-
extern struct value *value_one (struct type *type);
extern struct value *value_repeat (struct value *arg1, int count);
extern struct value *register_value_being_returned (struct type *valtype,
struct regcache *retbuf);
-extern int value_in (struct value *element, struct value *set);
-
extern int value_bit_index (struct type *type, const gdb_byte *addr,
int index);
struct value *function,
struct type *value_type);
-/* Evaluate the expression EXP. If set, EXPECT_TYPE is passed to the
- outermost operation's evaluation. This is ignored by most
- operations, but may be used, e.g., to determine the type of an
- otherwise untyped symbol. The caller should not assume that the
- returned value has this type. */
-
-extern struct value *evaluate_expression (struct expression *exp,
- struct type *expect_type = nullptr);
-
-extern struct value *evaluate_type (struct expression *exp);
-
extern value *evaluate_var_value (enum noside noside, const block *blk,
symbol *var);
std::vector<value_ref_ptr> *val_chain,
bool preserve_errors);
-extern struct value *parse_and_eval (const char *exp);
+extern struct value *parse_and_eval (const char *exp, parser_flags flags = 0);
extern struct value *parse_to_comma_and_eval (const char **expp);
extern value_ref_ptr release_value (struct value *val);
-extern int record_latest_value (struct value *val);
-
extern void modify_field (struct type *type, gdb_byte *addr,
LONGEST fieldval, LONGEST bitpos, LONGEST bitsize);
/* From values.c */
-extern struct value *value_copy (const value *);
-
-extern struct value *value_non_lval (struct value *);
-
-extern void value_force_lval (struct value *, CORE_ADDR);
-
extern struct value *make_cv_value (int, int, struct value *);
-extern void preserve_one_value (struct value *, struct objfile *, htab_t);
-
/* From valops.c */
extern struct value *varying_to_slice (struct value *);
const char *value_internal_function_name (struct value *);
-/* Build a value wrapping and representing WORKER. The value takes ownership
- of the xmethod_worker object. */
-
-extern struct value *value_from_xmethod (xmethod_worker_up &&worker);
-
-extern struct type *result_type_of_xmethod (struct value *method,
- gdb::array_view<value *> argv);
-
-extern struct value *call_xmethod (struct value *method,
- gdb::array_view<value *> argv);
-
/* Destroy the values currently allocated. This is called when GDB is
exiting (e.g., on quit_force). */
extern void finalize_values ();
of floating-point, fixed-point, or integer type. */
extern gdb_mpq value_to_gdb_mpq (struct value *value);
+/* Return true if LEN (in bytes) exceeds the max-value-size setting,
+ otherwise, return false. If the user has disabled (set to unlimited)
+ the max-value-size setting then this function will always return false. */
+extern bool exceeds_max_value_size (ULONGEST length);
+
/* While an instance of this class is live, and array values that are
created, that are larger than max_value_size, will be restricted in size
to a particular number of elements. */