From: Simon Marchi <simon.marchi@efficios.com>
To: gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@efficios.com>
Subject: [PATCH 2/9] gdb: pass frame_info_ptr to gdbarch_value_from_register
Date: Thu, 21 Dec 2023 14:16:23 -0500 [thread overview]
Message-ID: <20231221191716.257256-3-simon.marchi@efficios.com> (raw)
In-Reply-To: <20231221191716.257256-1-simon.marchi@efficios.com>
Pass a frame_info_ptr rather than a frame_id. This avoids having to do
a frame lookup on the callee side, when we can just pass the frame down
directly.
I think this fixes a bug in rs6000-tdep.c where the id of the wrong
frame was set to `VALUE_NEXT_FRAME_ID (v)`.
Change-Id: I77039bc87ea8fc5262f16d0e1446515efa21c565
---
gdb/findvar.c | 24 ++++++++++--------------
gdb/gdbarch-gen.h | 6 +++---
gdb/gdbarch.c | 4 ++--
gdb/gdbarch_components.py | 4 ++--
gdb/rs6000-tdep.c | 16 ++++++++--------
gdb/s390-tdep.c | 10 +++++-----
gdb/value.h | 7 +++----
7 files changed, 33 insertions(+), 38 deletions(-)
diff --git a/gdb/findvar.c b/gdb/findvar.c
index e6dedf0aadf6..25737c4e3159 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -747,23 +747,21 @@ read_var_value (struct symbol *var, const struct block *var_block,
/* Install default attributes for register values. */
-struct value *
-default_value_from_register (struct gdbarch *gdbarch, struct type *type,
- int regnum, struct frame_id frame_id)
+value *
+default_value_from_register (gdbarch *gdbarch, type *type, int regnum,
+ frame_info_ptr this_frame)
{
int len = type->length ();
struct value *value = value::allocate (type);
- frame_info_ptr frame;
-
value->set_lval (lval_register);
- frame = frame_find_by_id (frame_id);
- if (frame == NULL)
- frame_id = null_frame_id;
+ frame_id next_frame_id;
+ if (this_frame == nullptr)
+ next_frame_id = null_frame_id;
else
- frame_id = get_frame_id (get_next_frame_sentinel_okay (frame));
+ next_frame_id = get_frame_id (get_next_frame_sentinel_okay (this_frame));
- VALUE_NEXT_FRAME_ID (value) = frame_id;
+ VALUE_NEXT_FRAME_ID (value) = next_frame_id;
VALUE_REGNUM (value) = regnum;
/* Any structure stored in more than one register will always be
@@ -865,8 +863,7 @@ value_from_register (struct type *type, int regnum, frame_info_ptr frame)
else
{
/* Construct the value. */
- v = gdbarch_value_from_register (gdbarch, type,
- regnum, get_frame_id (frame));
+ v = gdbarch_value_from_register (gdbarch, type, regnum, frame);
/* Get the data. */
read_frame_register_value (v, frame);
@@ -883,7 +880,6 @@ address_from_register (int regnum, frame_info_ptr frame)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
struct type *type = builtin_type (gdbarch)->builtin_data_ptr;
- struct value *value;
CORE_ADDR result;
int regnum_max_excl = gdbarch_num_cooked_regs (gdbarch);
@@ -919,7 +915,7 @@ address_from_register (int regnum, frame_info_ptr frame)
return unpack_long (type, buf);
}
- value = gdbarch_value_from_register (gdbarch, type, regnum, null_frame_id);
+ value *value = gdbarch_value_from_register (gdbarch, type, regnum, nullptr);
read_frame_register_value (value, frame);
if (value->optimized_out ())
diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h
index 80d40136c379..a7761616e032 100644
--- a/gdb/gdbarch-gen.h
+++ b/gdb/gdbarch-gen.h
@@ -422,12 +422,12 @@ extern void gdbarch_value_to_register (struct gdbarch *gdbarch, frame_info_ptr f
extern void set_gdbarch_value_to_register (struct gdbarch *gdbarch, gdbarch_value_to_register_ftype *value_to_register);
/* Construct a value representing the contents of register REGNUM in
- frame FRAME_ID, interpreted as type TYPE. The routine needs to
+ frame THIS_FRAME, interpreted as type TYPE. The routine needs to
allocate and return a struct value with all value attributes
(but not the value contents) filled in. */
-typedef struct value * (gdbarch_value_from_register_ftype) (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id);
-extern struct value * gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id);
+typedef struct value * (gdbarch_value_from_register_ftype) (struct gdbarch *gdbarch, struct type *type, int regnum, frame_info_ptr this_frame);
+extern struct value * gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, frame_info_ptr this_frame);
extern void set_gdbarch_value_from_register (struct gdbarch *gdbarch, gdbarch_value_from_register_ftype *value_from_register);
typedef CORE_ADDR (gdbarch_pointer_to_address_ftype) (struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf);
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index d584305fefb2..6d83e17160e6 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -2557,13 +2557,13 @@ set_gdbarch_value_to_register (struct gdbarch *gdbarch,
}
struct value *
-gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id)
+gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, frame_info_ptr this_frame)
{
gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->value_from_register != NULL);
if (gdbarch_debug >= 2)
gdb_printf (gdb_stdlog, "gdbarch_value_from_register called\n");
- return gdbarch->value_from_register (gdbarch, type, regnum, frame_id);
+ return gdbarch->value_from_register (gdbarch, type, regnum, this_frame);
}
void
diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py
index 4352f7066512..432e4b4ea267 100644
--- a/gdb/gdbarch_components.py
+++ b/gdb/gdbarch_components.py
@@ -814,7 +814,7 @@ Function(
Method(
comment="""
Construct a value representing the contents of register REGNUM in
-frame FRAME_ID, interpreted as type TYPE. The routine needs to
+frame THIS_FRAME, interpreted as type TYPE. The routine needs to
allocate and return a struct value with all value attributes
(but not the value contents) filled in.
""",
@@ -823,7 +823,7 @@ allocate and return a struct value with all value attributes
params=[
("struct type *", "type"),
("int", "regnum"),
- ("struct frame_id", "frame_id"),
+ ("frame_info_ptr", "this_frame"),
],
predefault="default_value_from_register",
invalid=False,
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index a7e0bf5305b5..a0f3d94f3a11 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -2747,9 +2747,9 @@ rs6000_value_to_register (frame_info_ptr frame,
put_frame_register (get_next_frame_sentinel_okay (frame), regnum, to_view);
}
-static struct value *
-rs6000_value_from_register (struct gdbarch *gdbarch, struct type *type,
- int regnum, struct frame_id frame_id)
+static value *
+rs6000_value_from_register (gdbarch *gdbarch, type *type, int regnum,
+ frame_info_ptr this_frame)
{
int len = type->length ();
struct value *value = value::allocate (type);
@@ -2759,14 +2759,14 @@ rs6000_value_from_register (struct gdbarch *gdbarch, struct type *type,
regnum = ieee_128_float_regnum_adjust (gdbarch, type, regnum);
value->set_lval (lval_register);
- frame_info_ptr frame = frame_find_by_id (frame_id);
- if (frame == NULL)
- frame_id = null_frame_id;
+ frame_id next_frame_id;
+ if (this_frame == nullptr)
+ next_frame_id = null_frame_id;
else
- frame_id = get_frame_id (get_next_frame_sentinel_okay (frame));
+ next_frame_id = get_frame_id (get_next_frame_sentinel_okay (this_frame));
- VALUE_NEXT_FRAME_ID (value) = frame_id;
+ VALUE_NEXT_FRAME_ID (value) = next_frame_id;
VALUE_REGNUM (value) = regnum;
/* Any structure stored in more than one register will always be
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index fcba7a1a5608..ebbcbc153fe1 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -1236,13 +1236,13 @@ regnum_is_vxr_full (s390_gdbarch_tdep *tdep, int regnum)
registers, even though we are otherwise a big-endian platform. The
same applies to a 'float' value within a vector. */
-static struct value *
-s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
- int regnum, struct frame_id frame_id)
+static value *
+s390_value_from_register (gdbarch *gdbarch, type *type, int regnum,
+ frame_info_ptr this_frame)
{
s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch);
- struct value *value = default_value_from_register (gdbarch, type,
- regnum, frame_id);
+ value *value
+ = default_value_from_register (gdbarch, type, regnum, this_frame);
check_typedef (type);
if ((regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM
diff --git a/gdb/value.h b/gdb/value.h
index d7bda1e8d2c9..d4244dadb91a 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -1110,10 +1110,9 @@ extern struct value *value_from_contents_and_address
frame_info_ptr frame = nullptr);
extern struct value *value_from_contents (struct type *, const gdb_byte *);
-extern struct value *default_value_from_register (struct gdbarch *gdbarch,
- struct type *type,
- int regnum,
- struct frame_id frame_id);
+extern value *default_value_from_register (gdbarch *gdbarch, type *type,
+ int regnum,
+ frame_info_ptr this_frame);
extern void read_frame_register_value (struct value *value,
frame_info_ptr frame);
--
2.43.0
next prev parent reply other threads:[~2023-12-21 19:17 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-21 19:16 [PATCH 0/9] Some register value cleanups Simon Marchi
2023-12-21 19:16 ` [PATCH 1/9] gdb: don't set frame id after calling cooked_read_value Simon Marchi
2023-12-21 19:16 ` Simon Marchi [this message]
2023-12-22 16:40 ` [PATCH 2/9] gdb: pass frame_info_ptr to gdbarch_value_from_register Tom Tromey
2023-12-22 16:53 ` Simon Marchi
2023-12-22 16:56 ` Tom Tromey
2023-12-21 19:16 ` [PATCH 3/9] gdb: pass non-nullptr frame to gdbarch_value_from_register in address_from_register Simon Marchi
2023-12-21 19:16 ` [PATCH 4/9] gdb: add type parameter to value::allocate_register and add value::allocate_register_lazy Simon Marchi
2023-12-21 19:16 ` [PATCH 5/9] gdb: remove read_frame_register_value's frame parameter Simon Marchi
2023-12-21 19:16 ` [PATCH 6/9] gdb: implement address_from_register using value_from_register Simon Marchi
2023-12-21 19:16 ` [PATCH 7/9] gdb: remove VALUE_NEXT_FRAME_ID, add value::next_frame_id Simon Marchi
2023-12-22 16:51 ` Tom Tromey
2023-12-22 16:56 ` Simon Marchi
2023-12-22 17:02 ` Tom Tromey
2023-12-22 17:06 ` Simon Marchi
2023-12-24 15:35 ` Simon Marchi
2023-12-21 19:16 ` [PATCH 8/9] gdb: remove VALUE_REGNUM, add value::regnum Simon Marchi
2023-12-22 16:52 ` Tom Tromey
2023-12-22 16:57 ` Simon Marchi
2023-12-21 19:16 ` [PATCH 9/9] gdb: make value::allocate_register_lazy store id of next non-inline frame Simon Marchi
2023-12-22 16:53 ` [PATCH 0/9] Some register value cleanups Tom Tromey
2023-12-22 16:58 ` Simon Marchi
2023-12-22 17:02 ` Tom Tromey
2023-12-24 18:28 ` Simon Marchi
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=20231221191716.257256-3-simon.marchi@efficios.com \
--to=simon.marchi@efficios.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).