This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] alpha_register_reggroup_p
- From: Richard Henderson <rth at twiddle dot net>
- To: gdb-patches at sources dot redhat dot com
- Date: Sun, 1 Jun 2003 20:28:21 -0700
- Subject: [RFA] alpha_register_reggroup_p
The main object here is to get the FPCR to be considered
part of the FP state. It's not immediately clear what to
do with the PALcode UNIQ value, but "system" seems a good
choice.
Ok?
r~
* alpha-tdep.c (alpha_register_reggroup_p): New.
(alpha_gdbarch_init): Register it.
--- alpha-tdep.c.11 2003-06-01 20:11:56.000000000 -0700
+++ alpha-tdep.c 2003-06-01 20:15:28.000000000 -0700
@@ -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"
@@ -102,6 +103,39 @@ alpha_register_virtual_type (int regno)
return builtin_type_int64;
}
+/* 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)
{
@@ -1418,6 +1452,8 @@ alpha_gdbarch_init (struct gdbarch_info
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);