* 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.
This commit is contained in:
parent
ede7bc1c60
commit
0434c1a0c9
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue