PING: PATCH: PR backtrace/14646: [x32] backtrace doesn't work

H.J. Lu
2012-10-03T15:26:41Z

On Sun, Sep 30, 2012 at 2:40 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> Hi,
>
> amd64_x32_init_abi has
>
> tdep->sp_regnum_from_eax = AMD64_RSP_REGNUM;
> tdep->pc_regnum_from_eax = AMD64_RIP_REGNUM;
>
> But unwind frame info is based on the real RSP/RIP
> registers. Pseudo sp/pc registers don't work with
> frame related codes:
>
> [hjl@gnu-tools-1 gdb]$ egrep "pc_regnum|sp_regnum" *fram*.c
> dwarf2-frame.c: if (regnum == gdbarch_pc_regnum (gdbarch))
> dwarf2-frame.c: else if (regnum == gdbarch_sp_regnum (gdbarch))
> dwarf2-frame.c: == gdbarch_sp_regnum (gdbarch)))
> dwarf2-frame-tailcall.c: if (regnum == gdbarch_pc_regnum
> (this_gdbarch))
> dwarf2-frame-tailcall.c: else if (cache->prev_sp_p && regnum ==
> gdbarch_sp_regnum (this_gdbarch))
> dwarf2-frame-tailcall.c: int sp_regnum;
> dwarf2-frame-tailcall.c: sp_regnum = gdbarch_sp_regnum
> (prev_gdbarch);
> dwarf2-frame-tailcall.c: if (sp_regnum == -1)
> dwarf2-frame-tailcall.c: prev_sp = frame_unwind_register_unsigned
> (this_frame, sp_regnum);
> frame.c: && gdbarch_pc_regnum (gdbarch) >= 0
> frame.c: gdbarch_pc_regnum (gdbarch),
> frame.c: gdbarch_pc_regnum (gdbarch),
> frame.c: the gdbarch_sp_regnum register is meaningful. */
> frame.c: if (gdbarch_sp_regnum (gdbarch) >= 0)
> frame.c: gdbarch_sp_regnum (gdbarch));
> [hjl@gnu-tools-1 gdb]$
>
> It is nice to print
>
> (gdb) p $sp
> $1 = (void *) 0xffffd028
>
> instead of
>
> (gdb) p $sp
> $1 = 4294955048
>
> But it breaks frame unwind. This patch removes pseudo sp/pc regnum from
> x32. "p $sp" and "p $pc" will print 64bit integers. But "p $esp" and
> "p $esp" work fine. OK for trunk and 4.5 branch?
>
> Thanks.
>
>
> H.J.
> ---
> 2012-09-30 H.J. Lu <hongjiu.lu@intel.com>
>
> PR backtrace/14646
> PR gdb/14647
> * i386-tdep.h (gdbarch_tdep): Remove sp_regnum_from_eax and
> pc_regnum_from_eax.
> * i386-tdep.c (i386_gdbarch_init): Don't use sp_regnum_from_eax
> nor pc_regnum_from_eax.
> * amd64-tdep.c (amd64_x32_init_abi): Don't set sp_regnum_from_eax
> nor pc_regnum_from_eax.
>

PING.

--
H.J.