aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/alpha-tdep.c25
-rw-r--r--gdb/mdebugread.c28
-rw-r--r--gdb/mips-tdep.c20
4 files changed, 54 insertions, 30 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fffe0ad..6c9517d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+Mon Jan 31 09:40:33 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
+
+ * mdebugread.c (parse_procedure): Remove _sigtramp kludges for
+ alpha and irix. The _sigtramp case has to be handled properly
+ in the tdep files if we have no ecoff debugging info.
+ * alpha-tdep.c (alpha_frame_saved_pc, alpha_frame_chain),
+ mips-tdep.c (mips_frame_saved_pc): Handle signal handler frames
+ without PC_REGNUM kludge.
+ * mdebugread.c (fixup_sigtramp), mips-tdep.c (read_next_frame_reg):
+ Clean up handling of mips sigtramp frames, improve comments.
+
Sat Jan 29 23:25:57 1994 Jeffrey A. Law (law@snake.cs.utah.edu)
* paread.c (read_unwind_info): Fix typo.
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index a1b53e6..81061d3 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -1,5 +1,5 @@
/* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
- Copyright 1993 Free Software Foundation, Inc.
+ Copyright 1993, 1994 Free Software Foundation, Inc.
This file is part of GDB.
@@ -165,7 +165,10 @@ alpha_frame_saved_pc(frame)
FRAME frame;
{
alpha_extra_func_info_t proc_desc = frame->proc_desc;
- int pcreg = proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM;
+ /* We have to get the saved pc from the sigcontext
+ if it is a signal handler frame. */
+ int pcreg = frame->signal_handler_caller ? PC_REGNUM
+ : (proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM);
if (proc_desc && PROC_DESC_IS_DUMMY(proc_desc))
return read_memory_integer(frame->frame - 8, 8);
@@ -428,17 +431,23 @@ alpha_frame_chain(frame)
we loop forever if we see a zero size frame. */
if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
&& PROC_FRAME_OFFSET (proc_desc) == 0
- /* The alpha __sigtramp routine is frameless and has a frame size
- of zero. Luckily it is the only procedure which has PC_REGNUM
- as PROC_PC_REG. */
- && PROC_PC_REG (proc_desc) != PC_REGNUM
/* The previous frame from a sigtramp frame might be frameless
and have frame size zero. */
&& !frame->signal_handler_caller)
- return 0;
+ {
+ /* The alpha __sigtramp routine is frameless and has a frame size
+ of zero, but we are able to backtrace through it. */
+ char *name;
+ find_pc_partial_function (saved_pc, &name,
+ (CORE_ADDR *)NULL, (CORE_ADDR *)NULL);
+ if (IN_SIGTRAMP (saved_pc, name))
+ return frame->frame;
+ else
+ return 0;
+ }
else
return read_next_frame_reg(frame, PROC_FRAME_REG(proc_desc))
- + PROC_FRAME_OFFSET(proc_desc);
+ + PROC_FRAME_OFFSET(proc_desc);
}
void
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 352b4c4..ad5d370 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -1,6 +1,6 @@
/* Read a symbol table in ECOFF format (Third-Eye).
- Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993 Free Software
- Foundation, Inc.
+ Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994
+ Free Software Foundation, Inc.
Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
CMU. Major work by Per Bothner, John Gilmore and Ian Lance Taylor
at Cygnus Support.
@@ -1815,14 +1815,6 @@ parse_procedure (pr, search_symtab, first_off)
e->pdr.regmask = 0x80000000;
e->pdr.regoffset = -4;
}
-
- /* Fake PC_REGNUM for alpha __sigtramp so that read_next_frame_reg
- will use the saved user pc from the sigcontext. */
- if (STREQ (sh_name, "__sigtramp"))
- e->pdr.pcreg = PC_REGNUM;
- /* Make the same patch for Irix. */
- if (STREQ (sh_name, "_sigtramp"))
- e->pdr.pcreg = PC_REGNUM;
}
}
@@ -3669,15 +3661,21 @@ fixup_sigtramp ()
xzalloc (sizeof (struct mips_extra_func_info)));
e->numargs = 0; /* the kernel thinks otherwise */
- /* align_longword(sigcontext + SIGFRAME) */
- e->pdr.frameoffset = 0x150;
+ e->pdr.frameoffset = 32;
e->pdr.framereg = SP_REGNUM;
- /* read_next_frame_reg provides the true pc at the time of signal */
+ /* Note that setting pcreg is no longer strictly necessary as
+ mips_frame_saved_pc is now aware of signal handler frames. */
e->pdr.pcreg = PC_REGNUM;
e->pdr.regmask = -2;
- e->pdr.regoffset = -(41 * sizeof (int));
+ /* Offset to saved r31, in the sigtramp case the saved registers
+ are above the frame in the sigcontext.
+ We have 4 alignment bytes, 12 bytes for onstack, mask and pc,
+ 32 * 4 bytes for the general registers, 12 bytes for mdhi, mdlo, ownedfp
+ and 32 * 4 bytes for the floating point registers. */
+ e->pdr.regoffset = 4 + 12 + 31 * 4;
e->pdr.fregmask = -1;
- e->pdr.fregoffset = -(7 * sizeof (int));
+ /* Offset to saved f30 (first saved *double* register). */
+ e->pdr.fregoffset = 4 + 12 + 32 * 4 + 12 + 30 * 4;
e->pdr.isym = (long) s;
e->pdr.adr = sigtramp_address;
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index f8a2732..2bc9a03 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -1,5 +1,6 @@
/* Target-dependent code for the MIPS architecture, for GDB, the GNU Debugger.
- Copyright 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+ Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ Free Software Foundation, Inc.
Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
@@ -76,19 +77,21 @@ read_next_frame_reg(fi, regno)
int regno;
{
/* If it is the frame for sigtramp we have a complete sigcontext
- immediately below the frame and we get the saved registers from there.
+ somewhere above the frame and we get the saved registers from there.
If the stack layout for sigtramp changes we might have to change these
constants and the companion fixup_sigtramp in mdebugread.c */
#ifndef SIGFRAME_BASE
-#define SIGFRAME_BASE 0x12c /* sizeof(sigcontext) */
-#define SIGFRAME_PC_OFF (-SIGFRAME_BASE + 2 * 4)
-#define SIGFRAME_REGSAVE_OFF (-SIGFRAME_BASE + 3 * 4)
+/* To satisfy alignment restrictions the sigcontext is located 4 bytes
+ above the sigtramp frame. */
+#define SIGFRAME_BASE 4
+#define SIGFRAME_PC_OFF (SIGFRAME_BASE + 2 * 4)
+#define SIGFRAME_REGSAVE_OFF (SIGFRAME_BASE + 3 * 4)
#endif
#ifndef SIGFRAME_REG_SIZE
#define SIGFRAME_REG_SIZE 4
#endif
for (; fi; fi = fi->next)
- if (in_sigtramp(fi->pc, 0)) {
+ if (fi->signal_handler_caller) {
int offset;
if (regno == PC_REGNUM) offset = SIGFRAME_PC_OFF;
else if (regno < 32) offset = (SIGFRAME_REGSAVE_OFF
@@ -107,7 +110,10 @@ mips_frame_saved_pc(frame)
FRAME frame;
{
mips_extra_func_info_t proc_desc = frame->proc_desc;
- int pcreg = proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM;
+ /* We have to get the saved pc from the sigcontext
+ if it is a signal handler frame. */
+ int pcreg = frame->signal_handler_caller ? PC_REGNUM
+ : (proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM);
if (proc_desc && PROC_DESC_IS_DUMMY(proc_desc))
return read_memory_integer(frame->frame - 4, 4);