Recognize new moxie prologues
authorAnthony Green <green@redhat.com>
Thu, 10 Sep 2009 21:12:25 +0000 (21:12 +0000)
committerAnthony Green <green@redhat.com>
Thu, 10 Sep 2009 21:12:25 +0000 (21:12 +0000)
gdb/ChangeLog
gdb/moxie-tdep.c

index 3767c4807ec1eca54dd0f0742072a14235f236f2..a1f3d27121a43b10207be37fd68415400fbdbcae 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-10  Anthony Green  <green@moxielogic.com>
+
+       * moxie-tdep.c (moxie_analyze_prologue): Recognize new prologue
+       sequences.
+
 2009-09-10  Michael Snyder  <msnyder@vmware.com>
 
        * remote.c (PACKET_bc, PACKET_bs): New enums.
index 7faa378b5a7ee2ceb04e3e58f74aace963d839b7..80fecf8661ac2a5a6afe492938409f0d99912bd3 100644 (file)
@@ -174,23 +174,37 @@ moxie_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
          cache->saved_regs[regnum] = cache->framesize;
          next_addr += 2;
        }
+    }
 
-      /* Optional stack allocation for args and local vars <= 4
-        byte.  */
-      else if (inst == 0x01f0)           /* ldi.l $r12, X */
-       {
-         offset = read_memory_integer (next_addr + 2, 4, byte_order);
-         inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order);
+  inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
 
-         if (inst2 == 0x051f)           /* add.l $sp, $r12 */
-           {
-             cache->framesize += offset;
-           }
+  /* Optional stack allocation for args and local vars <= 4
+     byte.  */
+  if (inst == 0x0170)           /* ldi.l $r5, X */
+    {
+      offset = read_memory_integer (next_addr + 2, 4, byte_order);
+      inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order);
+      
+      if (inst2 == 0x0517)           /* add.l $sp, $r5 */
+       {
+         cache->framesize += offset;
+       }
+      
+      return (next_addr + 8);
+    }
+  else if ((inst & 0xff00) == 0x91)   /* dec $sp, X */
+    {
+      cache->framesize += (inst & 0x00ff);
+      next_addr += 2;
 
-         return (next_addr + 8);
+      while (next_addr < end_addr)
+       {
+         inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
+         if ((inst & 0xff00) != 0x91) /* no more dec $sp, X */
+           break;
+         cache->framesize += (inst & 0x00ff);
+         next_addr += 2;
        }
-      else  /* This is not a prologue instruction.  */
-       break;
     }
 
   return next_addr;