* x86-64-tdep.c (x86_64_frame_cache): Don't bail out if %rbp is
authorMark Kettenis <kettenis@gnu.org>
Thu, 27 Nov 2003 23:33:07 +0000 (23:33 +0000)
committerMark Kettenis <kettenis@gnu.org>
Thu, 27 Nov 2003 23:33:07 +0000 (23:33 +0000)
zero.  Reorganize code a bit.

gdb/ChangeLog
gdb/x86-64-tdep.c

index 5b7d4d29c386d1800bc4ab1b3f461a741b4b74b1..b1bf8642227b8d1ac474dcacb7568eb31bda9c51 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-28  Mark Kettenis  <kettenis@gnu.org>
+
+       * x86-64-tdep.c (x86_64_frame_cache): Don't bail out if %rbp is
+       zero.  Reorganize code a bit.
+
 2003-11-27  Mark Kettenis  <kettenis@gnu.org>
 
        * dwarf2-frame.c: Fix another comment.
index 59d29f3d828d577e8da7ec8e29eccb13e5441e5d..9c6da6cb90a3c1d942943e9ce580d340634f57ac 100644 (file)
@@ -1061,14 +1061,6 @@ x86_64_frame_cache (struct frame_info *next_frame, void **this_cache)
   cache = x86_64_alloc_frame_cache ();
   *this_cache = cache;
 
-  frame_unwind_register (next_frame, X86_64_RBP_REGNUM, buf);
-  cache->base = extract_unsigned_integer (buf, 8);
-  if (cache->base == 0)
-    return cache;
-
-  /* For normal frames, %rip is stored at 8(%rbp).  */
-  cache->saved_regs[X86_64_RIP_REGNUM] = 8;
-
   cache->pc = frame_func_unwind (next_frame);
   if (cache->pc != 0)
     x86_64_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
@@ -1086,11 +1078,21 @@ x86_64_frame_cache (struct frame_info *next_frame, void **this_cache)
       frame_unwind_register (next_frame, X86_64_RSP_REGNUM, buf);
       cache->base = extract_unsigned_integer (buf, 8) + cache->sp_offset;
     }
+  else
+    {
+      frame_unwind_register (next_frame, X86_64_RBP_REGNUM, buf);
+      cache->base = extract_unsigned_integer (buf, 8);
+    }
 
   /* Now that we have the base address for the stack frame we can
      calculate the value of %rsp in the calling frame.  */
   cache->saved_sp = cache->base + 16;
 
+  /* For normal frames, %rip is stored at 8(%rbp).  If we don't have a
+     frame we find it at the same offset from the reconstructed base
+     address.  */
+  cache->saved_regs[X86_64_RIP_REGNUM] = 8;
+
   /* Adjust all the saved registers such that they contain addresses
      instead of offsets.  */
   for (i = 0; i < X86_64_NUM_SAVED_REGS; i++)