From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 21/47] Turn allocate_value_lazy into a static "constructor"
Date: Thu, 09 Feb 2023 14:38:42 -0700 [thread overview]
Message-ID: <20230209-submit-value-fixups-2023-v1-21-55dc2794dbb9@tromey.com> (raw)
In-Reply-To: <20230209-submit-value-fixups-2023-v1-0-55dc2794dbb9@tromey.com>
This changes allocate_value_lazy to be a static "constructor" of
struct value.
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.
---
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 type *type)
/* Be careful not to make a lazy not_lval value. */
|| (VALUE_LVAL (val) != not_lval
&& type->length () > val->type ()->length ()))
- result = allocate_value_lazy (type);
+ result = value::allocate_lazy (type);
else
{
result = 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 regnum)
/* We should have a valid next frame. */
gdb_assert (frame_id_p (get_frame_id (next_frame)));
- reg_val = allocate_value_lazy (register_type (gdbarch, regnum));
+ reg_val = value::allocate_lazy (register_type (gdbarch, regnum));
VALUE_LVAL (reg_val) = lval_register;
VALUE_REGNUM (reg_val) = regnum;
VALUE_NEXT_FRAME_ID (reg_val) = 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 = base->type ()->target_type ();
struct type *array_type = lookup_array_range_type (elt_type, 0,
llen - 1);
- struct value *array = allocate_value_lazy (array_type);
+ struct value *array = value::allocate_lazy (array_type);
VALUE_LVAL (array) = lval_memory;
array->set_address (value_as_address (base));
value_fetch_lazy (array);
diff --git a/gdb/valops.c b/gdb/valops.c
index 6a557c357f1..3f91f720aee 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -4079,7 +4079,7 @@ value_slice (struct value *array, int lowbound, int length)
slice_type->set_code (array_type->code ());
if (VALUE_LVAL (array) == lval_memory && array->lazy ())
- slice = allocate_value_lazy (slice_type);
+ slice = value::allocate_lazy (slice_type);
else
{
slice = allocate_value (slice_type);
diff --git a/gdb/value.c b/gdb/value.c
index 43543e22f3a..9dd6b77443c 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -729,12 +729,10 @@ static std::vector<value_ref_ptr> value_history;
static std::vector<value_ref_ptr> all_values;
-/* 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. */
struct value *
-allocate_value_lazy (struct type *type)
+value::allocate_lazy (struct type *type)
{
struct value *val;
@@ -841,7 +839,7 @@ allocate_value_contents (struct value *val)
struct value *
allocate_value (struct type *type)
{
- struct value *val = allocate_value_lazy (type);
+ struct value *val = value::allocate_lazy (type);
allocate_value_contents (val);
val->m_lazy = 0;
@@ -871,7 +869,7 @@ allocate_computed_value (struct type *type,
const struct lval_funcs *funcs,
void *closure)
{
- struct value *v = allocate_value_lazy (type);
+ struct value *v = value::allocate_lazy (type);
VALUE_LVAL (v) = lval_computed;
v->m_location.computed.funcs = funcs;
@@ -885,7 +883,7 @@ allocate_computed_value (struct type *type,
struct value *
allocate_optimized_out_value (struct type *type)
{
- struct value *retval = allocate_value_lazy (type);
+ struct value *retval = value::allocate_lazy (type);
mark_value_bytes_optimized_out (retval, 0, type->length ());
retval->set_lazy (0);
@@ -1417,7 +1415,7 @@ value_copy (const value *arg)
struct value *val;
if (arg->lazy ())
- val = allocate_value_lazy (encl_type);
+ val = value::allocate_lazy (encl_type);
else
val = allocate_value (encl_type);
val->m_type = arg->m_type;
@@ -2786,7 +2784,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
LONGEST bitpos = arg_type->field (fieldno).loc_bitpos ();
LONGEST container_bitsize = type->length () * 8;
- v = allocate_value_lazy (type);
+ v = value::allocate_lazy (type);
v->m_bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno);
if ((bitpos % container_bitsize) + v->m_bitsize <= container_bitsize
&& type->length () <= (int) sizeof (LONGEST))
@@ -2824,7 +2822,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
boffset = arg_type->field (fieldno).loc_bitpos () / 8;
if (arg1->lazy ())
- v = allocate_value_lazy (arg1->enclosing_type ());
+ v = value::allocate_lazy (arg1->enclosing_type ());
else
{
v = allocate_value (arg1->enclosing_type ());
@@ -2844,7 +2842,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
gdb_assert (PROP_CONST == TYPE_DATA_LOCATION_KIND (type));
/* For dynamic data types defer memory allocation
until we actual access the value. */
- v = allocate_value_lazy (type);
+ v = value::allocate_lazy (type);
}
else
{
@@ -2857,7 +2855,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
value_fetch_lazy (arg1);
if (arg1->lazy ())
- v = allocate_value_lazy (type);
+ v = value::allocate_lazy (type);
else
{
v = allocate_value (type);
@@ -3262,7 +3260,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 = allocate_value_lazy (type);
+ struct value *val = value::allocate_lazy (type);
VALUE_LVAL (val) = (lv == lval_computed ? not_lval : lv);
val->m_is_zero = true;
@@ -3336,7 +3334,7 @@ value_from_contents_and_address_unresolved (struct type *type,
struct value *v;
if (valaddr == NULL)
- v = allocate_value_lazy (type);
+ v = value::allocate_lazy (type);
else
v = value_from_contents (type, valaddr);
VALUE_LVAL (v) = lval_memory;
@@ -3362,7 +3360,7 @@ value_from_contents_and_address (struct type *type,
struct value *v;
if (valaddr == NULL)
- v = allocate_value_lazy (resolved_type);
+ v = value::allocate_lazy (resolved_type);
else
v = value_from_contents (resolved_type, valaddr);
if (TYPE_DATA_LOCATION (resolved_type_no_typedef) != NULL
@@ -3458,7 +3456,7 @@ value_from_component (struct value *whole, struct type *type, LONGEST offset)
struct value *v;
if (VALUE_LVAL (whole) == lval_memory && whole->lazy ())
- v = allocate_value_lazy (type);
+ v = value::allocate_lazy (type);
else
{
v = allocate_value (type);
diff --git a/gdb/value.h b/gdb/value.h
index 03a9259a6fe..5fab4e19508 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -144,6 +144,9 @@ typedef gdb::ref_ptr<struct value, value_ref_policy> value_ref_ptr;
struct value
{
+private:
+
+ /* Values can only be created with 'allocate_lazy'. */
explicit value (struct type *type_)
: m_modifiable (1),
m_lazy (1),
@@ -155,6 +158,13 @@ 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);
+
~value ();
DISABLE_COPY_AND_ASSIGN (value);
@@ -992,7 +1002,7 @@ extern struct value *read_var_value (struct symbol *var,
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);
--
2.39.1
next prev parent reply other threads:[~2023-02-09 21:38 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-09 21:38 [PATCH 00/47] Use methods for struct value Tom Tromey
2023-02-09 21:38 ` [PATCH 01/47] Rename all fields of " Tom Tromey
2023-02-10 21:05 ` Tom Tromey
2023-02-09 21:38 ` [PATCH 02/47] Move ~value body out-of-line Tom Tromey
2023-02-09 21:38 ` [PATCH 03/47] Move struct value to value.h Tom Tromey
2023-02-09 21:38 ` [PATCH 04/47] Turn value_type into method Tom Tromey
2023-02-09 21:38 ` [PATCH 05/47] Turn deprecated_set_value_type into a method Tom Tromey
2023-02-09 21:38 ` [PATCH 06/47] Turn value_arch into method Tom Tromey
2023-02-10 2:08 ` Simon Marchi
2023-02-10 16:36 ` Tom Tromey
2023-02-09 21:38 ` [PATCH 07/47] Turn value_bitsize " Tom Tromey
2023-02-09 21:38 ` [PATCH 08/47] Turn value_bitpos " Tom Tromey
2023-02-09 21:38 ` [PATCH 09/47] Turn value_parent " Tom Tromey
2023-02-09 21:38 ` [PATCH 10/47] Turn value_offset " Tom Tromey
2023-02-09 21:38 ` [PATCH 11/47] Turn deprecated_value_modifiable " Tom Tromey
2023-02-09 21:38 ` [PATCH 12/47] Turn value_enclosing_type " Tom Tromey
2023-02-09 21:38 ` [PATCH 13/47] Turn some value offset functions " Tom Tromey
2023-02-09 21:38 ` [PATCH 14/47] Turn value_lazy and set_value_lazy functions into methods Tom Tromey
2023-02-09 21:38 ` [PATCH 15/47] Turn value_stack and set_value_stack " Tom Tromey
2023-02-09 21:38 ` [PATCH 16/47] Turn value_computed_closure and value_computed_funcs " Tom Tromey
2023-02-09 21:38 ` [PATCH 17/47] Convert value_lval_const and deprecated_lval_hack to methods Tom Tromey
2023-02-09 21:38 ` [PATCH 18/47] Turn value_initialized and set_value_initialized functions into methods Tom Tromey
2023-02-09 21:38 ` [PATCH 19/47] Turn value_address and set_value_address " Tom Tromey
2023-02-09 21:38 ` [PATCH 20/47] Turn more deprecated_* " Tom Tromey
2023-02-09 21:38 ` Tom Tromey [this message]
2023-02-09 21:38 ` [PATCH 22/47] Turn allocate_value into a static "constructor" Tom Tromey
2023-02-09 21:38 ` [PATCH 23/47] Turn allocate_computed_value into " Tom Tromey
2023-02-09 21:38 ` [PATCH 24/47] Turn allocate_optimized_out_value " Tom Tromey
2023-02-09 21:38 ` [PATCH 25/47] Turn value_zero " Tom Tromey
2023-02-09 21:38 ` [PATCH 26/47] Turn some value_contents functions into methods Tom Tromey
2023-02-09 21:38 ` [PATCH 27/47] Turn value_fetch_lazy into a method Tom Tromey
2023-02-09 21:38 ` [PATCH 28/47] Turn allocate_value_contents " Tom Tromey
2023-02-09 21:38 ` [PATCH 29/47] Turn value_contents_eq " Tom Tromey
2023-02-10 2:18 ` Simon Marchi
2023-02-10 17:46 ` Tom Tromey
2023-02-09 21:38 ` [PATCH 30/47] Turn value_bits_synthetic_pointer " Tom Tromey
2023-02-09 21:38 ` [PATCH 31/47] Move value_ref_policy methods out-of-line Tom Tromey
2023-02-09 21:38 ` [PATCH 32/47] Turn value_incref and value_decref into methods Tom Tromey
2023-02-09 21:38 ` [PATCH 33/47] Turn remaining value_contents functions " Tom Tromey
2023-02-10 2:24 ` Simon Marchi
2023-02-10 17:46 ` Tom Tromey
2023-02-09 21:38 ` [PATCH 34/47] Fully qualify calls to copy in value.c Tom Tromey
2023-02-09 21:38 ` [PATCH 35/47] Turn value_copy into a method Tom Tromey
2023-02-10 2:42 ` Simon Marchi
2023-02-10 18:03 ` Tom Tromey
2023-02-09 21:38 ` [PATCH 36/47] Turn many optimized-out value functions into methods Tom Tromey
2023-02-09 21:38 ` [PATCH 37/47] Turn value_non_lval and value_force_lval " Tom Tromey
2023-02-09 21:38 ` [PATCH 38/47] Turn set_value_component_location into method Tom Tromey
2023-02-09 21:39 ` [PATCH 39/47] Change some code to use value methods Tom Tromey
2023-02-09 21:39 ` [PATCH 40/47] Turn some xmethod functions into methods Tom Tromey
2023-02-09 21:39 ` [PATCH 41/47] Turn preserve_one_value into method Tom Tromey
2023-02-09 21:39 ` [PATCH 42/47] Turn various value copying-related functions into methods Tom Tromey
2023-02-10 20:20 ` Tom Tromey
2023-02-09 21:39 ` [PATCH 43/47] Add value::set_modifiable Tom Tromey
2023-02-09 21:39 ` [PATCH 44/47] Make struct value data members private Tom Tromey
2023-02-09 21:39 ` [PATCH 45/47] Make ~value private Tom Tromey
2023-02-09 21:39 ` [PATCH 46/47] Introduce set_lval method on value Tom Tromey
2023-02-09 21:39 ` [PATCH 47/47] Remove deprecated_lval_hack Tom Tromey
2023-02-10 2:54 ` [PATCH 00/47] Use methods for struct value Simon Marchi
2023-02-10 18:08 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230209-submit-value-fixups-2023-v1-21-55dc2794dbb9@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).