aboutsummaryrefslogtreecommitdiff
path: root/gdb/alpha-tdep.c
diff options
context:
space:
mode:
authorPeter Schauer <Peter.Schauer@mytum.de>1995-07-29 08:50:00 +0000
committerPeter Schauer <Peter.Schauer@mytum.de>1995-07-29 08:50:00 +0000
commite4dbd248df205219ec934f2b9d00f11f5a192913 (patch)
tree92dc322c1892f78587e1547f031359dc35bf5c28 /gdb/alpha-tdep.c
parentac72325fa892015a2ef5a104290f78f73e667c06 (diff)
downloadfsf-binutils-gdb-e4dbd248df205219ec934f2b9d00f11f5a192913.zip
fsf-binutils-gdb-e4dbd248df205219ec934f2b9d00f11f5a192913.tar.gz
fsf-binutils-gdb-e4dbd248df205219ec934f2b9d00f11f5a192913.tar.bz2
* alpha-tdep.c: Move sigtramp handling of saved registers from
read_next_frame_reg to alpha_find_saved_regs, handle saved floating point registers. * mips-tdep.c: Move sigtramp handling of saved registers from read_next_frame_reg to mips_find_saved_regs, handle saved floating point registers. * config/mips/tm-irix3.h, config/mips/tm-irix5.h, config/mips/tm-mipsv4.h (SIGFRAME_FPREGSAVE_OFF): Define. * sparc-tdep.c (sparc_pc_adjust): Fix check for `unimp' instruction to handle functions returning structures with large sizes properly.
Diffstat (limited to 'gdb/alpha-tdep.c')
-rw-r--r--gdb/alpha-tdep.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index 10a8d53..fd752f6 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -149,6 +149,40 @@ alpha_find_saved_regs (frame)
obstack_alloc (&frame_cache_obstack, sizeof(struct frame_saved_regs));
memset (frame->saved_regs, 0, sizeof (struct frame_saved_regs));
+ /* If it is the frame for __sigtramp, the saved registers are located
+ in a sigcontext structure somewhere on the stack. __sigtramp
+ passes a pointer to the sigcontext structure on the stack.
+ If the stack layout for __sigtramp changes, or if sigcontext offsets
+ change, we might have to update this code. */
+#ifndef SIGFRAME_PC_OFF
+#define SIGFRAME_PC_OFF (2 * 8)
+#define SIGFRAME_REGSAVE_OFF (4 * 8)
+#define SIGFRAME_FPREGSAVE_OFF (SIGFRAME_REGSAVE_OFF + 32 * 8 + 8)
+#endif
+ if (frame->signal_handler_caller)
+ {
+ CORE_ADDR sigcontext_pointer_addr;
+ CORE_ADDR sigcontext_addr;
+
+ if (frame->next)
+ sigcontext_pointer_addr = frame->next->frame;
+ else
+ sigcontext_pointer_addr = frame->frame;
+ sigcontext_addr = read_memory_integer(sigcontext_pointer_addr, 8);
+ for (ireg = 0; ireg < 32; ireg++)
+ {
+ reg_position = sigcontext_addr + SIGFRAME_REGSAVE_OFF + ireg * 8;
+ frame->saved_regs->regs[ireg] = reg_position;
+ }
+ for (ireg = 0; ireg < 32; ireg++)
+ {
+ reg_position = sigcontext_addr + SIGFRAME_FPREGSAVE_OFF + ireg * 8;
+ frame->saved_regs->regs[FP0_REGNUM + ireg] = reg_position;
+ }
+ frame->saved_regs->regs[PC_REGNUM] = sigcontext_addr + SIGFRAME_PC_OFF;
+ return;
+ }
+
proc_desc = frame->proc_desc;
if (proc_desc == NULL)
/* I'm not sure how/whether this can happen. Normally when we can't
@@ -164,7 +198,7 @@ alpha_find_saved_regs (frame)
returnreg = PROC_PC_REG (proc_desc);
- /* Note that RA is always saved first, regardless of it's actual
+ /* Note that RA is always saved first, regardless of its actual
register number. */
if (mask & (1 << returnreg))
{
@@ -202,30 +236,11 @@ read_next_frame_reg(fi, regno)
struct frame_info *fi;
int regno;
{
- /* If it is the frame for sigtramp we have a pointer to the sigcontext
- on the stack.
- If the stack layout for __sigtramp changes or if sigcontext offsets
- change we might have to update this code. */
-#ifndef SIGFRAME_PC_OFF
-#define SIGFRAME_PC_OFF (2 * 8)
-#define SIGFRAME_REGSAVE_OFF (4 * 8)
-#endif
for (; fi; fi = fi->next)
{
- if (fi->signal_handler_caller)
- {
- int offset;
- CORE_ADDR sigcontext_addr = read_memory_integer(fi->frame, 8);
-
- if (regno == PC_REGNUM)
- offset = SIGFRAME_PC_OFF;
- else if (regno < 32)
- offset = SIGFRAME_REGSAVE_OFF + regno * 8;
- else
- return 0;
- return read_memory_integer(sigcontext_addr + offset, 8);
- }
- else if (regno == SP_REGNUM)
+ /* We have to get the saved sp from the sigcontext
+ if it is a signal handler frame. */
+ if (regno == SP_REGNUM && !fi->signal_handler_caller)
return fi->frame;
else
{