This is the mail archive of the gdb-patches@sourceware.org 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]

[Patch, moxie] Handle new prologue sequences


This patch was developed in response to this recent GCC patch:

http://gcc.gnu.org/ml/gcc-patches/2009-09/msg00652.html

The GCC patch modifies moxie function prologues. This patch tweaks the
prologue recognizer accordingly.  I am checking it in.

AG

2009-09-10  Anthony Green  <green@moxielogic.com>

	* moxie-tdep.c (moxie_analyze_prologue): Recognize new prologue
	sequences.


Index: gdb/moxie-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/moxie-tdep.c,v
retrieving revision 1.6
diff -u -r1.6 moxie-tdep.c
--- gdb/moxie-tdep.c	18 Jul 2009 13:52:02 -0000	1.6
+++ gdb/moxie-tdep.c	10 Sep 2009 20:44:43 -0000
@@ -174,23 +174,37 @@
 	  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;



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