From: Pedro Alves Date: Wed, 27 Nov 2013 17:55:38 +0000 (+0000) Subject: Fix type of not saved registers. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=908fa2aaede2b3d1c33d167116101c2152e30616;p=binutils-gdb.git Fix type of not saved registers. value_of_register_lazy uses the type of REGNUM in FRAME, but given multi-arch, the arch of FRAME might be different from the previous frame's arch, and therefore the type of register REGNUM should be retrieved from the unwound arch. This used to be correct before the previous change. Tested on x86_64 Fedora 17. gdb/ 2013-11-27 Pedro Alves * frame-unwind.c (frame_unwind_got_optimized): Use the type of the register in the previous frame's arch. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a2da98fed4d..00369e98f20 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-11-27 Pedro Alves + + * frame-unwind.c (frame_unwind_got_optimized): Use the type of the + register in the previous frame's arch. + 2013-11-27 Pedro Alves * frame-unwind.c (frame_unwind_got_optimized): Return diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c index 68879f30816..a731b3387c1 100644 --- a/gdb/frame-unwind.c +++ b/gdb/frame-unwind.c @@ -161,11 +161,18 @@ default_frame_unwind_stop_reason (struct frame_info *this_frame, struct value * frame_unwind_got_optimized (struct frame_info *frame, int regnum) { + struct gdbarch *gdbarch = frame_unwind_arch (frame); + struct type *type = register_type (gdbarch, regnum); struct value *val; - val = value_of_register_lazy (frame, regnum); + /* Return an lval_register value, so that we print it as + "". */ + val = allocate_value_lazy (type); set_value_lazy (val, 0); set_value_optimized_out (val, 1); + VALUE_LVAL (val) = lval_register; + VALUE_REGNUM (val) = regnum; + VALUE_FRAME_ID (val) = get_frame_id (frame); return val; }