diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 72eb419de4..731e9f038c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ Tue Oct 17 10:38:53 1995 Jeffrey A Law (law@cygnus.com) + * hppa-tdep.c (frame_chain): Fix more obscure problems caused + by system calls that core dump processes without saving all + the register state. + * config/pa/hppahpux.mt (XDEPFILES): Remove bogus definition. * config/pa/hppapro.mt (XDEPFILES): Likewise. diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index 3addc58ed9..62531a34f1 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);