From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20924 invoked by alias); 29 Jun 2006 10:51:21 -0000 Received: (qmail 20875 invoked by uid 22791); 29 Jun 2006 10:51:21 -0000 X-Spam-Check-By: sourceware.org Received: from aquarius.hirmke.de (HELO calimero.vinschen.de) (217.91.18.234) by sourceware.org (qpsmtpd/0.31.1) with ESMTP; Thu, 29 Jun 2006 10:51:19 +0000 Received: by calimero.vinschen.de (Postfix, from userid 500) id D04B2544001; Thu, 29 Jun 2006 12:51:16 +0200 (CEST) Date: Thu, 29 Jun 2006 10:51:00 -0000 From: Corinna Vinschen To: gdb-patches@sourceware.org Subject: Re: [PATCH] m32c-tdep.c: Add virtual_frame_pointer function Message-ID: <20060629105116.GD18873@calimero.vinschen.de> Reply-To: gdb-patches@sourceware.org Mail-Followup-To: gdb-patches@sourceware.org References: <20060628132918.GD24606@calimero.vinschen.de> <200606282129.k5SLTfc8004816@elgar.sibelius.xs4all.nl> <20060629023405.GA32465@nevyn.them.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060629023405.GA32465@nevyn.them.org> User-Agent: Mutt/1.4.2i X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-06/txt/msg00401.txt.bz2 On Jun 28 22:34, Daniel Jacobowitz wrote: > On Wed, Jun 28, 2006 at 11:29:41PM +0200, Mark Kettenis wrote: > > > Date: Wed, 28 Jun 2006 15:29:18 +0200 > > > From: Corinna Vinschen > > > > > > the below patch adds a virtual_frame_pointer function to m32c-tdep.c, > > > to avoid that legacy_virtual_frame_pointer is called from tracepoint.c, > > > [...] > > > > You probably should change legacy_virtual_frame_pointer to check for > > SP_REGNUM < NUM_REGS + NUM_PSEUDO_REGS instead. > > Neither, I don't think! Did this just turn up in a testsuite run, or > did you actually try it with tracepoints, Corinna? It fixed the testsuite run. I assumed that the gdb.trace testsuite is testing..., well, tracepoints. > The assertion seems correct to me. The frame register number is going > to get sent to the remote target system. We shouldn't ever do that for > pseudo registers, because the target probably doesn't know how to > generate their contents... otherwise they'd be real registers. I see the point. I rewrote the m32c_virtual_frame_pointer function to return a valid register/offset pair from the banked fb resp. sp registers. Does that look ok? Corinna * m32c-tdep.c (m32c_banked_register): New function. (m32c_banked_read): Use m32c_banked_register function to evaluate real register number. (m32c_banked_write): Ditto. (m32c_virtual_frame_pointer): New function. (m32c_gdbarch_init): Add set_gdbarch_virtual_frame_pointer call. Index: m32c-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/m32c-tdep.c,v retrieving revision 1.1 diff -u -p -r1.1 m32c-tdep.c --- m32c-tdep.c 20 Apr 2006 23:18:48 -0000 1.1 +++ m32c-tdep.c 29 Jun 2006 10:46:38 -0000 @@ -340,6 +340,13 @@ m32c_read_flg (struct regcache *cache) } +/* Evaluate the real register number of a banked register. */ +m32c_banked_register (struct m32c_reg *reg, struct regcache *cache) +{ + return ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx); +} + + /* Move the value of a banked register from CACHE to BUF. If the value of the 'flg' register in CACHE has any of the bits masked in REG->n set, then read REG->ry. Otherwise, read @@ -347,8 +354,7 @@ m32c_read_flg (struct regcache *cache) static void m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf) { - struct m32c_reg *bank_reg - = ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx); + struct m32c_reg *bank_reg = m32c_banked_register (reg, cache); regcache_raw_read (cache, bank_reg->num, buf); } @@ -360,8 +366,7 @@ m32c_banked_read (struct m32c_reg *reg, static void m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, void *buf) { - struct m32c_reg *bank_reg - = ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx); + struct m32c_reg *bank_reg = m32c_banked_register (reg, cache); regcache_raw_write (cache, bank_reg->num, (const void *) buf); } @@ -2475,6 +2480,40 @@ m32c_m16c_pointer_to_address (struct typ return ptr; } +void +m32c_virtual_frame_pointer (CORE_ADDR pc, + int *frame_regnum, + LONGEST *frame_offset) +{ + char *name; + CORE_ADDR func_addr, func_end, sal_end; + struct m32c_prologue p; + + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + if (!find_pc_partial_function (pc, &name, &func_addr, &func_end)) + internal_error (__FILE__, __LINE__, _("No virtual frame pointer available")); + + m32c_analyze_prologue (current_gdbarch, func_addr, pc, &p); + switch (p.kind) + { + case prologue_with_frame_ptr: + *frame_regnum = m32c_banked_register (tdep->fb, current_regcache)->num; + *frame_offset = p.frame_ptr_offset; + break; + case prologue_sans_frame_ptr: + *frame_regnum = m32c_banked_register (tdep->sp, current_regcache)->num; + *frame_offset = p.frame_size; + break; + default: + *frame_regnum = m32c_banked_register (tdep->sp, current_regcache)->num; + *frame_offset = 0; + break; + } + /* Sanity check */ + if (*frame_regnum > NUM_REGS) + internal_error (__FILE__, __LINE__, _("No virtual frame pointer available")); +} /* Initialization. */ @@ -2539,6 +2578,8 @@ m32c_gdbarch_init (struct gdbarch_info i /* Trampolines. */ set_gdbarch_skip_trampoline_code (arch, m32c_skip_trampoline_code); + set_gdbarch_virtual_frame_pointer (arch, m32c_virtual_frame_pointer); + return arch; } -- Corinna Vinschen Cygwin Project Co-Leader Red Hat