diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 24 | ||||
-rw-r--r-- | gdb/regcache.c | 28 | ||||
-rw-r--r-- | gdb/reggroups.c | 19 | ||||
-rw-r--r-- | gdb/reggroups.h | 6 |
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); |