2006-01-23 Andrew Stubbs <andrew.stubbs@st.com>
authorAndrew Stubbs <andrew.stubbs@st.com>
Mon, 23 Jan 2006 17:35:22 +0000 (17:35 +0000)
committerAndrew Stubbs <andrew.stubbs@st.com>
Mon, 23 Jan 2006 17:35:22 +0000 (17:35 +0000)
* sh-tdep.c: Include reggroups.h.
(sh_register_reggroup_p): New function.
(sh_gdbarch_init): Add call to set_gdbarch_register_reggroup_p.
* Makefile.in (sh-tdep.o): Add dependency on reggroups.h.

gdb/ChangeLog
gdb/Makefile.in
gdb/sh-tdep.c

index 5f3106a08ecdd5b6b622b4f112744b4fd9461705..609b95e11bae40e012f4b9b42dda7d8a59cf94c6 100644 (file)
@@ -1,3 +1,10 @@
+2006-01-23  Andrew Stubbs  <andrew.stubbs@st.com>
+
+       * sh-tdep.c: Include reggroups.h.
+       (sh_register_reggroup_p): New function.
+       (sh_gdbarch_init): Add call to set_gdbarch_register_reggroup_p.
+       * Makefile.in (sh-tdep.o): Add dependency on reggroups.h.
+
 2006-01-23  Andrew Stubbs  <andrew.stubbs@st.com>
 
        * cli/cli-cmds.c: Include fcntl.h.
index 0afa9b438c48020738165c7d09691647516c0a82..3065685e1874ad0c6a012b61f2235a5d7f288683 100644 (file)
@@ -2538,7 +2538,7 @@ sh-tdep.o: sh-tdep.c $(defs_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
        $(value_h) $(dis_asm_h) $(inferior_h) $(gdb_string_h) \
        $(gdb_assert_h) $(arch_utils_h) $(floatformat_h) $(regcache_h) \
        $(doublest_h) $(osabi_h) $(sh_tdep_h) $(elf_bfd_h) $(solib_svr4_h) \
-       $(elf_sh_h) $(gdb_sim_sh_h)
+       $(elf_sh_h) $(gdb_sim_sh_h) $(reggroups_h)
 sol2-tdep.o: sol2-tdep.c $(defs_h) $(frame_h) $(symtab_h)
 solib-aix5.o: solib-aix5.c $(defs_h) $(gdb_string_h) $(elf_external_h) \
        $(symtab_h) $(bfd_h) $(symfile_h) $(objfiles_h) $(gdbcore_h) \
index 13cae3af3f5c1e6c0d5d32ecb7b624becbd15a49..4bce64ab1dfa33cfbc86e3378ec6aebf3b0347af 100644 (file)
@@ -44,6 +44,7 @@
 #include "regcache.h"
 #include "doublest.h"
 #include "osabi.h"
+#include "reggroups.h"
 
 #include "sh-tdep.h"
 
@@ -1812,6 +1813,47 @@ sh_default_register_type (struct gdbarch *gdbarch, int reg_nr)
   return builtin_type_int;
 }
 
+/* Is a register in a reggroup?
+   The default code in reggroup.c doesn't identify system registers, some
+   float registers or any of the vector registers.
+   TODO: sh2a and dsp registers.  */
+int
+sh_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+                       struct reggroup *reggroup)
+{
+  if (REGISTER_NAME (regnum) == NULL
+      || *REGISTER_NAME (regnum) == '\0')
+    return 0;
+
+  if (reggroup == float_reggroup
+      && (regnum == FPUL_REGNUM
+         || regnum == FPSCR_REGNUM))
+    return 1;
+
+  if (regnum >= FV0_REGNUM && regnum <= FV_LAST_REGNUM)
+    {
+      if (reggroup == vector_reggroup || reggroup == float_reggroup)
+       return 1;
+      if (reggroup == general_reggroup)
+       return 0;
+    }
+
+  if (regnum == VBR_REGNUM
+      || regnum == SR_REGNUM
+      || regnum == FPSCR_REGNUM
+      || regnum == SSR_REGNUM
+      || regnum == SPC_REGNUM)
+    {
+      if (reggroup == system_reggroup)
+       return 1;
+      if (reggroup == general_reggroup)
+       return 0;
+    }
+
+  /* The default code can cope with any other registers.  */
+  return default_register_reggroup_p (gdbarch, regnum, reggroup);
+}
+
 /* On the sh4, the DRi pseudo registers are problematic if the target
    is little endian. When the user writes one of those registers, for
    instance with 'ser var $dr0=1', we want the double to be stored
@@ -2371,6 +2413,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_num_pseudo_regs (gdbarch, 0);
 
   set_gdbarch_register_type (gdbarch, sh_default_register_type);
+  set_gdbarch_register_reggroup_p (gdbarch, sh_register_reggroup_p);
 
   set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);