aboutsummaryrefslogtreecommitdiff
path: root/gdb/x86-64-tdep.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-11-27 23:33:07 +0000
committerMark Kettenis <kettenis@gnu.org>2003-11-27 23:33:07 +0000
commit35883a3f2ffd78d7d2f023258b0144ae692485d0 (patch)
treeb5bf2d058e85509921400531cb88bf155e669cd5 /gdb/x86-64-tdep.c
parentfdec90e86d8640891d303320034b973e9a6a0a0c (diff)
downloadgdb-35883a3f2ffd78d7d2f023258b0144ae692485d0.zip
gdb-35883a3f2ffd78d7d2f023258b0144ae692485d0.tar.gz
gdb-35883a3f2ffd78d7d2f023258b0144ae692485d0.tar.bz2
* x86-64-tdep.c (x86_64_frame_cache): Don't bail out if %rbp is
zero. Reorganize code a bit.
Diffstat (limited to 'gdb/x86-64-tdep.c')
-rw-r--r--gdb/x86-64-tdep.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/gdb/x86-64-tdep.c b/gdb/x86-64-tdep.c
index 59d29f3..9c6da6c 100644
--- a/gdb/x86-64-tdep.c
+++ b/gdb/x86-64-tdep.c
@@ -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++)