2006-04-03 Andrew Stubbs <andrew.stubbs@st.com>
authorAndrew Stubbs <andrew.stubbs@st.com>
Mon, 3 Apr 2006 14:31:14 +0000 (14:31 +0000)
committerAndrew Stubbs <andrew.stubbs@st.com>
Mon, 3 Apr 2006 14:31:14 +0000 (14:31 +0000)
* sh-tdep.c (sh_dwarf2_frame_init_reg): New function.
(sh_gdbarch_init): Call dwarf2_frame_set_init_reg().

gdb/ChangeLog
gdb/sh-tdep.c
gdb/sh-tdep.h

index 2409cac..1af6138 100644 (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'.
index e530893..9f4e3db 100644 (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:
index dd9fee8..6d17ba5 100644 (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,