diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2023-12-01 11:27:26 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2023-12-14 16:04:49 +0000 |
commit | 6831f2cd547e6e18b2245a4f325f9960b1e732ec (patch) | |
tree | 1f09e017c5205ab833394b7ebe73dd40f31b443d | |
parent | 9fc79b423697825f7afcb4f1143edd3827711c4c (diff) | |
download | gdb-6831f2cd547e6e18b2245a4f325f9960b1e732ec.zip gdb-6831f2cd547e6e18b2245a4f325f9960b1e732ec.tar.gz gdb-6831f2cd547e6e18b2245a4f325f9960b1e732ec.tar.bz2 |
gdb: add value::allocate_register
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
Reviewed-By: John Baldwin <jhb@FreeBSD.org>
-rw-r--r-- | gdb/regcache.c | 7 | ||||
-rw-r--r-- | gdb/value.c | 15 | ||||
-rw-r--r-- | gdb/value.h | 7 |
3 files changed, 24 insertions, 5 deletions
diff --git a/gdb/regcache.c b/gdb/regcache.c index 19ba353..9b3fd4f 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -775,11 +775,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 e9308b0..5e48a4c 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 3f9b35b..2f3b41e 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -159,6 +159,13 @@ public: /* 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, |