* i386-tdep.c (i386_analyze_stack_align): Add handling of two
authorJoel Brobecker <brobecker@gnat.com>
Sun, 31 Dec 2006 14:50:37 +0000 (14:50 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Sun, 31 Dec 2006 14:50:37 +0000 (14:50 +0000)
        other possible code sequences that perform a stack realignment.

gdb/ChangeLog
gdb/i386-tdep.c

index 5bf4c15..675206d 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-31  Joel Brobecker  <brobecker@adacore.com>
+
+       * i386-tdep.c (i386_analyze_stack_align): Add handling of two
+       other possible code sequences that perform a stack realignment.
+
 2006-12-31  Mark Kettenis  <kettenis@gnu.org>
 
        * sparc64-tdep.h (SPARC64_PSTATE_AG, SPARC64_PSTATE_IE) 
index 3099bf8..705e3f3 100644 (file)
@@ -497,15 +497,27 @@ static CORE_ADDR
 i386_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
                          struct i386_frame_cache *cache)
 {
-  static const gdb_byte insns[10] = { 
+  static const gdb_byte insns_ecx[10] = { 
     0x8d, 0x4c, 0x24, 0x04,    /* leal  4(%esp), %ecx */
     0x83, 0xe4, 0xf0,          /* andl  $-16, %esp */
     0xff, 0x71, 0xfc           /* pushl -4(%ecx) */
   };
+  static const gdb_byte insns_edx[10] = { 
+    0x8d, 0x54, 0x24, 0x04,    /* leal  4(%esp), %edx */
+    0x83, 0xe4, 0xf0,          /* andl  $-16, %esp */
+    0xff, 0x72, 0xfc           /* pushl -4(%edx) */
+  };
+  static const gdb_byte insns_eax[10] = { 
+    0x8d, 0x44, 0x24, 0x04,    /* leal  4(%esp), %eax */
+    0x83, 0xe4, 0xf0,          /* andl  $-16, %esp */
+    0xff, 0x70, 0xfc           /* pushl -4(%eax) */
+  };
   gdb_byte buf[10];
 
   if (target_read_memory (pc, buf, sizeof buf)
-      || memcmp (buf, insns, sizeof buf) != 0)
+      || (memcmp (buf, insns_ecx, sizeof buf) != 0
+          && memcmp (buf, insns_edx, sizeof buf) != 0
+          && memcmp (buf, insns_eax, sizeof buf) != 0))
     return pc;
 
   if (current_pc > pc + 4)