* i386-tdep.c (i386_analyze_register_saves): Handle register saves
authorMark Kettenis <kettenis@gnu.org>
Sun, 17 Aug 2003 23:16:44 +0000 (23:16 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 17 Aug 2003 23:16:44 +0000 (23:16 +0000)
at the start of a frameless function.  This probably fixes PR
backtrace/1338.

gdb/ChangeLog
gdb/i386-tdep.c

index f8d0e2c787aa076eb1f1294acaee33c66a952d6c..4ac481d4136a2b74de98212d568bc6d4e8393e8b 100644 (file)
@@ -1,3 +1,9 @@
+2003-08-18  Mark Kettenis  <kettenis@gnu.org>
+
+       * i386-tdep.c (i386_analyze_register_saves): Handle register saves
+       at the start of a frameless function.  This probably fixes PR
+       backtrace/1338.
+
 2003-08-17  Michael Chastain  <mec@shout.net>
 
        * symfile.c (find_sym_fns): Remove special case for apollo target.
index 2c7afca7a33dd403a04d984cd81d1691807de41c..9aa20d6e1b8459b5d6d03708c13735b740d094f3 100644 (file)
@@ -571,23 +571,22 @@ static CORE_ADDR
 i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
                             struct i386_frame_cache *cache)
 {
-  if (cache->locals >= 0)
-    {
-      CORE_ADDR offset;
-      unsigned char op;
-      int i;
+  CORE_ADDR offset = 0;
+  unsigned char op;
+  int i;
 
-      offset = - 4 - cache->locals;
-      for (i = 0; i < 8 && pc < current_pc; i++)
-       {
-         op = read_memory_unsigned_integer (pc, 1);
-         if (op < 0x50 || op > 0x57)
-           break;
+  if (cache->locals > 0)
+    offset -= cache->locals;
+  for (i = 0; i < 8 && pc < current_pc; i++)
+    {
+      op = read_memory_unsigned_integer (pc, 1);
+      if (op < 0x50 || op > 0x57)
+       break;
 
-         cache->saved_regs[op - 0x50] = offset;
-         offset -= 4;
-         pc++;
-       }
+      offset -= 4;
+      cache->saved_regs[op - 0x50] = offset;
+      cache->sp_offset += 4;
+      pc++;
     }
 
   return pc;