* rs6000-tdep.c (skip_prologue): Recognize moves from argument
authorJim Blandy <jimb@codesourcery.com>
Mon, 29 Mar 2004 03:41:56 +0000 (03:41 +0000)
committerJim Blandy <jimb@codesourcery.com>
Mon, 29 Mar 2004 03:41:56 +0000 (03:41 +0000)
registers to temp register r0 and byte stores as prologue
instructions.

gdb/ChangeLog
gdb/rs6000-tdep.c

index 1a85941..77ad9cb 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-28  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.
+
 2004-03-28  Andrew Cagney  <cagney@redhat.com>
 
        * PROBLEMS (Stack backtraces): Rewrite.  Remove reference to
index f19f120..00062da 100644 (file)
@@ -700,6 +700,14 @@ skip_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata)
 
          /* 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;
+        }
       else if ((op & 0xfc1f0003) == 0xf8010000 ||      /* std rx,NUM(r1) */
               (op & 0xfc1f0000) == 0xd8010000 ||       /* stfd Rx,NUM(r1) */
               (op & 0xfc1f0000) == 0xfc010000)         /* frsp, fp?,NUM(r1) */
@@ -709,10 +717,11 @@ skip_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata)
          /* 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) */
+              ((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 */