This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


> Date: Wed, 3 Oct 2012 08:26:34 -0700
> From: "H.J. Lu" <hjl.tools@gmail.com>
> 
> 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.
> >

There's got to be a better way to handle that.  Did you look into
using dwarf2_frame_set_init_reg() to establish mappings to the "raw"
rip and rsp registers?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]