Add i387_ext, i386_eflags and i386_mxcsr.

2010-02-10  H.J. Lu  <hongjiu.lu@intel.com>

	* target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
	(tdesc_predefined_types): Add i387_ext, i386_eflags and
	i386_mxcsr.
	(tdesc_find_type): New.
	(tdesc_gdb_type): Use tdesc_find_type.  Handle TDESC_TYPE_I387_EXT,
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.

	* target-descriptions.h (tdesc_find_type): New.
This commit is contained in:
H.J. Lu 2010-02-10 18:45:03 +00:00
parent 2fe842e549
commit 9fd3625f79
3 changed files with 114 additions and 1 deletions

View File

@ -1,3 +1,15 @@
2010-02-10 H.J. Lu <hongjiu.lu@intel.com>
* target-descriptions.c (tdesc_type): Add TDESC_TYPE_I387_EXT,
TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
(tdesc_predefined_types): Add i387_ext, i386_eflags and
i386_mxcsr.
(tdesc_find_type): New.
(tdesc_gdb_type): Use tdesc_find_type. Handle TDESC_TYPE_I387_EXT,
TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
* target-descriptions.h (tdesc_find_type): New.
2010-02-10 Michael Snyder <msnyder@vmware.com>
* gdb-gdb.py: Comment fix.

View File

@ -117,6 +117,9 @@ typedef struct tdesc_type
TDESC_TYPE_IEEE_SINGLE,
TDESC_TYPE_IEEE_DOUBLE,
TDESC_TYPE_ARM_FPA_EXT,
TDESC_TYPE_I387_EXT,
TDESC_TYPE_I386_EFLAGS,
TDESC_TYPE_I386_MXCSR,
/* Types defined by a target feature. */
TDESC_TYPE_VECTOR,
@ -461,7 +464,10 @@ static struct tdesc_type tdesc_predefined_types[] =
{ "data_ptr", TDESC_TYPE_DATA_PTR },
{ "ieee_single", TDESC_TYPE_IEEE_SINGLE },
{ "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
{ "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }
{ "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT },
{ "i387_ext", TDESC_TYPE_I387_EXT },
{ "i386_eflags", TDESC_TYPE_I386_EFLAGS },
{ "i386_mxcsr", TDESC_TYPE_I386_MXCSR }
};
/* Return the type associated with ID in the context of FEATURE, or
@ -486,12 +492,38 @@ tdesc_named_type (const struct tdesc_feature *feature, const char *id)
return NULL;
}
/* Lookup type associated with ID. */
struct type *
tdesc_find_type (struct gdbarch *gdbarch, const char *id)
{
struct tdesc_arch_reg *reg;
struct tdesc_arch_data *data;
int i, num_regs;
data = gdbarch_data (gdbarch, tdesc_data);
num_regs = VEC_length (tdesc_arch_reg, data->arch_regs);
for (i = 0; i < num_regs; i++)
{
reg = VEC_index (tdesc_arch_reg, data->arch_regs, i);
if (reg->reg
&& reg->reg->tdesc_type
&& reg->type
&& strcmp (id, reg->reg->tdesc_type->name) == 0)
return reg->type;
}
return NULL;
}
/* Construct, if necessary, and return the GDB type implementing target
type TDESC_TYPE for architecture GDBARCH. */
static struct type *
tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
{
struct type *type;
switch (tdesc_type->kind)
{
/* Predefined types. */
@ -531,6 +563,16 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
case TDESC_TYPE_DATA_PTR:
return builtin_type (gdbarch)->builtin_data_ptr;
default:
break;
}
type = tdesc_find_type (gdbarch, tdesc_type->name);
if (type)
return type;
switch (tdesc_type->kind)
{
case TDESC_TYPE_IEEE_SINGLE:
return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
floatformats_ieee_single);
@ -543,6 +585,61 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
return arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
floatformats_arm_ext);
case TDESC_TYPE_I387_EXT:
return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
floatformats_i387_ext);
case TDESC_TYPE_I386_EFLAGS:
{
struct type *type;
type = arch_flags_type (gdbarch, "builtin_type_i386_eflags", 4);
append_flags_type_flag (type, 0, "CF");
append_flags_type_flag (type, 1, NULL);
append_flags_type_flag (type, 2, "PF");
append_flags_type_flag (type, 4, "AF");
append_flags_type_flag (type, 6, "ZF");
append_flags_type_flag (type, 7, "SF");
append_flags_type_flag (type, 8, "TF");
append_flags_type_flag (type, 9, "IF");
append_flags_type_flag (type, 10, "DF");
append_flags_type_flag (type, 11, "OF");
append_flags_type_flag (type, 14, "NT");
append_flags_type_flag (type, 16, "RF");
append_flags_type_flag (type, 17, "VM");
append_flags_type_flag (type, 18, "AC");
append_flags_type_flag (type, 19, "VIF");
append_flags_type_flag (type, 20, "VIP");
append_flags_type_flag (type, 21, "ID");
return type;
}
break;
case TDESC_TYPE_I386_MXCSR:
{
struct type *type;
type = arch_flags_type (gdbarch, "builtin_type_i386_mxcsr", 4);
append_flags_type_flag (type, 0, "IE");
append_flags_type_flag (type, 1, "DE");
append_flags_type_flag (type, 2, "ZE");
append_flags_type_flag (type, 3, "OE");
append_flags_type_flag (type, 4, "UE");
append_flags_type_flag (type, 5, "PE");
append_flags_type_flag (type, 6, "DAZ");
append_flags_type_flag (type, 7, "IM");
append_flags_type_flag (type, 8, "DM");
append_flags_type_flag (type, 9, "ZM");
append_flags_type_flag (type, 10, "OM");
append_flags_type_flag (type, 11, "UM");
append_flags_type_flag (type, 12, "PM");
append_flags_type_flag (type, 15, "FZ");
return type;
}
break;
/* Types defined by a target feature. */
case TDESC_TYPE_VECTOR:
{

View File

@ -176,6 +176,10 @@ const char *tdesc_register_name (struct gdbarch *gdbarch, int regno);
struct type *tdesc_register_type (struct gdbarch *gdbarch, int regno);
/* Return the type associated with ID, from the target description. */
struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
/* Check whether REGNUM is a member of REGGROUP using the target
description. Return -1 if the target description does not
specify a group. */