summaryrefslogtreecommitdiff
path: root/gdb/vax-tdep.c
diff options
context:
space:
mode:
authorJason Thorpe <thorpej@netbsd.org>2002-04-22 19:44:05 +0000
committerJason Thorpe <thorpej@netbsd.org>2002-04-22 19:44:05 +0000
commitb9dda99f6b3d929b0e388632e09eb573d3ea98d4 (patch)
tree25bb81137798877d13e10311c882931724352a26 /gdb/vax-tdep.c
parentc38ee272f301cfafa9bb928fd6c5078fa06916c0 (diff)
downloadgdb-b9dda99f6b3d929b0e388632e09eb573d3ea98d4.tar.gz
* vax-tdep.c (vax_frame_init_saved_regs): New function.
* config/vax/tm-vax.h (FRAME_FIND_SAVED_REGS): Remove. (FRAME_INIT_SAVED_REGS): New macro.
Diffstat (limited to 'gdb/vax-tdep.c')
-rw-r--r--gdb/vax-tdep.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/gdb/vax-tdep.c b/gdb/vax-tdep.c
index 053041e7ec6..15cff5506a5 100644
--- a/gdb/vax-tdep.c
+++ b/gdb/vax-tdep.c
@@ -93,6 +93,40 @@ vax_register_virtual_type (int regno)
return (builtin_type_int);
}
+void
+vax_frame_init_saved_regs (struct frame_info *frame)
+{
+ int regnum, regmask;
+ CORE_ADDR next_addr;
+
+ if (frame->saved_regs)
+ return;
+
+ frame_saved_regs_zalloc (frame);
+
+ regmask = read_memory_integer (frame->frame + 4, 4) >> 16;
+
+ next_addr = frame->frame + 16;
+
+ /* regmask's low bit is for register 0, which is the first one
+ what would be pushed. */
+ for (regnum = 0; regnum < AP_REGNUM; regnum++)
+ {
+ if (regmask & (1 << regnum))
+ frame->saved_regs[regnum] = next_addr += 4;
+ }
+
+ frame->saved_regs[SP_REGNUM] = next_addr + 4;
+ if (regmask & (1 << FP_REGNUM))
+ frame->saved_regs[SP_REGNUM] +=
+ 4 + (4 * read_memory_integer (next_addr + 4, 4));
+
+ frame->saved_regs[PC_REGNUM] = frame->frame + 16;
+ frame->saved_regs[FP_REGNUM] = frame->frame + 12;
+ frame->saved_regs[AP_REGNUM] = frame->frame + 8;
+ frame->saved_regs[PS_REGNUM] = frame->frame + 4;
+}
+
/* Advance PC across any function entry prologue instructions
to reach some "real" code. */