This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: RFA: recognize new instructions in rs6000 prologues
- From: Kevin Buettner <kevinb at redhat dot com>
- To: Jim Blandy <jimb at redhat dot com>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Thu, 25 Mar 2004 22:16:48 -0700
- Subject: Re: RFA: recognize new instructions in rs6000 prologues
- Organization: Red Hat
- References: <vt2hdwexovn.fsf@zenia.home>
On 24 Mar 2004 10:10:04 -0500
Jim Blandy <jimb@redhat.com> wrote:
>
> These prologues are generated by a not-yet-released compiler, but the
> test suite does catch the problem.
>
> 2004-02-25 Jim Blandy <jimb@redhat.com>
>
> * rs6000-tdep.c (skip_prologue): Recognize moves from argument
> registers to temp register r0 and byte stores as prologue
> instructions.
>
> *** gdb/rs6000-tdep.c.~2~ 2004-02-25 15:14:13.000000000 -0500
> --- gdb/rs6000-tdep.c 2004-02-25 15:15:43.000000000 -0500
> ***************
> *** 772,777 ****
> --- 772,785 ----
>
> /* store parameters in stack */
> }
> + /* Move parameters from argument registers to temporary register. */
> + else if ((op & 0xfc0007fe) == 0x7c000378 && /* mr(.) Rx,Ry */
> + (((op >> 21) & 31) >= 3) && /* R3 >= Ry >= R10 */
> + (((op >> 21) & 31) <= 10) &&
> + (((op >> 16) & 31) == 0)) /* Rx: scratch register r0 */
> + {
> + continue;
> + }
Is this case really needed? I would have thought that the catchall
case at the end would handle this situation. I'm concerned that
adding this case may cause us to overshoot the prologue in some
circumstances. (Of course, there's a danger of doing that anyway...)
> else if ((op & 0xfc1f0003) == 0xf8010000 || /* std rx,NUM(r1) */
> (op & 0xfc1f0000) == 0xd8010000 || /* stfd Rx,NUM(r1) */
> (op & 0xfc1f0000) == 0xfc010000) /* frsp, fp?,NUM(r1) */
> ***************
> *** 781,790 ****
> /* store parameters in stack via frame pointer */
> }
> else if (framep &&
> ! ((op & 0xfc1f0000) == 0x901f0000 || /* st rx,NUM(r1) */
> ! (op & 0xfc1f0000) == 0xd81f0000 || /* stfd Rx,NUM(r1) */
> ! (op & 0xfc1f0000) == 0xfc1f0000))
> ! { /* frsp, fp?,NUM(r1) */
> continue;
>
> /* Set up frame pointer */
> --- 789,799 ----
> /* store parameters in stack via frame pointer */
> }
> else if (framep &&
> ! ((op & 0xfc1f0000) == 0x901f0000 || /* st rx,NUM(r31) */
> ! (op & 0xfc1f0000) == 0x981f0000 || /* stb Rx,NUM(r31) */
> ! (op & 0xfc1f0000) == 0xd81f0000 || /* stfd Rx,NUM(r31) */
> ! (op & 0xfc1f0000) == 0xfc1f0000)) /* frsp, fp?,NUM(r31) */
> ! {
> continue;
>
> /* Set up frame pointer */
This part is okay.
Kevin