Turn value_fetch_lazy into a method

This changes value_fetch_lazy to be a method of value.  A few helper
functions are converted as well, to avoid problems in later patches
when the data members are all made private.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
This commit is contained in:
Tom Tromey
2023-01-31 13:53:55 -07:00
parent bbe912ba88
commit 78259c365f
16 changed files with 98 additions and 88 deletions

View File

@ -10853,7 +10853,7 @@ ada_var_msym_value_operation::evaluate_for_cast (struct type *expect_type,
if (VALUE_LVAL (val) == lval_memory) if (VALUE_LVAL (val) == lval_memory)
{ {
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
VALUE_LVAL (val) = not_lval; VALUE_LVAL (val) = not_lval;
} }
return val; return val;
@ -10875,7 +10875,7 @@ ada_var_value_operation::evaluate_for_cast (struct type *expect_type,
if (VALUE_LVAL (val) == lval_memory) if (VALUE_LVAL (val) == lval_memory)
{ {
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
VALUE_LVAL (val) = not_lval; VALUE_LVAL (val) = not_lval;
} }
return val; return val;

View File

@ -983,7 +983,7 @@ ada_val_print_ref (struct type *type, const gdb_byte *valaddr,
deref_val = ada_tag_value_at_base_address (deref_val); deref_val = ada_tag_value_at_base_address (deref_val);
if (deref_val->lazy ()) if (deref_val->lazy ())
value_fetch_lazy (deref_val); deref_val->fetch_lazy ();
common_val_print (deref_val, stream, recurse + 1, common_val_print (deref_val, stream, recurse + 1,
options, language_def (language_ada)); options, language_def (language_ada));

View File

@ -212,7 +212,7 @@ fetch_subexp_value (struct expression *exp,
try try
{ {
value_fetch_lazy (result); result->fetch_lazy ();
*valp = result; *valp = result;
} }
catch (const gdb_exception_error &except) catch (const gdb_exception_error &except)
@ -2878,7 +2878,7 @@ var_msym_value_operation::evaluate_for_cast (struct type *to_type,
if (VALUE_LVAL (val) == lval_memory) if (VALUE_LVAL (val) == lval_memory)
{ {
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
VALUE_LVAL (val) = not_lval; VALUE_LVAL (val) = not_lval;
} }
return val; return val;
@ -2899,7 +2899,7 @@ var_value_operation::evaluate_for_cast (struct type *to_type,
if (VALUE_LVAL (val) == lval_memory) if (VALUE_LVAL (val) == lval_memory)
{ {
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
VALUE_LVAL (val) = not_lval; VALUE_LVAL (val) = not_lval;
} }
return val; return val;

View File

@ -262,7 +262,7 @@ value_of_register (int regnum, frame_info_ptr frame)
return value_of_user_reg (regnum, frame); return value_of_user_reg (regnum, frame);
reg_val = value_of_register_lazy (frame, regnum); reg_val = value_of_register_lazy (frame, regnum);
value_fetch_lazy (reg_val); reg_val->fetch_lazy ();
return reg_val; return reg_val;
} }

View File

@ -164,7 +164,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
if (!arg1->lazy ()) if (!arg1->lazy ())
{ {
arg1->set_lazy (1); arg1->set_lazy (1);
value_fetch_lazy (arg1); arg1->fetch_lazy ();
} }
vfn = value_field (entry, 2); vfn = value_field (entry, 2);

View File

@ -966,7 +966,7 @@ gdbscm_apply_val_pretty_printer (const struct extension_language_defn *extlang,
enum guile_string_repr_result print_result; enum guile_string_repr_result print_result;
if (value->lazy ()) if (value->lazy ())
value_fetch_lazy (value); value->fetch_lazy ();
/* No pretty-printer support for unavailable values. */ /* No pretty-printer support for unavailable values. */
if (!value_bytes_available (value, 0, type->length ())) if (!value_bytes_available (value, 0, type->length ()))

View File

@ -1248,7 +1248,7 @@ gdbscm_value_fetch_lazy_x (SCM self)
return gdbscm_wrap ([=] return gdbscm_wrap ([=]
{ {
if (value->lazy ()) if (value->lazy ())
value_fetch_lazy (value); value->fetch_lazy ();
return SCM_UNSPECIFIED; return SCM_UNSPECIFIED;
}); });
} }

View File

@ -579,7 +579,7 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
enum gdbpy_string_repr_result print_result; enum gdbpy_string_repr_result print_result;
if (value->lazy ()) if (value->lazy ())
value_fetch_lazy (value); value->fetch_lazy ();
/* No pretty-printer support for unavailable values. */ /* No pretty-printer support for unavailable values. */
if (!value_bytes_available (value, 0, type->length ())) if (!value_bytes_available (value, 0, type->length ()))

View File

@ -1241,7 +1241,7 @@ valpy_fetch_lazy (PyObject *self, PyObject *args)
try try
{ {
if (value->lazy ()) if (value->lazy ())
value_fetch_lazy (value); value->fetch_lazy ();
} }
catch (const gdb_exception &except) catch (const gdb_exception &except)
{ {

View File

@ -352,7 +352,7 @@ rust_val_print_slice (struct value *val, struct ui_file *stream, int recurse,
struct value *array = value::allocate_lazy (array_type); struct value *array = value::allocate_lazy (array_type);
VALUE_LVAL (array) = lval_memory; VALUE_LVAL (array) = lval_memory;
array->set_address (value_as_address (base)); array->set_address (value_as_address (base));
value_fetch_lazy (array); array->fetch_lazy ();
generic_value_print (array, stream, recurse, options, generic_value_print (array, stream, recurse, options,
&rust_decorations); &rust_decorations);
} }

View File

@ -581,9 +581,9 @@ read_frame_arg (const frame_print_options &fp_opts,
struct type *type = val->type (); struct type *type = val->type ();
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
if (entryval->lazy ()) if (entryval->lazy ())
value_fetch_lazy (entryval); entryval->fetch_lazy ();
if (value_contents_eq (val, 0, entryval, 0, type->length ())) if (value_contents_eq (val, 0, entryval, 0, type->length ()))
{ {
@ -600,12 +600,12 @@ read_frame_arg (const frame_print_options &fp_opts,
val_deref = coerce_ref (val); val_deref = coerce_ref (val);
if (val_deref->lazy ()) if (val_deref->lazy ())
value_fetch_lazy (val_deref); val_deref->fetch_lazy ();
type_deref = val_deref->type (); type_deref = val_deref->type ();
entryval_deref = coerce_ref (entryval); entryval_deref = coerce_ref (entryval);
if (entryval_deref->lazy ()) if (entryval_deref->lazy ())
value_fetch_lazy (entryval_deref); entryval_deref->fetch_lazy ();
/* If the reference addresses match but dereferenced /* If the reference addresses match but dereferenced
content does not match print them. */ content does not match print them. */
@ -2750,7 +2750,7 @@ return_command (const char *retval_exp, int from_tty)
/* Make sure the value is fully evaluated. It may live in the /* Make sure the value is fully evaluated. It may live in the
stack frame we're about to pop. */ stack frame we're about to pop. */
if (return_value->lazy ()) if (return_value->lazy ())
value_fetch_lazy (return_value); return_value->fetch_lazy ();
if (thisfun != NULL) if (thisfun != NULL)
function = read_var_value (thisfun, NULL, thisframe); function = read_var_value (thisfun, NULL, thisframe);

View File

@ -992,7 +992,7 @@ get_value_at (struct type *type, CORE_ADDR addr, int lazy)
val = value_from_contents_and_address (type, NULL, addr); val = value_from_contents_and_address (type, NULL, addr);
if (!lazy) if (!lazy)
value_fetch_lazy (val); val->fetch_lazy ();
return val; return val;
} }

View File

@ -1044,7 +1044,7 @@ common_val_print (struct value *value, struct ui_file *stream, int recurse,
value = ada_to_fixed_value (value); value = ada_to_fixed_value (value);
if (value->lazy ()) if (value->lazy ())
value_fetch_lazy (value); value->fetch_lazy ();
struct value_print_options local_opts = *options; struct value_print_options local_opts = *options;
struct type *type = value->type (); struct type *type = value->type ();

View File

@ -214,7 +214,7 @@ value_entirely_available (struct value *value)
/* We can only tell whether the whole value is available when we try /* We can only tell whether the whole value is available when we try
to read it. */ to read it. */
if (value->m_lazy) if (value->m_lazy)
value_fetch_lazy (value); value->fetch_lazy ();
if (value->m_unavailable.empty ()) if (value->m_unavailable.empty ())
return 1; return 1;
@ -232,7 +232,7 @@ value_entirely_covered_by_range_vector (struct value *value,
/* We can only tell whether the whole value is optimized out / /* We can only tell whether the whole value is optimized out /
unavailable when we try to read it. */ unavailable when we try to read it. */
if (value->m_lazy) if (value->m_lazy)
value_fetch_lazy (value); value->fetch_lazy ();
if (ranges.size () == 1) if (ranges.size () == 1)
{ {
@ -1117,7 +1117,7 @@ gdb::array_view<const gdb_byte>
value_contents_for_printing (struct value *value) value_contents_for_printing (struct value *value)
{ {
if (value->m_lazy) if (value->m_lazy)
value_fetch_lazy (value); value->fetch_lazy ();
ULONGEST length = value->enclosing_type ()->length (); ULONGEST length = value->enclosing_type ()->length ();
return gdb::make_array_view (value->m_contents.get (), length); return gdb::make_array_view (value->m_contents.get (), length);
@ -1283,7 +1283,7 @@ value_contents_copy (struct value *dst, LONGEST dst_offset,
struct value *src, LONGEST src_offset, LONGEST length) struct value *src, LONGEST src_offset, LONGEST length)
{ {
if (src->m_lazy) if (src->m_lazy)
value_fetch_lazy (src); src->fetch_lazy ();
value_contents_copy_raw (dst, dst_offset, src, src_offset, length); value_contents_copy_raw (dst, dst_offset, src, src_offset, length);
} }
@ -1301,7 +1301,7 @@ gdb::array_view<gdb_byte>
value::contents_writeable () value::contents_writeable ()
{ {
if (m_lazy) if (m_lazy)
value_fetch_lazy (this); fetch_lazy ();
return contents_raw (); return contents_raw ();
} }
@ -1325,7 +1325,7 @@ value_optimized_out (struct value *value)
/* Fall back to fetching. */ /* Fall back to fetching. */
try try
{ {
value_fetch_lazy (value); value->fetch_lazy ();
} }
catch (const gdb_exception_error &ex) catch (const gdb_exception_error &ex)
{ {
@ -1733,7 +1733,7 @@ record_latest_value (struct value *val)
&& calculate_limited_array_length (type) <= max_value_size) && calculate_limited_array_length (type) <= max_value_size)
val->m_limited_length = max_value_size; val->m_limited_length = max_value_size;
value_fetch_lazy (val); val->fetch_lazy ();
} }
ULONGEST limit = val->m_limited_length; ULONGEST limit = val->m_limited_length;
@ -2106,7 +2106,7 @@ value_of_internalvar (struct gdbarch *gdbarch, struct internalvar *var)
case INTERNALVAR_VALUE: case INTERNALVAR_VALUE:
val = value_copy (var->u.value); val = value_copy (var->u.value);
if (val->lazy ()) if (val->lazy ())
value_fetch_lazy (val); val->fetch_lazy ();
break; break;
case INTERNALVAR_MAKE_VALUE: case INTERNALVAR_MAKE_VALUE:
@ -2246,7 +2246,7 @@ set_internalvar (struct internalvar *var, struct value *val)
later when this internalvar is referenced and the target is gone or later when this internalvar is referenced and the target is gone or
has changed. */ has changed. */
if (copy->lazy ()) if (copy->lazy ())
value_fetch_lazy (copy); copy->fetch_lazy ();
/* Release the value from the value chain to prevent it from being /* Release the value from the value chain to prevent it from being
deleted by free_all_values. From here on this function should not deleted by free_all_values. From here on this function should not
@ -2959,7 +2959,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
+ (bitpos - v->m_bitpos) / 8); + (bitpos - v->m_bitpos) / 8);
v->set_parent (arg1); v->set_parent (arg1);
if (!arg1->lazy ()) if (!arg1->lazy ())
value_fetch_lazy (v); v->fetch_lazy ();
} }
else if (fieldno < TYPE_N_BASECLASSES (arg_type)) else if (fieldno < TYPE_N_BASECLASSES (arg_type))
{ {
@ -2970,7 +2970,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
/* Lazy register values with offsets are not supported. */ /* Lazy register values with offsets are not supported. */
if (VALUE_LVAL (arg1) == lval_register && arg1->lazy ()) if (VALUE_LVAL (arg1) == lval_register && arg1->lazy ())
value_fetch_lazy (arg1); arg1->fetch_lazy ();
/* We special case virtual inheritance here because this /* We special case virtual inheritance here because this
requires access to the contents, which we would rather avoid requires access to the contents, which we would rather avoid
@ -3015,7 +3015,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
/* Lazy register values with offsets are not supported. */ /* Lazy register values with offsets are not supported. */
if (VALUE_LVAL (arg1) == lval_register && arg1->lazy ()) if (VALUE_LVAL (arg1) == lval_register && arg1->lazy ())
value_fetch_lazy (arg1); arg1->fetch_lazy ();
if (arg1->lazy ()) if (arg1->lazy ())
v = value::allocate_lazy (type); v = value::allocate_lazy (type);
@ -3788,46 +3788,46 @@ using_struct_return (struct gdbarch *gdbarch,
!= RETURN_VALUE_REGISTER_CONVENTION); != RETURN_VALUE_REGISTER_CONVENTION);
} }
/* Helper for value_fetch_lazy when the value is a bitfield. */ /* See value.h. */
static void void
value_fetch_lazy_bitfield (struct value *val) value::fetch_lazy_bitfield ()
{ {
gdb_assert (val->bitsize () != 0); gdb_assert (bitsize () != 0);
/* To read a lazy bitfield, read the entire enclosing value. This /* To read a lazy bitfield, read the entire enclosing value. This
prevents reading the same block of (possibly volatile) memory once prevents reading the same block of (possibly volatile) memory once
per bitfield. It would be even better to read only the containing per bitfield. It would be even better to read only the containing
word, but we have no way to record that just specific bits of a word, but we have no way to record that just specific bits of a
value have been fetched. */ value have been fetched. */
struct value *parent = val->parent (); struct value *parent = this->parent ();
if (parent->lazy ()) if (parent->lazy ())
value_fetch_lazy (parent); parent->fetch_lazy ();
unpack_value_bitfield (val, val->bitpos (), val->bitsize (), unpack_value_bitfield (this, bitpos (), bitsize (),
value_contents_for_printing (parent).data (), value_contents_for_printing (parent).data (),
val->offset (), parent); offset (), parent);
} }
/* Helper for value_fetch_lazy when the value is in memory. */ /* See value.h. */
static void void
value_fetch_lazy_memory (struct value *val) value::fetch_lazy_memory ()
{ {
gdb_assert (VALUE_LVAL (val) == lval_memory); gdb_assert (m_lval == lval_memory);
CORE_ADDR addr = val->address (); CORE_ADDR addr = address ();
struct type *type = check_typedef (val->enclosing_type ()); struct type *type = check_typedef (enclosing_type ());
/* Figure out how much we should copy from memory. Usually, this is just /* Figure out how much we should copy from memory. Usually, this is just
the size of the type, but, for arrays, we might only be loading a the size of the type, but, for arrays, we might only be loading a
small part of the array (this is only done for very large arrays). */ small part of the array (this is only done for very large arrays). */
int len = 0; int len = 0;
if (val->m_limited_length > 0) if (m_limited_length > 0)
{ {
gdb_assert (val->type ()->code () == TYPE_CODE_ARRAY); gdb_assert (this->type ()->code () == TYPE_CODE_ARRAY);
len = val->m_limited_length; len = m_limited_length;
} }
else if (type->length () > 0) else if (type->length () > 0)
len = type_length_units (type); len = type_length_units (type);
@ -3835,23 +3835,23 @@ value_fetch_lazy_memory (struct value *val)
gdb_assert (len >= 0); gdb_assert (len >= 0);
if (len > 0) if (len > 0)
read_value_memory (val, 0, val->stack (), addr, read_value_memory (this, 0, stack (), addr,
val->contents_all_raw ().data (), len); contents_all_raw ().data (), len);
} }
/* Helper for value_fetch_lazy when the value is in a register. */ /* See value.h. */
static void void
value_fetch_lazy_register (struct value *val) value::fetch_lazy_register ()
{ {
frame_info_ptr next_frame; frame_info_ptr next_frame;
int regnum; int regnum;
struct type *type = check_typedef (val->type ()); struct type *type = check_typedef (this->type ());
struct value *new_val = val, *mark = value_mark (); struct value *new_val = this, *mark = value_mark ();
/* Offsets are not supported here; lazy register values must /* Offsets are not supported here; lazy register values must
refer to the entire register. */ refer to the entire register. */
gdb_assert (val->offset () == 0); gdb_assert (offset () == 0);
while (VALUE_LVAL (new_val) == lval_register && new_val->lazy ()) while (VALUE_LVAL (new_val) == lval_register && new_val->lazy ())
{ {
@ -3897,12 +3897,12 @@ value_fetch_lazy_register (struct value *val)
/* If it's still lazy (for instance, a saved register on the /* If it's still lazy (for instance, a saved register on the
stack), fetch it. */ stack), fetch it. */
if (new_val->lazy ()) if (new_val->lazy ())
value_fetch_lazy (new_val); new_val->fetch_lazy ();
/* Copy the contents and the unavailability/optimized-out /* Copy the contents and the unavailability/optimized-out
meta-data from NEW_VAL to VAL. */ meta-data from NEW_VAL to VAL. */
val->set_lazy (0); set_lazy (0);
value_contents_copy (val, val->embedded_offset (), value_contents_copy (this, embedded_offset (),
new_val, new_val->embedded_offset (), new_val, new_val->embedded_offset (),
type_length_units (type)); type_length_units (type));
@ -3910,9 +3910,9 @@ value_fetch_lazy_register (struct value *val)
{ {
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
frame_info_ptr frame; frame_info_ptr frame;
frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (val)); frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (this));
frame = get_prev_frame_always (frame); frame = get_prev_frame_always (frame);
regnum = VALUE_REGNUM (val); regnum = VALUE_REGNUM (this);
gdbarch = get_frame_arch (frame); gdbarch = get_frame_arch (frame);
string_file debug_file; string_file debug_file;
@ -3957,41 +3957,35 @@ value_fetch_lazy_register (struct value *val)
value_free_to_mark (mark); value_free_to_mark (mark);
} }
/* Load the actual content of a lazy value. Fetch the data from the /* See value.h. */
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 void
value_fetch_lazy (struct value *val) value::fetch_lazy ()
{ {
gdb_assert (val->lazy ()); gdb_assert (lazy ());
allocate_value_contents (val, true); allocate_value_contents (this, true);
/* A value is either lazy, or fully fetched. The /* A value is either lazy, or fully fetched. The
availability/validity is only established as we try to fetch a availability/validity is only established as we try to fetch a
value. */ value. */
gdb_assert (val->m_optimized_out.empty ()); gdb_assert (m_optimized_out.empty ());
gdb_assert (val->m_unavailable.empty ()); gdb_assert (m_unavailable.empty ());
if (val->m_is_zero) if (m_is_zero)
{ {
/* Nothing. */ /* Nothing. */
} }
else if (val->bitsize ()) else if (bitsize ())
value_fetch_lazy_bitfield (val); fetch_lazy_bitfield ();
else if (VALUE_LVAL (val) == lval_memory) else if (VALUE_LVAL (this) == lval_memory)
value_fetch_lazy_memory (val); fetch_lazy_memory ();
else if (VALUE_LVAL (val) == lval_register) else if (VALUE_LVAL (this) == lval_register)
value_fetch_lazy_register (val); fetch_lazy_register ();
else if (VALUE_LVAL (val) == lval_computed else if (VALUE_LVAL (this) == lval_computed
&& val->computed_funcs ()->read != NULL) && computed_funcs ()->read != NULL)
val->computed_funcs ()->read (val); computed_funcs ()->read (this);
else else
internal_error (_("Unexpected lazy value type.")); internal_error (_("Unexpected lazy value type."));
val->set_lazy (0); set_lazy (0);
} }
/* Implementation of the convenience function $_isvoid. */ /* Implementation of the convenience function $_isvoid. */

View File

@ -386,6 +386,15 @@ public:
gdb::array_view<gdb_byte> contents_all_raw (); gdb::array_view<gdb_byte> contents_all_raw ();
gdb::array_view<gdb_byte> contents_writeable (); gdb::array_view<gdb_byte> contents_writeable ();
/* 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 ();
/* Type of value; either not an lval, or one of the various /* Type of value; either not an lval, or one of the various
different possible kinds of lval. */ different possible kinds of lval. */
@ -568,6 +577,15 @@ private:
/* Allocate a value and its contents for type TYPE. If CHECK_SIZE /* Allocate a value and its contents for type TYPE. If CHECK_SIZE
is true, then apply the usual max-value-size checks. */ is true, then apply the usual max-value-size checks. */
static struct value *allocate (struct type *type, bool check_size); 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 ();
}; };
/* Returns value_type or value_enclosing_type depending on /* Returns value_type or value_enclosing_type depending on
@ -676,8 +694,6 @@ extern gdb::array_view<const gdb_byte> value_contents_for_printing (struct value
extern gdb::array_view<const gdb_byte> extern gdb::array_view<const gdb_byte>
value_contents_for_printing_const (const struct value *value); 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 /* 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, exist in the program, at least partially. If the value is lazy,
this may fetch it now. */ this may fetch it now. */

View File

@ -1268,7 +1268,7 @@ install_new_value (struct varobj *var, struct value *value, bool initial)
try try
{ {
value_fetch_lazy (value); value->fetch_lazy ();
} }
catch (const gdb_exception_error &except) catch (const gdb_exception_error &except)