diff options
Diffstat (limited to 'gdb/hppa-tdep.c')
-rw-r--r-- | gdb/hppa-tdep.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index 3addc58..62531a3 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -1076,8 +1076,11 @@ frame_chain (frame) /* Abominable hack. */ if (current_target.to_has_execution == 0 - && saved_regs.regs[FLAGS_REGNUM] - && (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) & 0x2)) + && ((saved_regs.regs[FLAGS_REGNUM] + && (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) + & 0x2)) + || (saved_regs.regs[FLAGS_REGNUM] == 0 + && read_register (FLAGS_REGNUM) & 0x2))) { u = find_unwind_entry (FRAME_SAVED_PC (frame)); if (!u) @@ -1091,6 +1094,29 @@ frame_chain (frame) } else { + struct frame_saved_regs saved_regs; + + /* Get the innermost frame. */ + tmp_frame = frame; + while (tmp_frame->next != NULL) + tmp_frame = tmp_frame->next; + + get_frame_saved_regs (tmp_frame, &saved_regs); + /* Abominable hack. See above. */ + if (current_target.to_has_execution == 0 + && ((saved_regs.regs[FLAGS_REGNUM] + && (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) + & 0x2)) + || (saved_regs.regs[FLAGS_REGNUM] == 0 + && read_register (FLAGS_REGNUM) & 0x2))) + { + u = find_unwind_entry (FRAME_SAVED_PC (frame)); + if (!u) + return read_memory_integer (saved_regs.regs[FP_REGNUM], 4); + else + return frame_base - (u->Total_frame_size << 3); + } + /* The value in %r3 was never saved into the stack (thus %r3 still holds the value of the previous frame pointer). */ return read_register (FP_REGNUM); |