From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31083 invoked by alias); 3 Oct 2012 15:43:42 -0000 Received: (qmail 31070 invoked by uid 22791); 3 Oct 2012 15:43:40 -0000 X-SWARE-Spam-Status: No, hits=-4.0 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RP_MATCHES_RCVD,TW_XF X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Oct 2012 15:43:34 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3) with ESMTP id q93FhVLf031880; Wed, 3 Oct 2012 17:43:31 +0200 (CEST) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3/Submit) id q93FhTPo021324; Wed, 3 Oct 2012 17:43:29 +0200 (CEST) Date: Wed, 03 Oct 2012 15:43:00 -0000 Message-Id: <201210031543.q93FhTPo021324@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: hjl.tools@gmail.com CC: gdb-patches@sourceware.org, mark.kettenis@xs4all.nl In-reply-to: (hjl.tools@gmail.com) Subject: Re: PING: PATCH: PR backtrace/14646: [x32] backtrace doesn't work References: Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-10/txt/msg00039.txt.bz2 > Date: Wed, 3 Oct 2012 08:26:34 -0700 > From: "H.J. Lu" > > On Sun, Sep 30, 2012 at 2:40 PM, H.J. Lu 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 > > > > 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?