From 0cd9ab92e5269fb69a286539a19c0d2ef49ad01c Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 21 May 2008 14:47:26 +0000 Subject: * alpha-mdebug-tdep.c: Include "trad-frame.h". (struct alpha_mdebug_unwind_cache): Change type of SAVED_REGS to struct trad_frame_saved_reg *. (alpha_mdebug_frame_unwind_cache): Allocate SAVED_REGS using trad_frame_alloc_saved_regs. Update accesses. Record previous value of SP as being vfp. (alpha_mdebug_frame_prev_register): Use trad_frame_get_prev_register. * Makefile.in (alpha-mdebug-tdep.o): Update dependencies. --- gdb/alpha-mdebug-tdep.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) (limited to 'gdb/alpha-mdebug-tdep.c') diff --git a/gdb/alpha-mdebug-tdep.c b/gdb/alpha-mdebug-tdep.c index 98ae2459012..00895611108 100644 --- a/gdb/alpha-mdebug-tdep.c +++ b/gdb/alpha-mdebug-tdep.c @@ -26,6 +26,7 @@ #include "block.h" #include "gdb_assert.h" #include "gdb_string.h" +#include "trad-frame.h" #include "alpha-tdep.h" #include "mdebugread.h" @@ -170,7 +171,7 @@ struct alpha_mdebug_unwind_cache { struct mdebug_extra_func_info *proc_desc; CORE_ADDR vfp; - CORE_ADDR *saved_regs; + struct trad_frame_saved_reg *saved_regs; }; /* Extract all of the information about the frame from PROC_DESC @@ -201,7 +202,7 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *this_frame, info->proc_desc = proc_desc; gdb_assert (proc_desc != NULL); - info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS); + info->saved_regs = trad_frame_alloc_saved_regs (this_frame); /* The VFP of the frame is at FRAME_REG+FRAME_OFFSET. */ vfp = get_frame_register_unsigned (this_frame, PROC_FRAME_REG (proc_desc)); @@ -221,14 +222,14 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *this_frame, /* Clear bit for RA so we don't save it again later. */ mask &= ~(1 << returnreg); - info->saved_regs[returnreg] = reg_position; + info->saved_regs[returnreg].addr = reg_position; reg_position += 8; } for (ireg = 0; ireg <= 31; ++ireg) if (mask & (1 << ireg)) { - info->saved_regs[ireg] = reg_position; + info->saved_regs[ireg].addr = reg_position; reg_position += 8; } @@ -238,10 +239,15 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *this_frame, for (ireg = 0; ireg <= 31; ++ireg) if (mask & (1 << ireg)) { - info->saved_regs[ALPHA_FP0_REGNUM + ireg] = reg_position; + info->saved_regs[ALPHA_FP0_REGNUM + ireg].addr = reg_position; reg_position += 8; } + /* The stack pointer of the previous frame is computed by popping + the current stack frame. */ + if (!trad_frame_addr_p (info->saved_regs, ALPHA_SP_REGNUM)) + trad_frame_set_value (info->saved_regs, ALPHA_SP_REGNUM, vfp); + return info; } @@ -274,19 +280,7 @@ alpha_mdebug_frame_prev_register (struct frame_info *this_frame, if (regnum == ALPHA_PC_REGNUM) regnum = PROC_PC_REG (info->proc_desc); - /* For all registers known to be saved in the current frame, - do the obvious and pull the value out. */ - if (info->saved_regs[regnum]) - return frame_unwind_got_memory (this_frame, regnum, - info->saved_regs[regnum]); - - /* The stack pointer of the previous frame is computed by popping - the current stack frame. */ - if (regnum == ALPHA_SP_REGNUM) - return frame_unwind_got_constant (this_frame, regnum, info->vfp); - - /* Otherwise assume the next frame has the same register value. */ - return frame_unwind_got_register (this_frame, regnum, regnum); + return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } static int -- cgit v1.2.1