forked from Imagelibrary/binutils-gdb
gdb
* amd64-tdep.c (amd64_pseudo_register_read_value): Rename from amd64_pseudo_register_read. Change arguments. Call mark_value_bytes_unavailable when needed. (amd64_init_abi): Use set_gdbarch_pseudo_register_read_value, not set_gdbarch_pseudo_register_read. * sentinel-frame.c (sentinel_frame_prev_register): Use regcache_cooked_read_value. * regcache.h (regcache_cooked_read_value): Declare. * regcache.c (regcache_cooked_read_value): New function. (regcache_cooked_read): Call gdbarch_pseudo_register_read_value if available. * i386-tdep.h (i386_pseudo_register_read_value): Declare. (i386_pseudo_register_read): Remove. * i386-tdep.c (i386_pseudo_register_read_into_value): Rename from i386_pseudo_register_read. Change arguments. Call mark_value_bytes_unavailable when needed. (i386_pseudo_register_read_value): New function. (i386_gdbarch_init): Call set_gdbarch_pseudo_register_read_value, not set_gdbarch_pseudo_register_read. * gdbarch.sh (pseudo_register_read_value): New method. * gdbarch.c, gdbarch.h: Rebuild. * findvar.c (value_from_register): Call get_frame_register_value. gdb/testsuite * gdb.dwarf2/typeddwarf.c: XFAIL 'z' on x86-64. * gdb.dwarf2/typeddwarf.exp (xfail-gdb-test): Add arch_pattern argument. * gdb.dwarf2/typeddwarf-amd64.S: New file.
This commit is contained in:
@@ -625,10 +625,11 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
|
||||
struct gdbarch *gdbarch = get_frame_arch (frame);
|
||||
struct type *type1 = check_typedef (type);
|
||||
struct value *v;
|
||||
int optim, unavail, ok;
|
||||
|
||||
if (gdbarch_convert_register_p (gdbarch, regnum, type1))
|
||||
{
|
||||
int optim, unavail, ok;
|
||||
|
||||
/* The ISA/ABI need to something weird when obtaining the
|
||||
specified value from this register. It might need to
|
||||
re-order non-adjacent, starting with REGNUM (see MIPS and
|
||||
@@ -643,26 +644,27 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
|
||||
ok = gdbarch_register_to_value (gdbarch, frame, regnum, type1,
|
||||
value_contents_raw (v), &optim,
|
||||
&unavail);
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
if (optim)
|
||||
set_value_optimized_out (v, 1);
|
||||
if (unavail)
|
||||
mark_value_bytes_unavailable (v, 0, TYPE_LENGTH (type));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = TYPE_LENGTH (type);
|
||||
struct value *v2;
|
||||
|
||||
/* Construct the value. */
|
||||
v = gdbarch_value_from_register (gdbarch, type, regnum, frame);
|
||||
|
||||
/* Get the data. */
|
||||
ok = get_frame_register_bytes (frame, regnum, value_offset (v), len,
|
||||
value_contents_raw (v),
|
||||
&optim, &unavail);
|
||||
}
|
||||
v2 = get_frame_register_value (frame, regnum);
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
if (optim)
|
||||
set_value_optimized_out (v, 1);
|
||||
if (unavail)
|
||||
mark_value_bytes_unavailable (v, 0, TYPE_LENGTH (type));
|
||||
value_contents_copy (v, 0, v2, value_offset (v), len);
|
||||
}
|
||||
|
||||
return v;
|
||||
|
||||
Reference in New Issue
Block a user