diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8de2d8f621..b77cc5e18e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2008-05-21 Ulrich Weigand + + * 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. + 2008-05-21 Markus Deuling * score-tdep.c (score_print_insn): Get the current endianess from diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 9f8db5336f..fc2fe6ac31 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1862,8 +1862,8 @@ alpha-linux-tdep.o: alpha-linux-tdep.c $(defs_h) $(frame_h) $(gdb_assert_h) \ $(regcache_h) $(alpha_tdep_h) alpha-mdebug-tdep.o: alpha-mdebug-tdep.c $(defs_h) $(frame_h) \ $(frame_unwind_h) $(frame_base_h) $(symtab_h) $(gdbcore_h) \ - $(block_h) $(gdb_assert_h) $(gdb_string_h) $(alpha_tdep_h) \ - $(mdebugread_h) + $(block_h) $(gdb_assert_h) $(gdb_string_h) $(trad_frame_h) \ + $(alpha_tdep_h) $(mdebugread_h) alpha-nat.o: alpha-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \ $(gdbcore_h) $(target_h) $(regcache_h) $(alpha_tdep_h) $(gregset_h) alphanbsd-tdep.o: alphanbsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \ diff --git a/gdb/alpha-mdebug-tdep.c b/gdb/alpha-mdebug-tdep.c index 98ae245901..0089561110 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