This is the mail archive of the gdb-patches@sources.redhat.com 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: RFA: recognize new instructions in rs6000 prologues


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


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