* Makefile.in (mips-tdep.o): Update.

* mips-tdep.c (struct register_alias, mips_o32_aliases)
	(mips_n32_n64_aliases, mips_register_aliases): New.
	(mips_register_name): Call tdesc_register_name.
	(mips_tdesc_register_reggroup_p): New.
	(mips_pseudo_register_type, value_of_mips_user_reg): New.
	(mips_gdbarch_init): Add target-described register support.
	Register aliases for register names.
	* target-descriptions.c (tdesc_register_name): Make global.
	(tdesc_register_in_reggroup_p): New function, broken out from
	tdesc_register_reggroup_p.
	(tdesc_register_reggroup_p): Use it.
	* target-descriptions.h (tdesc_register_name)
	(tdesc_register_in_reggroup_p): New prototypes.
	* NEWS: Correct formatting.  Mention MIPS register support.
	* features/mips-cp0.xml, features/mips-fpu.xml,
	features/mips64-cp0.xml, gdb/features/mips64-fpu.xml, mips-cpu.xml,
	features/mips64-cpu.xml: New files.

	* gdb.xml/tdesc-regs.exp: Add MIPS support.  Allow multiple
	required features to be included.

	* gdb.texinfo (MIPS Features): New subsection.
This commit is contained in:
Daniel Jacobowitz
2007-06-13 18:27:00 +00:00
parent 17a912b682
commit f8b73d13b7
16 changed files with 627 additions and 27 deletions

View File

@ -486,7 +486,10 @@ tdesc_find_register (struct gdbarch *gdbarch, int regno)
return NULL;
}
static const char *
/* Return the name of register REGNO, from the target description or
from an architecture-provided pseudo_register_name method. */
const char *
tdesc_register_name (int regno)
{
struct tdesc_reg *reg = tdesc_find_register (current_gdbarch, regno);
@ -582,8 +585,9 @@ tdesc_remote_register_number (struct gdbarch *gdbarch, int regno)
/* Check whether REGNUM is a member of REGGROUP. Registers from the
target description may be classified as general, float, or vector.
Registers with no group specified go to the default reggroup
function and are handled by type.
Unlike a gdbarch register_reggroup_p method, this function will
return -1 if it does not know; the caller should handle registers
with no specified group.
Arbitrary strings (other than "general", "float", and "vector")
from the description are not used; they cause the register to be
@ -594,21 +598,12 @@ tdesc_remote_register_number (struct gdbarch *gdbarch, int regno)
The save-restore flag is also implemented here. */
static int
tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno,
struct reggroup *reggroup)
int
tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
struct reggroup *reggroup)
{
int num_regs = gdbarch_num_regs (gdbarch);
int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
if (reg == NULL && regno >= num_regs && regno < num_regs + num_pseudo_regs)
{
struct tdesc_arch_data *data = gdbarch_data (gdbarch, tdesc_data);
gdb_assert (data->pseudo_register_reggroup_p != NULL);
return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup);
}
if (reg != NULL && reg->group != NULL)
{
int general_p = 0, float_p = 0, vector_p = 0;
@ -634,6 +629,32 @@ tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno,
&& (reggroup == save_reggroup || reggroup == restore_reggroup))
return reg->save_restore;
return -1;
}
/* Check whether REGNUM is a member of REGGROUP. Registers with no
group specified go to the default reggroup function and are handled
by type. */
static int
tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno,
struct reggroup *reggroup)
{
int num_regs = gdbarch_num_regs (gdbarch);
int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
int ret;
if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
{
struct tdesc_arch_data *data = gdbarch_data (gdbarch, tdesc_data);
gdb_assert (data->pseudo_register_reggroup_p != NULL);
return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup);
}
ret = tdesc_register_in_reggroup_p (gdbarch, regno, reggroup);
if (ret != -1)
return ret;
return default_register_reggroup_p (gdbarch, regno, reggroup);
}