[PATCH 13/24] gdb: add value::allocate_register

Simon Marchi
2023-11-08T05:51:58Z

From: Simon Marchi <simon.marchi@efficios.com>

Add value::allocate_register, to facilitate allocating a value
representing a register in a given frame (or rather, in the given
frame's previous frame). It will be used in a subsequent patch. I
changed one relatively obvious spot that could use it, to at least
exercise the code path.

Change-Id: Icd4960f5e471a74b657bb3596c88d89679ef3772
---
gdb/regcache.c | 7 ++-----
gdb/value.c | 15 +++++++++++++++
gdb/value.h | 7 +++++++
3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/gdb/regcache.c b/gdb/regcache.c
index 4f3881386f34..4256b82da19a 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -792,11 +792,8 @@ readable_regcache::cooked_read_value (int regnum)
|| (m_has_pseudo && m_register_status[regnum] != REG_UNKNOWN)
|| !gdbarch_pseudo_register_read_value_p (m_descr->gdbarch))
{
- struct value *result;
-
- result = value::allocate (register_type (m_descr->gdbarch, regnum));
- result->set_lval (lval_register);
- VALUE_REGNUM (result) = regnum;
+ value *result = value::allocate_register
+ (get_next_frame_sentinel_okay (get_current_frame ()), regnum);

/* It is more efficient in general to do this delegation in this
direction than in the other one, even though the value-based
diff --git a/gdb/value.c b/gdb/value.c
index 17b7c53d0522..a1b18087416f 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -959,6 +959,21 @@ value::allocate (struct type *type)
return allocate (type, true);
}

+/* See value.h */
+
+struct value *
+value::allocate_register (frame_info_ptr next_frame, int regnum)
+{
+ value *result
+ = value::allocate (register_type (frame_unwind_arch (next_frame), regnum));
+
+ result->set_lval (lval_register);
+ VALUE_REGNUM (result) = regnum;
+ VALUE_NEXT_FRAME_ID (result) = get_frame_id (next_frame);
+
+ return result;
+}
+
/* Allocate a value that has the correct length
for COUNT repetitions of type TYPE. */

diff --git a/gdb/value.h b/gdb/value.h
index 37017c9dd9f7..511bde8bbd46 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -159,6 +159,13 @@ struct value
/* Allocate a value and its contents for type TYPE. */
static struct value *allocate (struct type *type);

+ /* Allocate a non-lazy value representing register RENUM in the frame previous
+ to NEXT_FRAME. The type of the value is found using `register_type`.
+
+ The caller is responsible for filling the value's contents. */
+ static struct value *allocate_register (frame_info_ptr next_frame,
+ int regnum);
+
/* Create a computed lvalue, with type TYPE, function pointers
FUNCS, and closure CLOSURE. */
static struct value *allocate_computed (struct type *type,
--
2.42.1