mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-29 02:20:51 +00:00
gdb: pass frame_info_ptr to gdbarch_value_from_register
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
This commit is contained in:
committed by
Simon Marchi
parent
6658f874cf
commit
9f02b3a024
@@ -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,
|
||||
const 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 ())
|
||||
|
||||
@@ -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, const frame_info_ptr &this_frame);
|
||||
extern struct value * gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, const 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);
|
||||
|
||||
@@ -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, const 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
|
||||
|
||||
@@ -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"),
|
||||
("const frame_info_ptr &", "this_frame"),
|
||||
],
|
||||
predefault="default_value_from_register",
|
||||
invalid=False,
|
||||
|
||||
@@ -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,
|
||||
const 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
|
||||
|
||||
@@ -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,
|
||||
const 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
|
||||
|
||||
@@ -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,
|
||||
const frame_info_ptr &this_frame);
|
||||
|
||||
extern void read_frame_register_value (struct value *value,
|
||||
frame_info_ptr frame);
|
||||
|
||||
Reference in New Issue
Block a user