From 5812b9a12d46d1e3e2818d460e7e52791a678276 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 18 Oct 1995 05:48:23 +0000 Subject: * hppa-tdep.c (frame_chain): Fix more obscure problems caused by system calls that core dump processes without saving all the register state. --- gdb/hppa-tdep.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'gdb/hppa-tdep.c') 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); -- cgit v1.1