* alpha-tdep.c (alpha_register_reggroup_p): New.
authorRichard Henderson <rth@redhat.com>
Mon, 2 Jun 2003 04:32:19 +0000 (04:32 +0000)
committerRichard Henderson <rth@redhat.com>
Mon, 2 Jun 2003 04:32:19 +0000 (04:32 +0000)
        (alpha_gdbarch_init): Register it.

gdb/ChangeLog
gdb/alpha-tdep.c

index e71e2a2c7093cf80bcd0dd958477c50d7d6ec662..6ad3267ebeb1691ae8bd700cbaefe615bd151a21 100644 (file)
@@ -1,3 +1,8 @@
+2003-06-01  Richard Henderson  <rth@redhat.com>
+
+        * alpha-tdep.c (alpha_register_reggroup_p): New.
+        (alpha_gdbarch_init): Register it.
+
 2003-06-02  Andrew Cagney  <cagney@redhat.com>
 
        * dwarfread.c: Eliminate "register"
index bc4daa272d041f3e38b2c2a8952ea92182ddfd42..53c9f63d192fd50857a68c169c2e53cad7c01738 100644 (file)
@@ -20,6 +20,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "doublest.h"
 #include "frame.h"
 #include "frame-unwind.h"
 #include "frame-base.h"
@@ -34,7 +35,7 @@
 #include "gdb_string.h"
 #include "linespec.h"
 #include "regcache.h"
-#include "doublest.h"
+#include "reggroups.h"
 #include "arch-utils.h"
 #include "osabi.h"
 #include "block.h"
@@ -92,6 +93,39 @@ alpha_register_virtual_type (int regno)
          ? builtin_type_double : builtin_type_long);
 }
 
+/* Is REGNUM a member of REGGROUP?  */
+
+static int
+alpha_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+                          struct reggroup *group)
+{
+  /* Filter out any registers eliminated, but whose regnum is 
+     reserved for backward compatibility, e.g. the vfp.  */
+  if (REGISTER_NAME (regnum) == NULL || *REGISTER_NAME (regnum) == '\0')
+    return 0;
+
+  /* Since we implement no pseudo registers, save/restore is equal to all. */
+  if (group == all_reggroup
+      || group == save_reggroup
+      || group == restore_reggroup)
+    return 1;
+
+  /* All other groups are non-overlapping.  */
+
+  /* Since this is really a PALcode memory slot...  */
+  if (regnum == ALPHA_UNIQUE_REGNUM)
+    return group == system_reggroup;
+
+  /* Force the FPCR to be considered part of the floating point state.  */
+  if (regnum == ALPHA_FPCR_REGNUM)
+    return group == float_reggroup;
+
+  if (regnum >= ALPHA_FP0_REGNUM && regnum < ALPHA_FP0_REGNUM + 31)
+    return group == float_reggroup;
+  else
+    return group == general_reggroup;
+}
+
 static int
 alpha_register_byte (int regno)
 {
@@ -1260,6 +1294,8 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
                                            alpha_register_convert_to_virtual);
   set_gdbarch_register_convert_to_raw (gdbarch, alpha_register_convert_to_raw);
 
+  set_gdbarch_register_reggroup_p (gdbarch, alpha_register_reggroup_p);
+
   /* Prologue heuristics.  */
   set_gdbarch_skip_prologue (gdbarch, alpha_skip_prologue);