From 357d3800d1b44c9f090a6799240268840f270d36 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Mon, 3 Apr 2006 14:31:14 +0000 Subject: [PATCH] 2006-04-03 Andrew Stubbs * sh-tdep.c (sh_dwarf2_frame_init_reg): New function. (sh_gdbarch_init): Call dwarf2_frame_set_init_reg(). --- gdb/ChangeLog | 5 +++++ gdb/sh-tdep.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/sh-tdep.h | 1 + 3 files changed, 59 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2409cacf4bc..1af6138442b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2006-04-03 Andrew Stubbs + + * sh-tdep.c (sh_dwarf2_frame_init_reg): New function. + (sh_gdbarch_init): Call dwarf2_frame_set_init_reg(). + 2006-03-31 Andrew Stubbs * value.h (struct internalvar): Add field 'endian'. diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index e530893d19b..9f4e3dbd8a2 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -2114,6 +2114,57 @@ sh_sh2a_register_sim_regno (int nr) return legacy_register_sim_regno (nr); } +/* Set up the register unwinding such that call-clobbered registers are + not displayed in frames >0 because the true value is not certain. + The 'undefined' registers will show up as 'not available' unless the + CFI says otherwise. + + This function is currently set up for SH4 and compatible only. */ + +static void +sh_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, + struct dwarf2_frame_state_reg *reg) +{ + /* Mark the PC as the destination for the return address. */ + if (regnum == PC_REGNUM) + reg->how = DWARF2_FRAME_REG_RA; + + /* Mark the stack pointer as the call frame address. */ + else if (regnum == SP_REGNUM) + reg->how = DWARF2_FRAME_REG_CFA; + + /* The above was taken from the default init_reg in dwarf2-frame.c + while the below is SH specific. */ + + /* Caller save registers. */ + else if ((regnum >= R0_REGNUM && regnum <= R0_REGNUM+7) + || (regnum >= FR0_REGNUM && regnum <= FR0_REGNUM+11) + || (regnum >= DR0_REGNUM && regnum <= DR0_REGNUM+5) + || (regnum >= FV0_REGNUM && regnum <= FV0_REGNUM+2) + || (regnum == MACH_REGNUM) + || (regnum == MACL_REGNUM) + || (regnum == FPUL_REGNUM) + || (regnum == SR_REGNUM)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + + /* Callee save registers. */ + else if ((regnum >= R0_REGNUM+8 && regnum <= R0_REGNUM+15) + || (regnum >= FR0_REGNUM+12 && regnum <= FR0_REGNUM+15) + || (regnum >= DR0_REGNUM+6 && regnum <= DR0_REGNUM+8) + || (regnum == FV0_REGNUM+3)) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Other registers. These are not in the ABI and may or may not + mean anything in frames >0 so don't show them. */ + else if ((regnum >= R0_BANK0_REGNUM && regnum <= R0_BANK0_REGNUM+15) + || (regnum == GBR_REGNUM) + || (regnum == VBR_REGNUM) + || (regnum == FPSCR_REGNUM) + || (regnum == SSR_REGNUM) + || (regnum == SPC_REGNUM)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; +} + static struct sh_frame_cache * sh_alloc_frame_cache (void) { @@ -2492,6 +2543,8 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_in_function_epilogue_p (gdbarch, sh_in_function_epilogue_p); + dwarf2_frame_set_init_reg (gdbarch, sh_dwarf2_frame_init_reg); + switch (info.bfd_arch_info->mach) { case bfd_mach_sh: diff --git a/gdb/sh-tdep.h b/gdb/sh-tdep.h index dd9fee840c1..6d17ba58922 100644 --- a/gdb/sh-tdep.h +++ b/gdb/sh-tdep.h @@ -41,6 +41,7 @@ enum FPUL_REGNUM = 23, /* Floating point registers */ FPSCR_REGNUM = 24, + FR0_REGNUM = 25, FLOAT_ARG0_REGNUM = 29, FLOAT_ARGLAST_REGNUM = 36, FP_LAST_REGNUM = 40, -- 2.30.2