2006-04-03 Andrew Stubbs <andrew.stubbs@st.com>

* sh-tdep.c (sh_dwarf2_frame_init_reg): New function.
	(sh_gdbarch_init): Call dwarf2_frame_set_init_reg().
This commit is contained in:
Andrew Stubbs 2006-04-03 14:31:14 +00:00
parent 26d01138dd
commit 357d3800d1
3 changed files with 59 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2006-04-03 Andrew Stubbs <andrew.stubbs@st.com>
* sh-tdep.c (sh_dwarf2_frame_init_reg): New function.
(sh_gdbarch_init): Call dwarf2_frame_set_init_reg().
2006-03-31 Andrew Stubbs <andrew.stubbs@st.com>
* value.h (struct internalvar): Add field 'endian'.

View File

@ -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:

View File

@ -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,