From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id DD4683858D35; Mon, 13 Feb 2023 22:29:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD4683858D35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1676327345; bh=FfvIKytyvF51PEvBpEXgNkNpZd8wHKCcjPm9Sd0kT2o=; h=From:To:Subject:Date:From; b=a9kzE0FJFqE6IdrG3CHQa/RHXkQYtNbMUdth/VWfRsbqoXCxBpXJSFFrGId2hoYe2 0IWerdhUgkpiEDoROlISqb63dVvmUHFNlgmEfLtjx1gS9O6V4THaTPj4W+vA6U+oJS rNBqwsh8WsoIi/ANK8OY3MaQROfvO26/hVrXErnY= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Turn allocate_value_lazy into a static "constructor" X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: f29de665046c1b1a2feabf8d3d584b3b89699e10 X-Git-Newrev: cbe793af8831a7244de326d6b07c60c197f096a2 Message-Id: <20230213222905.DD4683858D35@sourceware.org> Date: Mon, 13 Feb 2023 22:29:05 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Dcbe793af8831= a7244de326d6b07c60c197f096a2 commit cbe793af8831a7244de326d6b07c60c197f096a2 Author: Tom Tromey Date: Tue Jan 31 13:24:00 2023 -0700 Turn allocate_value_lazy into a static "constructor" =20 This changes allocate_value_lazy to be a static "constructor" of struct value. =20 I considered trying to change value to use ordinary new/delete, but it seems to me that due to reference counting, we may someday want to change these static constructors to return value_ref_ptr instead. =20 Approved-By: Simon Marchi Diff: --- gdb/ada-lang.c | 2 +- gdb/findvar.c | 2 +- gdb/rust-lang.c | 2 +- gdb/valops.c | 2 +- gdb/value.c | 30 ++++++++++++++---------------- gdb/value.h | 12 +++++++++++- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index e13359a68f6..ae2f4df5332 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -561,7 +561,7 @@ coerce_unspec_val_to_type (struct value *val, struct ty= pe *type) /* Be careful not to make a lazy not_lval value. */ || (VALUE_LVAL (val) !=3D not_lval && type->length () > val->type ()->length ())) - result =3D allocate_value_lazy (type); + result =3D value::allocate_lazy (type); else { result =3D allocate_value (type); diff --git a/gdb/findvar.c b/gdb/findvar.c index 9420286e91c..cb4eb758bf2 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -294,7 +294,7 @@ value_of_register_lazy (frame_info_ptr frame, int regnu= m) /* We should have a valid next frame. */ gdb_assert (frame_id_p (get_frame_id (next_frame))); =20 - reg_val =3D allocate_value_lazy (register_type (gdbarch, regnum)); + reg_val =3D value::allocate_lazy (register_type (gdbarch, regnum)); VALUE_LVAL (reg_val) =3D lval_register; VALUE_REGNUM (reg_val) =3D regnum; VALUE_NEXT_FRAME_ID (reg_val) =3D get_frame_id (next_frame); diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index aa1590078dc..8f0953649ae 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -349,7 +349,7 @@ rust_val_print_slice (struct value *val, struct ui_file= *stream, int recurse, struct type *elt_type =3D base->type ()->target_type (); struct type *array_type =3D lookup_array_range_type (elt_type, 0, llen - 1); - struct value *array =3D allocate_value_lazy (array_type); + struct value *array =3D value::allocate_lazy (array_type); VALUE_LVAL (array) =3D lval_memory; array->set_address (value_as_address (base)); value_fetch_lazy (array); diff --git a/gdb/valops.c b/gdb/valops.c index cea9d3ce593..5e6095db81f 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -4079,7 +4079,7 @@ value_slice (struct value *array, int lowbound, int l= ength) slice_type->set_code (array_type->code ()); =20 if (VALUE_LVAL (array) =3D=3D lval_memory && array->lazy ()) - slice =3D allocate_value_lazy (slice_type); + slice =3D value::allocate_lazy (slice_type); else { slice =3D allocate_value (slice_type); diff --git a/gdb/value.c b/gdb/value.c index 471a98f277b..0dccb7307d6 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -744,12 +744,10 @@ static std::vector value_history; =20 static std::vector all_values; =20 -/* 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. */ +/* See value.h. */ =20 struct value * -allocate_value_lazy (struct type *type) +value::allocate_lazy (struct type *type) { struct value *val; =20 @@ -963,7 +961,7 @@ allocate_value_contents (struct value *val, bool check_= size) static struct value * allocate_value (struct type *type, bool check_size) { - struct value *val =3D allocate_value_lazy (type); + struct value *val =3D value::allocate_lazy (type); =20 allocate_value_contents (val, check_size); val->m_lazy =3D 0; @@ -1001,7 +999,7 @@ allocate_computed_value (struct type *type, const struct lval_funcs *funcs, void *closure) { - struct value *v =3D allocate_value_lazy (type); + struct value *v =3D value::allocate_lazy (type); =20 VALUE_LVAL (v) =3D lval_computed; v->m_location.computed.funcs =3D funcs; @@ -1015,7 +1013,7 @@ allocate_computed_value (struct type *type, struct value * allocate_optimized_out_value (struct type *type) { - struct value *retval =3D allocate_value_lazy (type); + struct value *retval =3D value::allocate_lazy (type); =20 mark_value_bytes_optimized_out (retval, 0, type->length ()); retval->set_lazy (0); @@ -1545,7 +1543,7 @@ value_copy (const value *arg) struct type *encl_type =3D arg->enclosing_type (); struct value *val; =20 - val =3D allocate_value_lazy (encl_type); + val =3D value::allocate_lazy (encl_type); val->m_type =3D arg->m_type; VALUE_LVAL (val) =3D arg->m_lval; val->m_location =3D arg->m_location; @@ -2950,7 +2948,7 @@ value_primitive_field (struct value *arg1, LONGEST of= fset, LONGEST bitpos =3D arg_type->field (fieldno).loc_bitpos (); LONGEST container_bitsize =3D type->length () * 8; =20 - v =3D allocate_value_lazy (type); + v =3D value::allocate_lazy (type); v->m_bitsize =3D TYPE_FIELD_BITSIZE (arg_type, fieldno); if ((bitpos % container_bitsize) + v->m_bitsize <=3D container_bitsi= ze && type->length () <=3D (int) sizeof (LONGEST)) @@ -2988,7 +2986,7 @@ value_primitive_field (struct value *arg1, LONGEST of= fset, boffset =3D arg_type->field (fieldno).loc_bitpos () / 8; =20 if (arg1->lazy ()) - v =3D allocate_value_lazy (arg1->enclosing_type ()); + v =3D value::allocate_lazy (arg1->enclosing_type ()); else { v =3D allocate_value (arg1->enclosing_type ()); @@ -3008,7 +3006,7 @@ value_primitive_field (struct value *arg1, LONGEST of= fset, gdb_assert (PROP_CONST =3D=3D TYPE_DATA_LOCATION_KIND (type)); /* For dynamic data types defer memory allocation until we actual access the value. */ - v =3D allocate_value_lazy (type); + v =3D value::allocate_lazy (type); } else { @@ -3021,7 +3019,7 @@ value_primitive_field (struct value *arg1, LONGEST of= fset, value_fetch_lazy (arg1); =20 if (arg1->lazy ()) - v =3D allocate_value_lazy (type); + v =3D value::allocate_lazy (type); else { v =3D allocate_value (type); @@ -3426,7 +3424,7 @@ pack_unsigned_long (gdb_byte *buf, struct type *type,= ULONGEST num) struct value * value_zero (struct type *type, enum lval_type lv) { - struct value *val =3D allocate_value_lazy (type); + struct value *val =3D value::allocate_lazy (type); =20 VALUE_LVAL (val) =3D (lv =3D=3D lval_computed ? not_lval : lv); val->m_is_zero =3D true; @@ -3500,7 +3498,7 @@ value_from_contents_and_address_unresolved (struct ty= pe *type, struct value *v; =20 if (valaddr =3D=3D NULL) - v =3D allocate_value_lazy (type); + v =3D value::allocate_lazy (type); else v =3D value_from_contents (type, valaddr); VALUE_LVAL (v) =3D lval_memory; @@ -3526,7 +3524,7 @@ value_from_contents_and_address (struct type *type, struct value *v; =20 if (valaddr =3D=3D NULL) - v =3D allocate_value_lazy (resolved_type); + v =3D value::allocate_lazy (resolved_type); else v =3D value_from_contents (resolved_type, valaddr); if (TYPE_DATA_LOCATION (resolved_type_no_typedef) !=3D NULL @@ -3622,7 +3620,7 @@ value_from_component (struct value *whole, struct typ= e *type, LONGEST offset) struct value *v; =20 if (VALUE_LVAL (whole) =3D=3D lval_memory && whole->lazy ()) - v =3D allocate_value_lazy (type); + v =3D value::allocate_lazy (type); else { v =3D allocate_value (type); diff --git a/gdb/value.h b/gdb/value.h index 788a3d8514e..29ed2a8a3ce 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -144,6 +144,9 @@ typedef gdb::ref_ptr va= lue_ref_ptr; =20 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,13 @@ struct value { } =20 +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); + ~value (); =20 DISABLE_COPY_AND_ASSIGN (value); @@ -1002,7 +1012,7 @@ extern struct value *read_var_value (struct symbol *v= ar, frame_info_ptr frame); =20 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);