summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2002-09-19 16:49:55 +0000
committerAndrew Cagney <cagney@redhat.com>2002-09-19 16:49:55 +0000
commit9042b9ef4c23e284b31ab541298733679f55f601 (patch)
tree54244263f36b4751e76a968c17b6df48f5243762
parent6e2f20b77871967fc0053abc19f93068fe3f59ba (diff)
downloadgdb-9042b9ef4c23e284b31ab541298733679f55f601.tar.gz
2002-09-13 Andrew Cagney <cagney@redhat.com>
* i386-tdep.c (i386_add_reggroups): Add save_reggroup and restore_reggroup. (i386_register_reggroup_p): Rewrite. Use default_register_reggroup_p. * reggroups.h (save_reggroup, restore_reggroup): Declare. * reggroups.c (save_reggroup, restore_reggroup): Define. (_initialize_reggroup): Add save_reggroup and restore_reggroup to default_groups. * regcache.c (regcache_restore): Restore the registers in restore_reggroup. (regcache_save): Save registers in save_reggroup.
-rw-r--r--gdb/ChangeLog15
-rw-r--r--gdb/i386-tdep.c24
-rw-r--r--gdb/regcache.c28
-rw-r--r--gdb/reggroups.c19
-rw-r--r--gdb/reggroups.h6
5 files changed, 60 insertions, 32 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a7c224bc98d..b9006950ed6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,18 @@
+2002-09-13 Andrew Cagney <cagney@redhat.com>
+
+ * i386-tdep.c (i386_add_reggroups): Add save_reggroup and
+ restore_reggroup.
+ (i386_register_reggroup_p): Rewrite. Use
+ default_register_reggroup_p.
+
+ * reggroups.h (save_reggroup, restore_reggroup): Declare.
+ * reggroups.c (save_reggroup, restore_reggroup): Define.
+ (_initialize_reggroup): Add save_reggroup and restore_reggroup to
+ default_groups.
+ * regcache.c (regcache_restore): Restore the registers in
+ restore_reggroup.
+ (regcache_save): Save registers in save_reggroup.
+
2002-08-28 Andrew Cagney <cagney@redhat.com>
* osabi.c (gdbarch_init_osabi): Allow a NULL abfd.
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 73cc6d56190..03a8ce9d645 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1435,6 +1435,8 @@ i386_add_reggroups (struct gdbarch *gdbarch)
reggroup_add (gdbarch, general_reggroup);
reggroup_add (gdbarch, float_reggroup);
reggroup_add (gdbarch, all_reggroup);
+ reggroup_add (gdbarch, save_reggroup);
+ reggroup_add (gdbarch, restore_reggroup);
reggroup_add (gdbarch, vector_reggroup);
reggroup_add (gdbarch, system_reggroup);
}
@@ -1443,17 +1445,21 @@ int
i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
struct reggroup *group)
{
- if (group == all_reggroup)
- return 1;
- if (mmx_regnum_p (regnum))
- return (group == i368_mmx_reggroup || group == vector_reggroup);
- if (FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum))
- return (group == float_reggroup || group == all_reggroup);
- if (SSE_REGNUM_P (regnum) || regnum == MXCSR_REGNUM)
- return (group == i368_sse_reggroup || group == vector_reggroup);
+ int sse_regnum_p = SSE_REGNUM_P (regnum) || regnum == MXCSR_REGNUM;
+ int fp_regnum_p = FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum);
+ if (group == i368_mmx_reggroup)
+ return mmx_regnum_p (regnum);
+ if (group == i368_sse_reggroup)
+ return sse_regnum_p;
+ if (group == vector_reggroup)
+ return (mmx_regnum_p (regnum) || sse_regnum_p);
+ if (group == float_reggroup)
+ return (FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum));
if (group == general_reggroup)
return 1;
- return 0;
+ if (group == save_reggroup || group == restore_reggroup)
+ return (regnum < NUM_REGS);
+ return default_register_reggroup_p (gdbarch, regnum, group);
}
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 3c1e5f176a3..620ad76d27f 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -337,14 +337,15 @@ regcache_save (struct regcache *dst, struct regcache *src)
memset (dst->registers, 0, dst->descr->sizeof_registers);
memset (dst->register_valid_p, 0, dst->descr->sizeof_register_valid_p);
/* Copy over any relevant registers. */
- for (regnum = gdbarch_next_cooked_register_to_save (gdbarch, -1);
- regnum >= 0;
- regnum = gdbarch_next_cooked_register_to_save (gdbarch, regnum))
+ for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
{
- regcache_cooked_read (src, regnum, buf);
- memcpy (dst->registers + dst->descr->register_offset[regnum],
- buf, dst->descr->sizeof_register[regnum]);
- dst->register_valid_p[regnum] = 1;
+ if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
+ {
+ regcache_cooked_read (src, regnum, buf);
+ memcpy (dst->registers + dst->descr->register_offset[regnum],
+ buf, dst->descr->sizeof_register[regnum]);
+ dst->register_valid_p[regnum] = 1;
+ }
}
}
@@ -357,13 +358,14 @@ regcache_restore (struct regcache *dst, struct regcache *src)
gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
gdb_assert (!dst->readonly_p);
/* Copy over any relevant registers. */
- for (regnum = gdbarch_next_cooked_register_to_restore (gdbarch, -1);
- regnum >= 0;
- regnum = gdbarch_next_cooked_register_to_restore (gdbarch, regnum))
+ for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
{
- memcpy (buf, src->registers + src->descr->register_offset[regnum],
- src->descr->sizeof_register[regnum]);
- regcache_cooked_write (dst, regnum, buf);
+ if (gdbarch_register_reggroup_p (gdbarch, regnum, restore_reggroup))
+ {
+ memcpy (buf, src->registers + src->descr->register_offset[regnum],
+ src->descr->sizeof_register[regnum]);
+ regcache_cooked_write (dst, regnum, buf);
+ }
}
}
diff --git a/gdb/reggroups.c b/gdb/reggroups.c
index 09b0c930c82..0d815b7dfa1 100644
--- a/gdb/reggroups.c
+++ b/gdb/reggroups.c
@@ -131,6 +131,7 @@ default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
{
int vector_p;
int float_p;
+ int raw_p;
if (REGISTER_NAME (regnum) == NULL
|| *REGISTER_NAME (regnum) == '\0')
return 0;
@@ -138,12 +139,15 @@ default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
return 1;
vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
+ raw_p = regnum < gdbarch_num_regs (gdbarch);
if (group == float_reggroup)
return float_p;
if (group == vector_reggroup)
return vector_p;
if (group == general_reggroup)
return (!vector_p && !float_p);
+ if (group == save_reggroup || group == restore_reggroup)
+ return raw_p;
return 0;
}
@@ -156,27 +160,22 @@ struct reggroup float_group = { "float" };
struct reggroup system_group = { "system" };
struct reggroup vector_group = { "vector" };
struct reggroup all_group = { "all" };
+struct reggroup save_group = { "save" };
+struct reggroup restore_group = { "restore" };
struct reggroup *const general_reggroup = &general_group;
struct reggroup *const float_reggroup = &float_group;
struct reggroup *const system_reggroup = &system_group;
struct reggroup *const vector_reggroup = &vector_group;
struct reggroup *const all_reggroup = &all_group;
+struct reggroup *const save_reggroup = &save_group;
+struct reggroup *const restore_reggroup = &restore_group;
void
_initialize_reggroup (void)
{
reggroups_data = register_gdbarch_data (reggroups_init, reggroups_free);
-#if 0
- /* The pre-defined groups. */
- general_reggroup = reggroup_new ("general");
- float_reggroup = reggroup_new ("float");
- system_reggroup = reggroup_new ("system");
- vector_reggroup = reggroup_new ("vector");
- all_reggroup = reggroup_new ("all");
-#endif
-
/* The pre-defined list of groups. */
default_groups = reggroups_init (NULL);
add_group (default_groups, general_reggroup);
@@ -184,4 +183,6 @@ _initialize_reggroup (void)
add_group (default_groups, system_reggroup);
add_group (default_groups, vector_reggroup);
add_group (default_groups, all_reggroup);
+ add_group (default_groups, save_reggroup);
+ add_group (default_groups, restore_reggroup);
}
diff --git a/gdb/reggroups.h b/gdb/reggroups.h
index cae851ca51f..6d517a6251b 100644
--- a/gdb/reggroups.h
+++ b/gdb/reggroups.h
@@ -27,13 +27,17 @@
struct gdbarch;
struct reggroup;
-/* Pre-defined register groups. */
+/* Pre-defined, user visible, register groups. */
extern struct reggroup *const general_reggroup;
extern struct reggroup *const float_reggroup;
extern struct reggroup *const system_reggroup;
extern struct reggroup *const vector_reggroup;
extern struct reggroup *const all_reggroup;
+/* Pre-defined, internal, register groups. */
+extern struct reggroup *const save_reggroup;
+extern struct reggroup *const restore_reggroup;
+
/* Create a new local register group. */
extern struct reggroup *reggroup_new (const char *name);