From: Jason Thorpe Date: Mon, 22 Apr 2002 19:44:05 +0000 (+0000) Subject: * vax-tdep.c (vax_frame_init_saved_regs): New function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ab62c900e2060381046d1fe998b1516fc81c8072;p=binutils-gdb.git * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 045edf3c09e..e64e6885faa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2002-04-22 Jason Thorpe + + * 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. + 2002-04-22 Jason Thorpe * MAINTAINERS: Reflect that the Alpha target has been multi-arch'd. diff --git a/gdb/config/vax/tm-vax.h b/gdb/config/vax/tm-vax.h index 31acf004351..90819f4d00b 100644 --- a/gdb/config/vax/tm-vax.h +++ b/gdb/config/vax/tm-vax.h @@ -215,30 +215,8 @@ extern int vax_frame_num_args (struct frame_info *fi); #define FRAME_ARGS_SKIP 4 -/* Put here the code to store, into a struct frame_saved_regs, - the addresses of the saved registers of frame described by FRAME_INFO. - This includes special registers such as pc and fp saved in special - ways in the stack frame. sp is even more special: - the address we return for it IS the sp for the next frame. */ - -#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ -{ register int regnum; \ - register int regmask = read_memory_integer ((frame_info)->frame+4, 4) >> 16; \ - register CORE_ADDR next_addr; \ - memset (&frame_saved_regs, '\0', sizeof frame_saved_regs); \ - next_addr = (frame_info)->frame + 16; \ - /* Regmask's low bit is for register 0, \ - which is the first one that would be pushed. */ \ - for (regnum = 0; regnum < 12; regnum++, regmask >>= 1) \ - (frame_saved_regs).regs[regnum] = (regmask & 1) ? (next_addr += 4) : 0; \ - (frame_saved_regs).regs[SP_REGNUM] = next_addr + 4; \ - if (read_memory_integer ((frame_info)->frame + 4, 4) & 0x20000000) \ - (frame_saved_regs).regs[SP_REGNUM] += 4 + 4 * read_memory_integer (next_addr + 4, 4); \ - (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 16; \ - (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame + 12; \ - (frame_saved_regs).regs[AP_REGNUM] = (frame_info)->frame + 8; \ - (frame_saved_regs).regs[PS_REGNUM] = (frame_info)->frame + 4; \ -} +#define FRAME_INIT_SAVED_REGS(fi) vax_frame_init_saved_regs ((fi)) +extern void vax_frame_init_saved_regs (struct frame_info *); /* Things needed for making the inferior call functions. */ 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. */