Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [patch] Add support for <struct> and <flags> in target descriptions
@ 2010-02-22 16:45 Daniel Jacobowitz
  2010-02-22 19:32 ` Eli Zaretskii
  2010-03-01  0:15 ` H.J. Lu
  0 siblings, 2 replies; 9+ messages in thread
From: Daniel Jacobowitz @ 2010-02-22 16:45 UTC (permalink / raw)
  To: gdb-patches, H.J. Lu; +Cc: Eli Zaretskii

Hi H.J.,

This patch adds <flags> support to the XML language.  Could you try
using this to move the two x86 flags registers from out of
target-descriptions.c?

The flags support is straightforward and covered by the manual.
It's not tested because I couldn't find a way to do so; you can't
ptype a flags register, and you can't add dummy registers whose value
you can get at, only for ptype.

The patch also adds <struct>, which is a little more interesting.
It's got two forms:

* Register containing integer bitfields.  Each field must be
explicitly positioned.  The size must be pre-declared - otherwise
the representation GDB uses for big-endian bitfields can't figure out
how far from the MSB edge of the register the field is.

* Register containing typed non-bitfield structures.  Each field must
be implicitly positioned.  There's no support for padding.

These are somewhat annoying limitations, but they suffice for
everything I've needed this for since I wrote the patch, which was
originally several years ago; it's been stuck in my submission queue
because it was tangled up with other local patches.  Since they are
"must" restrictions, they are easy to lift in the future; we can make
GDB more permissive.

These I was able to type, although I'd have liked more exhaustive
tests... for that, I'd need typeof, which turns out to be annoyingly
hard to implement in GDB's parser :-(

Eli, how's the documentation?

-- 
Daniel Jacobowitz
CodeSourcery

2010-02-22  Daniel Jacobowitz  <dan@codesourcery.com>

	* gdbtypes.c (append_composite_type_field_raw): New.
	(append_composite_type_field_aligned): Use the new function.
	* gdbtypes.h (append_composite_type_field_raw): Declare.
	* target-descriptions.c (struct tdesc_type_field): Add start and end.
	(struct tdesc_type_flag): New type.
	(struct tdesc_type): Add TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS to
	kind.  Add size to u.u.  Add u.f for flags.
	(tdesc_gdb_type): Handle TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS.
	(tdesc_free_type): Likewise.
	(tdesc_create_struct, tdesc_set_struct_size, tdesc_create_flags): New.
	(tdesc_add_field): Handle TDESC_TYPE_STRUCT.
	(tdesc_add_bitfield, tdesc_add_flag): New.
	* target-descriptions.h (tdesc_create_struct, tdesc_set_struct_size)
	(tdesc_create_flags, tdesc_add_bitfield, tdesc_add_flag): Declare.
	* xml-tdesc.c (struct tdesc_parsing_data): Rename current_union to
	current_type.  Add current_type_size and current_type_is_flags.
	(tdesc_start_union): Clear the new fields.
	(tdesc_start_struct, tdesc_start_flags): New.
	(tdesc_start_field): Handle struct fields, including bitfields.
	(field_attributes): Make type optional.  Add start and end.
	(union_children): Rename to struct_union_children.
	(union_attributes): Rename to struct_union_attributes.  Add optional
	size.
	(flags_attributes): New.
	(feature_children): Add struct and flags.
	* features/gdb-target.dtd: Add flags and struct to features.
	Make field type optional.  Add field start and end.

	* gdb.texinfo (Types): Describe <struct> and <flags>.

	* gdb.xml/extra-regs.xml: Add struct1, struct2, and flags
	types.  Add structreg, bitfields, and flags registers.
	* gdb.xml/tdesc-regs.exp: Test structreg and bitfields
	registers.

Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.187
diff -u -p -r1.187 gdbtypes.c
--- gdbtypes.c	19 Feb 2010 22:22:48 -0000	1.187
+++ gdbtypes.c	22 Feb 2010 16:38:46 -0000
@@ -3303,10 +3303,11 @@ arch_composite_type (struct gdbarch *gdb
 }
 
 /* Add new field with name NAME and type FIELD to composite type T.
-   ALIGNMENT (if non-zero) specifies the minimum field alignment.  */
-void
-append_composite_type_field_aligned (struct type *t, char *name,
-				     struct type *field, int alignment)
+   Do not set the field's position or adjust the type's length;
+   the caller should do so.  Return the new field.  */
+struct field *
+append_composite_type_field_raw (struct type *t, char *name,
+				 struct type *field)
 {
   struct field *f;
   TYPE_NFIELDS (t) = TYPE_NFIELDS (t) + 1;
@@ -3316,6 +3317,16 @@ append_composite_type_field_aligned (str
   memset (f, 0, sizeof f[0]);
   FIELD_TYPE (f[0]) = field;
   FIELD_NAME (f[0]) = name;
+  return f;
+}
+
+/* Add new field with name NAME and type FIELD to composite type T.
+   ALIGNMENT (if non-zero) specifies the minimum field alignment.  */
+void
+append_composite_type_field_aligned (struct type *t, char *name,
+				     struct type *field, int alignment)
+{
+  struct field *f = append_composite_type_field_raw (t, name, field);
   if (TYPE_CODE (t) == TYPE_CODE_UNION)
     {
       if (TYPE_LENGTH (t) < TYPE_LENGTH (field))
Index: gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.123
diff -u -p -r1.123 gdbtypes.h
--- gdbtypes.h	19 Feb 2010 22:22:48 -0000	1.123
+++ gdbtypes.h	22 Feb 2010 16:38:46 -0000
@@ -1249,6 +1249,8 @@ extern void append_composite_type_field_
 						 char *name,
 						 struct type *field,
 						 int alignment);
+struct field *append_composite_type_field_raw (struct type *t, char *name,
+					       struct type *field);
 
 /* Helper functions to construct a bit flags type.  An initially empty
    type is created using arch_flag_type().  Flags are then added using
Index: target-descriptions.c
===================================================================
RCS file: /cvs/src/src/gdb/target-descriptions.c,v
retrieving revision 1.31
diff -u -p -r1.31 target-descriptions.c
--- target-descriptions.c	10 Feb 2010 18:45:02 -0000	1.31
+++ target-descriptions.c	22 Feb 2010 16:38:46 -0000
@@ -90,9 +90,17 @@ typedef struct tdesc_type_field
 {
   char *name;
   struct tdesc_type *type;
+  int start, end;
 } tdesc_type_field;
 DEF_VEC_O(tdesc_type_field);
 
+typedef struct tdesc_type_flag
+{
+  char *name;
+  int start;
+} tdesc_type_flag;
+DEF_VEC_O(tdesc_type_flag);
+
 typedef struct tdesc_type
 {
   /* The name of this type.  */
@@ -123,7 +131,9 @@ typedef struct tdesc_type
 
     /* Types defined by a target feature.  */
     TDESC_TYPE_VECTOR,
-    TDESC_TYPE_UNION
+    TDESC_TYPE_STRUCT,
+    TDESC_TYPE_UNION,
+    TDESC_TYPE_FLAGS
   } kind;
 
   /* Kind-specific data.  */
@@ -136,11 +146,19 @@ typedef struct tdesc_type
       int count;
     } v;
 
-    /* Union type.  */
+    /* Struct or union type.  */
     struct
     {
       VEC(tdesc_type_field) *fields;
+      LONGEST size;
     } u;
+
+    /* Flags type.  */
+    struct
+    {
+      VEC(tdesc_type_flag) *flags;
+      LONGEST size;
+    } f;
   } u;
 } *tdesc_type_p;
 DEF_VEC_P(tdesc_type_p);
@@ -652,6 +670,66 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
 	return type;
       }
 
+    case TDESC_TYPE_STRUCT:
+      {
+	struct type *type, *field_type;
+	struct tdesc_type_field *f;
+	int ix;
+
+	type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+	TYPE_NAME (type) = xstrdup (tdesc_type->name);
+	TYPE_TAG_NAME (type) = TYPE_NAME (type);
+
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_field, tdesc_type->u.u.fields, ix, f);
+	     ix++)
+	  {
+	    if (f->type == NULL)
+	      {
+		/* Bitfield.  */
+		struct field *fld;
+		struct type *field_type;
+		int bitsize, total_size;
+
+		/* This invariant should be preserved while creating
+		   types.  */
+		gdb_assert (tdesc_type->u.u.size != 0);
+		if (tdesc_type->u.u.size > 4)
+		  field_type = builtin_type (gdbarch)->builtin_uint64;
+		else
+		  field_type = builtin_type (gdbarch)->builtin_uint32;
+
+		fld = append_composite_type_field_raw (type, xstrdup (f->name),
+						       field_type);
+
+		/* For little-endian, BITPOS counts from the LSB of
+		   the structure and marks the LSB of the field.  For
+		   big-endian, BITPOS counts from the MSB of the
+		   structure and marks the MSB of the field.  Either
+		   way, it is the number of bits to the "left" of the
+		   field.  To calculate this in big-endian, we need
+		   the total size of the structure.  */
+		bitsize = f->end - f->start + 1;
+		total_size = tdesc_type->u.u.size * TARGET_CHAR_BIT;
+		if (gdbarch_bits_big_endian (gdbarch))
+		  FIELD_BITPOS (fld[0]) = total_size - f->start - bitsize;
+		else
+		  FIELD_BITPOS (fld[0]) = f->start;
+		FIELD_BITSIZE (fld[0]) = bitsize;
+	      }
+	    else
+	      {
+		field_type = tdesc_gdb_type (gdbarch, f->type);
+		append_composite_type_field (type, xstrdup (f->name),
+					     field_type);
+	      }
+	  }
+
+	if (tdesc_type->u.u.size != 0)
+	  TYPE_LENGTH (type) = tdesc_type->u.u.size;
+	return type;
+      }
+
     case TDESC_TYPE_UNION:
       {
 	struct type *type, *field_type;
@@ -668,12 +746,30 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
 	    field_type = tdesc_gdb_type (gdbarch, f->type);
 	    append_composite_type_field (type, xstrdup (f->name), field_type);
 
-	    /* If any of the children of this union are vectors, flag the
+	    /* If any of the children of a union are vectors, flag the
 	       union as a vector also.  This allows e.g. a union of two
 	       vector types to show up automatically in "info vector".  */
 	    if (TYPE_VECTOR (field_type))
 	      TYPE_VECTOR (type) = 1;
 	  }
+	return type;
+      }
+
+    case TDESC_TYPE_FLAGS:
+      {
+	struct type *type, *field_type;
+	struct tdesc_type_flag *f;
+	int ix;
+
+	type = arch_flags_type (gdbarch, xstrdup (tdesc_type->name),
+				tdesc_type->u.f.size);
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_flag, tdesc_type->u.f.flags, ix, f);
+	     ix++)
+	  /* Note that contrary to the function name, this call will
+	     just set the properties of an already-allocated
+	     field.  */
+	  append_flags_type_flag (type, f->start, f->name);
 
 	return type;
       }
@@ -1161,6 +1257,7 @@ tdesc_free_type (struct tdesc_type *type
 
   switch (type->kind)
     {
+    case TDESC_TYPE_STRUCT:
     case TDESC_TYPE_UNION:
       {
 	struct tdesc_type_field *f;
@@ -1175,6 +1272,20 @@ tdesc_free_type (struct tdesc_type *type
       }
       break;
 
+    case TDESC_TYPE_FLAGS:
+      {
+	struct tdesc_type_flag *f;
+	int ix;
+
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_flag, type->u.f.flags, ix, f);
+	     ix++)
+	  xfree (f->name);
+
+	VEC_free (tdesc_type_flag, type->u.f.flags);
+      }
+      break;
+
     default:
       break;
     }
@@ -1199,6 +1310,29 @@ tdesc_create_vector (struct tdesc_featur
 }
 
 struct tdesc_type *
+tdesc_create_struct (struct tdesc_feature *feature, const char *name)
+{
+  struct tdesc_type *type = XZALLOC (struct tdesc_type);
+
+  type->name = xstrdup (name);
+  type->kind = TDESC_TYPE_STRUCT;
+
+  VEC_safe_push (tdesc_type_p, feature->types, type);
+  return type;
+}
+
+/* Set the total length of TYPE.  Structs which contain bitfields may
+   omit the reserved bits, so the end of the last field may not
+   suffice.  */
+
+void
+tdesc_set_struct_size (struct tdesc_type *type, LONGEST size)
+{
+  gdb_assert (type->kind == TDESC_TYPE_STRUCT);
+  type->u.u.size = size;
+}
+
+struct tdesc_type *
 tdesc_create_union (struct tdesc_feature *feature, const char *name)
 {
   struct tdesc_type *type = XZALLOC (struct tdesc_type);
@@ -1210,13 +1344,32 @@ tdesc_create_union (struct tdesc_feature
   return type;
 }
 
+struct tdesc_type *
+tdesc_create_flags (struct tdesc_feature *feature, const char *name,
+		    LONGEST size)
+{
+  struct tdesc_type *type = XZALLOC (struct tdesc_type);
+
+  type->name = xstrdup (name);
+  type->kind = TDESC_TYPE_FLAGS;
+  type->u.f.size = size;
+
+  VEC_safe_push (tdesc_type_p, feature->types, type);
+  return type;
+}
+
+/* Add a new field.  Return a temporary pointer to the field, which
+   is only valid until the next call to tdesc_add_field (the vector
+   might be reallocated).  */
+
 void
 tdesc_add_field (struct tdesc_type *type, const char *field_name,
 		 struct tdesc_type *field_type)
 {
   struct tdesc_type_field f = { 0 };
 
-  gdb_assert (type->kind == TDESC_TYPE_UNION);
+  gdb_assert (type->kind == TDESC_TYPE_UNION
+	      || type->kind == TDESC_TYPE_STRUCT);
 
   f.name = xstrdup (field_name);
   f.type = field_type;
@@ -1224,6 +1377,37 @@ tdesc_add_field (struct tdesc_type *type
   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
 
+/* Add a new bitfield.  */
+
+void
+tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
+		    int start, int end)
+{
+  struct tdesc_type_field f = { 0 };
+
+  gdb_assert (type->kind == TDESC_TYPE_STRUCT);
+
+  f.name = xstrdup (field_name);
+  f.start = start;
+  f.end = end;
+
+  VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
+}
+
+void
+tdesc_add_flag (struct tdesc_type *type, int start,
+		const char *flag_name)
+{
+  struct tdesc_type_flag f = { 0 };
+
+  gdb_assert (type->kind == TDESC_TYPE_FLAGS);
+
+  f.name = xstrdup (flag_name);
+  f.start = start;
+
+  VEC_safe_push (tdesc_type_flag, type->u.f.flags, &f);
+}
+
 static void
 tdesc_free_feature (struct tdesc_feature *feature)
 {
Index: target-descriptions.h
===================================================================
RCS file: /cvs/src/src/gdb/target-descriptions.h,v
retrieving revision 1.18
diff -u -p -r1.18 target-descriptions.h
--- target-descriptions.h	10 Feb 2010 18:45:03 -0000	1.18
+++ target-descriptions.h	22 Feb 2010 16:38:46 -0000
@@ -205,10 +205,20 @@ struct tdesc_type *tdesc_create_vector (
 					const char *name,
 					struct tdesc_type *field_type,
 					int count);
+struct tdesc_type *tdesc_create_struct (struct tdesc_feature *feature,
+					const char *name);
+void tdesc_set_struct_size (struct tdesc_type *type, LONGEST size);
 struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
 				       const char *name);
+struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
+				       const char *name,
+				       LONGEST size);
 void tdesc_add_field (struct tdesc_type *type, const char *field_name,
 		      struct tdesc_type *field_type);
+void tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
+			 int start, int end);
+void tdesc_add_flag (struct tdesc_type *type, int start,
+		     const char *flag_name);
 void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
 		       int regnum, int save_restore, const char *group,
 		       int bitsize, const char *type);
Index: xml-tdesc.c
===================================================================
RCS file: /cvs/src/src/gdb/xml-tdesc.c,v
retrieving revision 1.19
diff -u -p -r1.19 xml-tdesc.c
--- xml-tdesc.c	1 Jan 2010 07:31:46 -0000	1.19
+++ xml-tdesc.c	22 Feb 2010 16:38:47 -0000
@@ -85,8 +85,15 @@ struct tdesc_parsing_data
      it does not have its own.  This starts at zero.  */
   int next_regnum;
 
-  /* The union we are currently parsing, or last parsed.  */
-  struct tdesc_type *current_union;
+  /* The struct or union we are currently parsing, or last parsed.  */
+  struct tdesc_type *current_type;
+
+  /* The byte size of the current struct type, if specified.  Zero
+     if not specified.  */
+  int current_type_size;
+
+  /* Whether the current type is a flags type.  */
+  int current_type_is_flags;
 };
 
 /* Handle the end of an <architecture> element and its value.  */
@@ -229,11 +236,57 @@ tdesc_start_union (struct gdb_xml_parser
   struct tdesc_parsing_data *data = user_data;
   char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
 
-  data->current_union = tdesc_create_union (data->current_feature, id);
+  data->current_type = tdesc_create_union (data->current_feature, id);
+  data->current_type_size = 0;
+  data->current_type_is_flags = 0;
+}
+
+/* Handle the start of a <struct> element.  Initialize the type and
+   record it with the current feature.  */
+
+static void
+tdesc_start_struct (struct gdb_xml_parser *parser,
+		   const struct gdb_xml_element *element,
+		   void *user_data, VEC(gdb_xml_value_s) *attributes)
+{
+  struct tdesc_parsing_data *data = user_data;
+  char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  struct tdesc_type *type;
+
+  type = tdesc_create_struct (data->current_feature, id);
+  data->current_type = type;
+  data->current_type_size = 0;
+  data->current_type_is_flags = 0;
+
+  if (VEC_length (gdb_xml_value_s, attributes) > 1)
+    {
+      int size = (int) * (ULONGEST *)
+	VEC_index (gdb_xml_value_s, attributes, 1)->value;
+      tdesc_set_struct_size (type, size);
+      data->current_type_size = size;
+    }
+}
+
+static void
+tdesc_start_flags (struct gdb_xml_parser *parser,
+		   const struct gdb_xml_element *element,
+		   void *user_data, VEC(gdb_xml_value_s) *attributes)
+{
+  struct tdesc_parsing_data *data = user_data;
+  char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  int length = (int) * (ULONGEST *)
+    VEC_index (gdb_xml_value_s, attributes, 1)->value;
+  struct tdesc_type *type;
+
+  type = tdesc_create_flags (data->current_feature, id, length);
+
+  data->current_type = type;
+  data->current_type_size = 0;
+  data->current_type_is_flags = 1;
 }
 
 /* Handle the start of a <field> element.  Attach the field to the
-   current union.  */
+   current struct or union.  */
 
 static void
 tdesc_start_field (struct gdb_xml_parser *parser,
@@ -241,20 +294,84 @@ tdesc_start_field (struct gdb_xml_parser
 		   void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
   struct tdesc_parsing_data *data = user_data;
+  int ix = 0, length;
   struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
   struct tdesc_type *field_type;
   char *field_name, *field_type_id;
+  int start, end;
 
-  field_name = attrs[0].value;
-  field_type_id = attrs[1].value;
+  length = VEC_length (gdb_xml_value_s, attributes);
 
-  field_type = tdesc_named_type (data->current_feature, field_type_id);
-  if (field_type == NULL)
-    gdb_xml_error (parser, _("Union field \"%s\" references undefined "
-			     "type \"%s\""),
-		   field_name, field_type_id);
+  field_name = attrs[ix++].value;
+
+  if (ix < length && strcmp (attrs[ix].name, "type") == 0)
+    field_type_id = attrs[ix++].value;
+  else
+    field_type_id = NULL;
+
+  if (ix < length && strcmp (attrs[ix].name, "start") == 0)
+    start = * (ULONGEST *) attrs[ix++].value;
+  else
+    start = -1;
+
+  if (ix < length && strcmp (attrs[ix].name, "end") == 0)
+    end = * (ULONGEST *) attrs[ix++].value;
+  else
+    end = -1;
+
+  if (field_type_id != NULL)
+    {
+      if (data->current_type_is_flags)
+	gdb_xml_error (parser, _("Cannot add typed field \"%s\" to flags"), 
+		       field_name);
+      if (data->current_type_size != 0)
+	gdb_xml_error (parser,
+		       _("Explicitly sized type can not contain non-bitfield \"%s\""), 
+		       field_name);
+
+      field_type = tdesc_named_type (data->current_feature, field_type_id);
+      if (field_type == NULL)
+	gdb_xml_error (parser, _("Field \"%s\" references undefined "
+				 "type \"%s\""),
+		       field_name, field_type_id);
+
+      tdesc_add_field (data->current_type, field_name, field_type);
+    }
+  else if (start != -1 && end != -1)
+    {
+      struct tdesc_type *t = data->current_type;
+
+      if (data->current_type_is_flags)
+	tdesc_add_flag (t, start, field_name);
+      else
+	{
+	  if (data->current_type_size == 0)
+	    gdb_xml_error (parser,
+			   _("Implicitly sized type can not contain bitfield \"%s\""), 
+			   field_name);
+
+	  if (end >= 64)
+	    gdb_xml_error (parser,
+			   _("Bitfield \"%s\" goes past 64 bits (unsupported)"),
+			   field_name);
+
+	  /* Assume that the bit numbering in XML is "lsb-zero".  Most
+	     architectures other than PowerPC use this ordering.  In
+	     the future, we can add an XML tag to indicate "msb-zero"
+	     numbering.  */
+	  if (start > end)
+	    gdb_xml_error (parser, _("Bitfield \"%s\" has start after end"),
+			   field_name);
 
-  tdesc_add_field (data->current_union, field_name, field_type);
+	  if (end >= data->current_type_size * TARGET_CHAR_BIT)
+	    gdb_xml_error (parser, _("Bitfield \"%s\" does not fit in struct"));
+
+	  tdesc_add_bitfield (t, field_name, start, end);
+	}
+    }
+  else
+    gdb_xml_error (parser, _("Field \"%s\" has neither type nor bit position"),
+		   field_name);
 }
 
 /* Handle the start of a <vector> element.  Initialize the type and
@@ -287,11 +404,13 @@ tdesc_start_vector (struct gdb_xml_parse
 
 static const struct gdb_xml_attribute field_attributes[] = {
   { "name", GDB_XML_AF_NONE, NULL, NULL },
-  { "type", GDB_XML_AF_NONE, NULL, NULL },
+  { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
+  { "start", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
+  { "end", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
   { NULL, GDB_XML_AF_NONE, NULL, NULL }
 };
 
-static const struct gdb_xml_element union_children[] = {
+static const struct gdb_xml_element struct_union_children[] = {
   { "field", field_attributes, NULL, GDB_XML_EF_REPEATABLE,
     tdesc_start_field, NULL },
   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
@@ -308,8 +427,15 @@ static const struct gdb_xml_attribute re
   { NULL, GDB_XML_AF_NONE, NULL, NULL }
 };
 
-static const struct gdb_xml_attribute union_attributes[] = {
+static const struct gdb_xml_attribute struct_union_attributes[] = {
   { "id", GDB_XML_AF_NONE, NULL, NULL },
+  { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL},
+  { NULL, GDB_XML_AF_NONE, NULL, NULL }
+};
+
+static const struct gdb_xml_attribute flags_attributes[] = {
+  { "id", GDB_XML_AF_NONE, NULL, NULL },
+  { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
   { NULL, GDB_XML_AF_NONE, NULL, NULL }
 };
 
@@ -329,9 +455,15 @@ static const struct gdb_xml_element feat
   { "reg", reg_attributes, NULL,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_reg, NULL },
-  { "union", union_attributes, union_children,
+  { "struct", struct_union_attributes, struct_union_children,
+    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
+    tdesc_start_struct, NULL },
+  { "union", struct_union_attributes, struct_union_children,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_union, NULL },
+  { "flags", flags_attributes, struct_union_children,
+    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
+    tdesc_start_flags, NULL },    
   { "vector", vector_attributes, NULL,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_vector, NULL },
Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.670
diff -u -p -r1.670 gdb.texinfo
--- doc/gdb.texinfo	12 Feb 2010 21:35:54 -0000	1.670
+++ doc/gdb.texinfo	22 Feb 2010 16:38:52 -0000
@@ -32691,6 +32691,47 @@ each of which has a @var{name} and a @va
 </union>
 @end smallexample
 
+@cindex <struct>
+If a register's value is composed from several separate values, define
+it with a structure type.  There are two forms of the @samp{<struct>}
+element; a @samp{<struct>} element must either contain only bitfields
+or contain no bitfields.  If the structure contains only bitfields,
+its total size in bytes must be specified, each bitfield must have an
+explicit start and end, and bitfields are automatically assigned an
+integer type.  The field's @var{start} should be less than or
+equal to its @var{end}, and zero represents the least significant bit.
+
+@smallexample
+<struct id="@var{id}" size="@var{size}">
+  <field name="@var{name}" start="@var{start}" end="@var{end}"/>
+  @dots{}
+</struct>
+@end smallexample
+
+If the structure contains no bitfields, then each field has an
+explicit type, and no implicit padding is added.
+
+@smallexample
+<struct id="@var{id}">
+  <field name="@var{name}" type="@var{type}"/>
+  @dots{}
+</struct>
+@end smallexample
+
+@cindex <flags>
+If a register's value is a series of single-bit flags, define it with
+a flags type.  The @samp{<flags>} element has an explicit @var{size}
+and contains one or more @samp{<field>} elements. Each field has a
+@var{name}, a @var{start}, and an @var{end}.  Only single-bit flags
+are supported.
+
+@smallexample
+<flags id="@var{id}" size="@var{size}">
+  <field name="@var{name}" start="@var{start}" end="@var{end}"/>
+  @dots{}
+</flags>
+@end smallexample
+
 @subsection Registers
 @cindex <reg>
 
Index: features/gdb-target.dtd
===================================================================
RCS file: /cvs/src/src/gdb/features/gdb-target.dtd,v
retrieving revision 1.10
diff -u -p -r1.10 gdb-target.dtd
--- features/gdb-target.dtd	1 Jan 2010 07:31:48 -0000	1.10
+++ features/gdb-target.dtd	22 Feb 2010 16:38:52 -0000
@@ -19,7 +19,8 @@
 
 <!ELEMENT compatible	(#PCDATA)>
 
-<!ELEMENT feature	((vector | union)*, reg*)>
+<!ELEMENT feature
+	((vector | flags | struct | union )*, reg*)>
 <!ATTLIST feature
 	name		ID	#REQUIRED>
 
@@ -39,6 +40,16 @@
 	type		CDATA	#REQUIRED
 	count		CDATA	#REQUIRED>
 
+<!ELEMENT flags		(field+)>
+<!ATTLIST flags
+	id		CDATA	#REQUIRED
+	size		CDATA	#REQUIRED>
+
+<!ELEMENT struct	(field+)>
+<!ATTLIST struct
+	id		CDATA	#REQUIRED
+	size		CDATA	#IMPLIED>
+
 <!ELEMENT union		(field+)>
 <!ATTLIST union
 	id		CDATA	#REQUIRED>
@@ -46,7 +57,9 @@
 <!ELEMENT field		EMPTY>
 <!ATTLIST field
 	name		CDATA	#REQUIRED
-	type		CDATA	#REQUIRED>
+	type		CDATA	#IMPLIED
+	start		CDATA	#IMPLIED
+	end		CDATA	#IMPLIED>
 
 <!ENTITY % xinclude SYSTEM "xinclude.dtd">
 %xinclude;
Index: testsuite/gdb.xml/extra-regs.xml
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.xml/extra-regs.xml,v
retrieving revision 1.1
diff -u -p -r1.1 extra-regs.xml
--- testsuite/gdb.xml/extra-regs.xml	8 Feb 2007 21:00:36 -0000	1.1
+++ testsuite/gdb.xml/extra-regs.xml	22 Feb 2010 16:38:52 -0000
@@ -8,9 +8,27 @@
       <field name="v2" type="v2int16"/>
     </union>
 
+    <struct id="struct1">
+      <field name="v4" type="v4int8"/>
+      <field name="v2" type="v2int16"/>
+    </struct>
+
+    <struct id="struct2" size="8">
+      <field name="f1" start="0" end="34"/>
+      <field name="f2" start="63" end="63"/>
+    </struct>
+
+    <flags id="flags" size="4">
+      <field name="X" start="0" end="0"/>
+      <field name="Y" start="2" end="2"/>
+    </flags>
+
     <reg name="extrareg" bitsize="32"/>
     <reg name="uintreg" bitsize="32" type="uint32"/>
     <reg name="vecreg" bitsize="32" type="v4int8"/>
     <reg name="unionreg" bitsize="32" type="vecint"/>
+    <reg name="structreg" bitsize="64" type="struct1"/>
+    <reg name="bitfields" bitsize="64" type="struct2"/>
+    <reg name="flags" bitsize="32" type="flags"/>
   </feature>
 </target>
Index: testsuite/gdb.xml/tdesc-regs.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.xml/tdesc-regs.exp,v
retrieving revision 1.11
diff -u -p -r1.11 tdesc-regs.exp
--- testsuite/gdb.xml/tdesc-regs.exp	16 Feb 2010 21:26:48 -0000	1.11
+++ testsuite/gdb.xml/tdesc-regs.exp	22 Feb 2010 16:38:52 -0000
@@ -126,6 +126,11 @@ gdb_test "ptype \$vecreg" "type = int8_t
 gdb_test "ptype \$unionreg" \
     "type = union {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
 gdb_test "ptype \$unionreg.v4" "type = int8_t \\\[4\\\]"
+gdb_test "ptype \$structreg" \
+    "type = struct struct1 {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
+gdb_test "ptype \$structreg.v4" "type = int8_t \\\[4\\\]"
+gdb_test "ptype \$bitfields" \
+    "type = struct struct2 {\r\n *uint64_t f1 : 35;\r\n *uint64_t f2 : 1;\r\n}"
 
 load_description "core-only.xml" ""
 # The extra register from the previous description should be gone.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target descriptions
  2010-02-22 16:45 [patch] Add support for <struct> and <flags> in target descriptions Daniel Jacobowitz
@ 2010-02-22 19:32 ` Eli Zaretskii
  2010-03-01  0:15 ` H.J. Lu
  1 sibling, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2010-02-22 19:32 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches, hjl.tools

> Date: Mon, 22 Feb 2010 11:45:10 -0500
> From: Daniel Jacobowitz <dan@codesourcery.com>
> Cc: Eli Zaretskii <eliz@gnu.org>
> 
> Eli, how's the documentation?

It's okay.  Thanks.

> +and contains one or more @samp{<field>} elements. Each field has a
                                                   ^^
Two spaces, please.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target   descriptions
  2010-02-22 16:45 [patch] Add support for <struct> and <flags> in target descriptions Daniel Jacobowitz
  2010-02-22 19:32 ` Eli Zaretskii
@ 2010-03-01  0:15 ` H.J. Lu
  2010-03-01  0:57   ` H.J. Lu
  1 sibling, 1 reply; 9+ messages in thread
From: H.J. Lu @ 2010-03-01  0:15 UTC (permalink / raw)
  To: gdb-patches, H.J. Lu, Eli Zaretskii

On Mon, Feb 22, 2010 at 8:45 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> Hi H.J.,
>
> This patch adds <flags> support to the XML language.  Could you try
> using this to move the two x86 flags registers from out of
> target-descriptions.c?
>
> The flags support is straightforward and covered by the manual.
> It's not tested because I couldn't find a way to do so; you can't
> ptype a flags register, and you can't add dummy registers whose value
> you can get at, only for ptype.
>
> The patch also adds <struct>, which is a little more interesting.
> It's got two forms:
>
> * Register containing integer bitfields.  Each field must be
> explicitly positioned.  The size must be pre-declared - otherwise
> the representation GDB uses for big-endian bitfields can't figure out
> how far from the MSB edge of the register the field is.
>
> * Register containing typed non-bitfield structures.  Each field must
> be implicitly positioned.  There's no support for padding.
>
> These are somewhat annoying limitations, but they suffice for
> everything I've needed this for since I wrote the patch, which was
> originally several years ago; it's been stuck in my submission queue
> because it was tangled up with other local patches.  Since they are
> "must" restrictions, they are easy to lift in the future; we can make
> GDB more permissive.
>
> These I was able to type, although I'd have liked more exhaustive
> tests... for that, I'd need typeof, which turns out to be annoyingly
> hard to implement in GDB's parser :-(
>
> Eli, how's the documentation?
>
> --
> Daniel Jacobowitz
> CodeSourcery
>
> 2010-02-22  Daniel Jacobowitz  <dan@codesourcery.com>
>
>        * gdbtypes.c (append_composite_type_field_raw): New.
>        (append_composite_type_field_aligned): Use the new function.
>        * gdbtypes.h (append_composite_type_field_raw): Declare.
>        * target-descriptions.c (struct tdesc_type_field): Add start and end.
>        (struct tdesc_type_flag): New type.
>        (struct tdesc_type): Add TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS to
>        kind.  Add size to u.u.  Add u.f for flags.
>        (tdesc_gdb_type): Handle TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS.
>        (tdesc_free_type): Likewise.
>        (tdesc_create_struct, tdesc_set_struct_size, tdesc_create_flags): New.
>        (tdesc_add_field): Handle TDESC_TYPE_STRUCT.
>        (tdesc_add_bitfield, tdesc_add_flag): New.
>        * target-descriptions.h (tdesc_create_struct, tdesc_set_struct_size)
>        (tdesc_create_flags, tdesc_add_bitfield, tdesc_add_flag): Declare.
>        * xml-tdesc.c (struct tdesc_parsing_data): Rename current_union to
>        current_type.  Add current_type_size and current_type_is_flags.
>        (tdesc_start_union): Clear the new fields.
>        (tdesc_start_struct, tdesc_start_flags): New.
>        (tdesc_start_field): Handle struct fields, including bitfields.
>        (field_attributes): Make type optional.  Add start and end.
>        (union_children): Rename to struct_union_children.
>        (union_attributes): Rename to struct_union_attributes.  Add optional
>        size.
>        (flags_attributes): New.
>        (feature_children): Add struct and flags.
>        * features/gdb-target.dtd: Add flags and struct to features.
>        Make field type optional.  Add field start and end.
>
>        * gdb.texinfo (Types): Describe <struct> and <flags>.
>
>        * gdb.xml/extra-regs.xml: Add struct1, struct2, and flags
>        types.  Add structreg, bitfields, and flags registers.
>        * gdb.xml/tdesc-regs.exp: Test structreg and bitfields
>        registers.
>

It doesn't work. "case TDESC_TYPE_FLAGS:" is missing in
maint_print_c_tdesc_cmd.



-- 
H.J.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target   descriptions
  2010-03-01  0:15 ` H.J. Lu
@ 2010-03-01  0:57   ` H.J. Lu
  2010-03-01  2:20     ` H.J. Lu
  2010-03-01  2:46     ` Daniel Jacobowitz
  0 siblings, 2 replies; 9+ messages in thread
From: H.J. Lu @ 2010-03-01  0:57 UTC (permalink / raw)
  To: gdb-patches, Daniel Jacobowitz

[-- Attachment #1: Type: text/plain, Size: 4398 bytes --]

On Sun, Feb 28, 2010 at 4:15 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Mon, Feb 22, 2010 at 8:45 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
>> Hi H.J.,
>>
>> This patch adds <flags> support to the XML language.  Could you try
>> using this to move the two x86 flags registers from out of
>> target-descriptions.c?
>>
>> The flags support is straightforward and covered by the manual.
>> It's not tested because I couldn't find a way to do so; you can't
>> ptype a flags register, and you can't add dummy registers whose value
>> you can get at, only for ptype.
>>
>> The patch also adds <struct>, which is a little more interesting.
>> It's got two forms:
>>
>> * Register containing integer bitfields.  Each field must be
>> explicitly positioned.  The size must be pre-declared - otherwise
>> the representation GDB uses for big-endian bitfields can't figure out
>> how far from the MSB edge of the register the field is.
>>
>> * Register containing typed non-bitfield structures.  Each field must
>> be implicitly positioned.  There's no support for padding.
>>
>> These are somewhat annoying limitations, but they suffice for
>> everything I've needed this for since I wrote the patch, which was
>> originally several years ago; it's been stuck in my submission queue
>> because it was tangled up with other local patches.  Since they are
>> "must" restrictions, they are easy to lift in the future; we can make
>> GDB more permissive.
>>
>> These I was able to type, although I'd have liked more exhaustive
>> tests... for that, I'd need typeof, which turns out to be annoyingly
>> hard to implement in GDB's parser :-(
>>
>> Eli, how's the documentation?
>>
>> --
>> Daniel Jacobowitz
>> CodeSourcery
>>
>> 2010-02-22  Daniel Jacobowitz  <dan@codesourcery.com>
>>
>>        * gdbtypes.c (append_composite_type_field_raw): New.
>>        (append_composite_type_field_aligned): Use the new function.
>>        * gdbtypes.h (append_composite_type_field_raw): Declare.
>>        * target-descriptions.c (struct tdesc_type_field): Add start and end.
>>        (struct tdesc_type_flag): New type.
>>        (struct tdesc_type): Add TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS to
>>        kind.  Add size to u.u.  Add u.f for flags.
>>        (tdesc_gdb_type): Handle TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS.
>>        (tdesc_free_type): Likewise.
>>        (tdesc_create_struct, tdesc_set_struct_size, tdesc_create_flags): New.
>>        (tdesc_add_field): Handle TDESC_TYPE_STRUCT.
>>        (tdesc_add_bitfield, tdesc_add_flag): New.
>>        * target-descriptions.h (tdesc_create_struct, tdesc_set_struct_size)
>>        (tdesc_create_flags, tdesc_add_bitfield, tdesc_add_flag): Declare.
>>        * xml-tdesc.c (struct tdesc_parsing_data): Rename current_union to
>>        current_type.  Add current_type_size and current_type_is_flags.
>>        (tdesc_start_union): Clear the new fields.
>>        (tdesc_start_struct, tdesc_start_flags): New.
>>        (tdesc_start_field): Handle struct fields, including bitfields.
>>        (field_attributes): Make type optional.  Add start and end.
>>        (union_children): Rename to struct_union_children.
>>        (union_attributes): Rename to struct_union_attributes.  Add optional
>>        size.
>>        (flags_attributes): New.
>>        (feature_children): Add struct and flags.
>>        * features/gdb-target.dtd: Add flags and struct to features.
>>        Make field type optional.  Add field start and end.
>>
>>        * gdb.texinfo (Types): Describe <struct> and <flags>.
>>
>>        * gdb.xml/extra-regs.xml: Add struct1, struct2, and flags
>>        types.  Add structreg, bitfields, and flags registers.
>>        * gdb.xml/tdesc-regs.exp: Test structreg and bitfields
>>        registers.
>>
>
> It doesn't work. "case TDESC_TYPE_FLAGS:" is missing in
> maint_print_c_tdesc_cmd.
>
>

This patch makes it to work. However, there is no equivalent of

append_flags_type_flag (type, 1, NULL);

I have

  <flags id="i386_eflags" size="4">
    <field name="CF" start="0" end="0"/>
    <field name="" start="1" end="1"/>
    <field name="PF" start="2" end="2"/>
....

I got

(gdb) p $eflags
$1 = [  PF ZF IF ]
           ^ extra white space
(gdb)

instead of
(gdb) p $eflags
$1 = [ PF ZF IF ]
(gdb)




-- 
H.J.

[-- Attachment #2: gdb-flag-1.patch --]
[-- Type: text/plain, Size: 2730 bytes --]

diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 77dd37b..af87633 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -126,7 +126,6 @@ typedef struct tdesc_type
     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.  */
@@ -484,7 +483,6 @@ static struct tdesc_type tdesc_predefined_types[] =
   { "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
   { "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 }
 };
 
@@ -607,33 +605,6 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
       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;
@@ -1602,6 +1573,7 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   struct tdesc_reg *reg;
   struct tdesc_type *type;
   struct tdesc_type_field *f;
+  struct tdesc_type_flag *flag;
   int ix, ix2, ix3;
 
   /* Use the global target-supplied description, not the current
@@ -1715,6 +1687,18 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
 		     f->name);
 		}
 	      break;
+	    case TDESC_TYPE_FLAGS:
+	      printf_unfiltered
+		("  field_type = tdesc_create_flags (feature, \"%s\", %d);\n",
+		 type->name, (int) type->u.f.size);
+	      for (ix3 = 0;
+		   VEC_iterate (tdesc_type_flag, type->u.f.flags, ix3,
+				flag);
+		   ix3++)
+		printf_unfiltered
+		  ("  tdesc_add_flag (field_type, %d, \"%s\");\n",
+		   flag->start, flag->name);
+	      break;
 	    default:
 	      error (_("C output is not supported type \"%s\"."), type->name);
 	    }

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target   descriptions
  2010-03-01  0:57   ` H.J. Lu
@ 2010-03-01  2:20     ` H.J. Lu
  2010-03-01 17:20       ` Daniel Jacobowitz
  2010-03-01  2:46     ` Daniel Jacobowitz
  1 sibling, 1 reply; 9+ messages in thread
From: H.J. Lu @ 2010-03-01  2:20 UTC (permalink / raw)
  To: gdb-patches, Daniel Jacobowitz

[-- Attachment #1: Type: text/plain, Size: 4650 bytes --]

On Sun, Feb 28, 2010 at 4:56 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Feb 28, 2010 at 4:15 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Mon, Feb 22, 2010 at 8:45 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
>>> Hi H.J.,
>>>
>>> This patch adds <flags> support to the XML language.  Could you try
>>> using this to move the two x86 flags registers from out of
>>> target-descriptions.c?
>>>
>>> The flags support is straightforward and covered by the manual.
>>> It's not tested because I couldn't find a way to do so; you can't
>>> ptype a flags register, and you can't add dummy registers whose value
>>> you can get at, only for ptype.
>>>
>>> The patch also adds <struct>, which is a little more interesting.
>>> It's got two forms:
>>>
>>> * Register containing integer bitfields.  Each field must be
>>> explicitly positioned.  The size must be pre-declared - otherwise
>>> the representation GDB uses for big-endian bitfields can't figure out
>>> how far from the MSB edge of the register the field is.
>>>
>>> * Register containing typed non-bitfield structures.  Each field must
>>> be implicitly positioned.  There's no support for padding.
>>>
>>> These are somewhat annoying limitations, but they suffice for
>>> everything I've needed this for since I wrote the patch, which was
>>> originally several years ago; it's been stuck in my submission queue
>>> because it was tangled up with other local patches.  Since they are
>>> "must" restrictions, they are easy to lift in the future; we can make
>>> GDB more permissive.
>>>
>>> These I was able to type, although I'd have liked more exhaustive
>>> tests... for that, I'd need typeof, which turns out to be annoyingly
>>> hard to implement in GDB's parser :-(
>>>
>>> Eli, how's the documentation?
>>>
>>> --
>>> Daniel Jacobowitz
>>> CodeSourcery
>>>
>>> 2010-02-22  Daniel Jacobowitz  <dan@codesourcery.com>
>>>
>>>        * gdbtypes.c (append_composite_type_field_raw): New.
>>>        (append_composite_type_field_aligned): Use the new function.
>>>        * gdbtypes.h (append_composite_type_field_raw): Declare.
>>>        * target-descriptions.c (struct tdesc_type_field): Add start and end.
>>>        (struct tdesc_type_flag): New type.
>>>        (struct tdesc_type): Add TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS to
>>>        kind.  Add size to u.u.  Add u.f for flags.
>>>        (tdesc_gdb_type): Handle TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS.
>>>        (tdesc_free_type): Likewise.
>>>        (tdesc_create_struct, tdesc_set_struct_size, tdesc_create_flags): New.
>>>        (tdesc_add_field): Handle TDESC_TYPE_STRUCT.
>>>        (tdesc_add_bitfield, tdesc_add_flag): New.
>>>        * target-descriptions.h (tdesc_create_struct, tdesc_set_struct_size)
>>>        (tdesc_create_flags, tdesc_add_bitfield, tdesc_add_flag): Declare.
>>>        * xml-tdesc.c (struct tdesc_parsing_data): Rename current_union to
>>>        current_type.  Add current_type_size and current_type_is_flags.
>>>        (tdesc_start_union): Clear the new fields.
>>>        (tdesc_start_struct, tdesc_start_flags): New.
>>>        (tdesc_start_field): Handle struct fields, including bitfields.
>>>        (field_attributes): Make type optional.  Add start and end.
>>>        (union_children): Rename to struct_union_children.
>>>        (union_attributes): Rename to struct_union_attributes.  Add optional
>>>        size.
>>>        (flags_attributes): New.
>>>        (feature_children): Add struct and flags.
>>>        * features/gdb-target.dtd: Add flags and struct to features.
>>>        Make field type optional.  Add field start and end.
>>>
>>>        * gdb.texinfo (Types): Describe <struct> and <flags>.
>>>
>>>        * gdb.xml/extra-regs.xml: Add struct1, struct2, and flags
>>>        types.  Add structreg, bitfields, and flags registers.
>>>        * gdb.xml/tdesc-regs.exp: Test structreg and bitfields
>>>        registers.
>>>
>>
>> It doesn't work. "case TDESC_TYPE_FLAGS:" is missing in
>> maint_print_c_tdesc_cmd.
>>
>>
>
> This patch makes it to work. However, there is no equivalent of
>
> append_flags_type_flag (type, 1, NULL);
>
> I have
>
>  <flags id="i386_eflags" size="4">
>    <field name="CF" start="0" end="0"/>
>    <field name="" start="1" end="1"/>
>    <field name="PF" start="2" end="2"/>
> ....
>
> I got
>
> (gdb) p $eflags
> $1 = [  PF ZF IF ]
>           ^ extra white space
> (gdb)
>
> instead of
> (gdb) p $eflags
> $1 = [ PF ZF IF ]
> (gdb)
>

Hi Daniel,

This patch on top of yours works.

Thanks.


-- 
H.J.

[-- Attachment #2: gdb-flag-2.patch --]
[-- Type: text/plain, Size: 18608 bytes --]

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

	* target-descriptions.c (tdesc_type): Remove
	TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
	(tdesc_predefined_types): Likewise.
	(tdesc_gdb_type): Likewise.  Pass NULL to append_flags_type_flag
	if flag name is empty.
	(maint_print_c_tdesc_cmd): Handle TDESC_TYPE_FLAGS.

	* features/i386/32bit-core.xml: Define i386_eflags.
	* features/i386/64bit-core.xml: Likewise.

	* features/i386/32bit-sse.xml: Define i386_mxcsr.
	* features/i386/64bit-sse.xml: Likewise.

	* features/i386/amd64-linux.c: Regenerated.
	* features/i386/amd64.c: Likewise.
	* features/i386/i386-linux.c: Likewise.
	* features/i386/i386.c: Likewise.

diff --git a/gdb/features/i386/32bit-core.xml b/gdb/features/i386/32bit-core.xml
index b047074..4d0377e 100644
--- a/gdb/features/i386/32bit-core.xml
+++ b/gdb/features/i386/32bit-core.xml
@@ -7,6 +7,26 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.core">
+  <flags id="i386_eflags" size="4">
+    <field name="CF" start="0" end="0"/>
+    <field name="" start="1" end="1"/>
+    <field name="PF" start="2" end="2"/>
+    <field name="AF" start="4" end="4"/>
+    <field name="ZF" start="6" end="6"/>
+    <field name="SF" start="7" end="7"/>
+    <field name="TF" start="8" end="8"/>
+    <field name="IF" start="9" end="9"/>
+    <field name="DF" start="10" end="10"/>
+    <field name="OF" start="11" end="11"/>
+    <field name="NT" start="14" end="14"/>
+    <field name="RF" start="16" end="16"/>
+    <field name="VM" start="17" end="17"/>
+    <field name="AC" start="18" end="18"/>
+    <field name="VIF" start="19" end="19"/>
+    <field name="VIP" start="20" end="20"/>
+    <field name="ID" start="21" end="21"/>
+  </flags>
+
   <reg name="eax" bitsize="32" type="int32"/>
   <reg name="ecx" bitsize="32" type="int32"/>
   <reg name="edx" bitsize="32" type="int32"/>
diff --git a/gdb/features/i386/32bit-sse.xml b/gdb/features/i386/32bit-sse.xml
index e849b8d..cca94b3 100644
--- a/gdb/features/i386/32bit-sse.xml
+++ b/gdb/features/i386/32bit-sse.xml
@@ -22,6 +22,22 @@
     <field name="v2_int64" type="v2i64"/>
     <field name="uint128" type="uint128"/>
   </union>
+  <flags id="i386_mxcsr" size="4">
+    <field name="IE" start="0" end="0"/>
+    <field name="DE" start="1" end="1"/>
+    <field name="ZE" start="2" end="2"/>
+    <field name="OE" start="3" end="3"/>
+    <field name="UE" start="4" end="4"/>
+    <field name="PE" start="5" end="5"/>
+    <field name="DAZ" start="6" end="6"/>
+    <field name="IM" start="7" end="7"/>
+    <field name="DM" start="8" end="8"/>
+    <field name="ZM" start="9" end="9"/>
+    <field name="OM" start="10" end="10"/>
+    <field name="UM" start="11" end="11"/>
+    <field name="PM" start="12" end="12"/>
+    <field name="FZ" start="15" end="15"/>
+  </flags>
 
   <reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>
   <reg name="xmm1" bitsize="128" type="vec128"/>
diff --git a/gdb/features/i386/64bit-core.xml b/gdb/features/i386/64bit-core.xml
index ae41cf2..8cfe3fe 100644
--- a/gdb/features/i386/64bit-core.xml
+++ b/gdb/features/i386/64bit-core.xml
@@ -7,6 +7,26 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.core">
+  <flags id="i386_eflags" size="4">
+    <field name="CF" start="0" end="0"/>
+    <field name="" start="1" end="1"/>
+    <field name="PF" start="2" end="2"/>
+    <field name="AF" start="4" end="4"/>
+    <field name="ZF" start="6" end="6"/>
+    <field name="SF" start="7" end="7"/>
+    <field name="TF" start="8" end="8"/>
+    <field name="IF" start="9" end="9"/>
+    <field name="DF" start="10" end="10"/>
+    <field name="OF" start="11" end="11"/>
+    <field name="NT" start="14" end="14"/>
+    <field name="RF" start="16" end="16"/>
+    <field name="VM" start="17" end="17"/>
+    <field name="AC" start="18" end="18"/>
+    <field name="VIF" start="19" end="19"/>
+    <field name="VIP" start="20" end="20"/>
+    <field name="ID" start="21" end="21"/>
+  </flags>
+
   <reg name="rax" bitsize="64" type="int64"/>
   <reg name="rbx" bitsize="64" type="int64"/>
   <reg name="rcx" bitsize="64" type="int64"/>
diff --git a/gdb/features/i386/64bit-sse.xml b/gdb/features/i386/64bit-sse.xml
index a71fe78..d7f7925 100644
--- a/gdb/features/i386/64bit-sse.xml
+++ b/gdb/features/i386/64bit-sse.xml
@@ -22,6 +22,22 @@
     <field name="v2_int64" type="v2i64"/>
     <field name="uint128" type="uint128"/>
   </union>
+  <flags id="i386_mxcsr" size="4">
+    <field name="IE" start="0" end="0"/>
+    <field name="DE" start="1" end="1"/>
+    <field name="ZE" start="2" end="2"/>
+    <field name="OE" start="3" end="3"/>
+    <field name="UE" start="4" end="4"/>
+    <field name="PE" start="5" end="5"/>
+    <field name="DAZ" start="6" end="6"/>
+    <field name="IM" start="7" end="7"/>
+    <field name="DM" start="8" end="8"/>
+    <field name="ZM" start="9" end="9"/>
+    <field name="OM" start="10" end="10"/>
+    <field name="UM" start="11" end="11"/>
+    <field name="PM" start="12" end="12"/>
+    <field name="FZ" start="15" end="15"/>
+  </flags>
 
   <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
   <reg name="xmm1" bitsize="128" type="vec128"/>
diff --git a/gdb/features/i386/amd64-linux.c b/gdb/features/i386/amd64-linux.c
index 64a29ce..71efcbe 100644
--- a/gdb/features/i386/amd64-linux.c
+++ b/gdb/features/i386/amd64-linux.c
@@ -17,6 +17,25 @@ initialize_tdesc_amd64_linux (void)
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (field_type, 0, "CF");
+  tdesc_add_flag (field_type, 1, "");
+  tdesc_add_flag (field_type, 2, "PF");
+  tdesc_add_flag (field_type, 4, "AF");
+  tdesc_add_flag (field_type, 6, "ZF");
+  tdesc_add_flag (field_type, 7, "SF");
+  tdesc_add_flag (field_type, 8, "TF");
+  tdesc_add_flag (field_type, 9, "IF");
+  tdesc_add_flag (field_type, 10, "DF");
+  tdesc_add_flag (field_type, 11, "OF");
+  tdesc_add_flag (field_type, 14, "NT");
+  tdesc_add_flag (field_type, 16, "RF");
+  tdesc_add_flag (field_type, 17, "VM");
+  tdesc_add_flag (field_type, 18, "AC");
+  tdesc_add_flag (field_type, 19, "VIF");
+  tdesc_add_flag (field_type, 20, "VIP");
+  tdesc_add_flag (field_type, 21, "ID");
+
   tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
   tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
   tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
@@ -93,6 +112,22 @@ initialize_tdesc_amd64_linux (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
 
+  field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (field_type, 0, "IE");
+  tdesc_add_flag (field_type, 1, "DE");
+  tdesc_add_flag (field_type, 2, "ZE");
+  tdesc_add_flag (field_type, 3, "OE");
+  tdesc_add_flag (field_type, 4, "UE");
+  tdesc_add_flag (field_type, 5, "PE");
+  tdesc_add_flag (field_type, 6, "DAZ");
+  tdesc_add_flag (field_type, 7, "IM");
+  tdesc_add_flag (field_type, 8, "DM");
+  tdesc_add_flag (field_type, 9, "ZM");
+  tdesc_add_flag (field_type, 10, "OM");
+  tdesc_add_flag (field_type, 11, "UM");
+  tdesc_add_flag (field_type, 12, "PM");
+  tdesc_add_flag (field_type, 15, "FZ");
+
   tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
diff --git a/gdb/features/i386/amd64.c b/gdb/features/i386/amd64.c
index af7b729..154e8df 100644
--- a/gdb/features/i386/amd64.c
+++ b/gdb/features/i386/amd64.c
@@ -15,6 +15,25 @@ initialize_tdesc_amd64 (void)
   set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (field_type, 0, "CF");
+  tdesc_add_flag (field_type, 1, "");
+  tdesc_add_flag (field_type, 2, "PF");
+  tdesc_add_flag (field_type, 4, "AF");
+  tdesc_add_flag (field_type, 6, "ZF");
+  tdesc_add_flag (field_type, 7, "SF");
+  tdesc_add_flag (field_type, 8, "TF");
+  tdesc_add_flag (field_type, 9, "IF");
+  tdesc_add_flag (field_type, 10, "DF");
+  tdesc_add_flag (field_type, 11, "OF");
+  tdesc_add_flag (field_type, 14, "NT");
+  tdesc_add_flag (field_type, 16, "RF");
+  tdesc_add_flag (field_type, 17, "VM");
+  tdesc_add_flag (field_type, 18, "AC");
+  tdesc_add_flag (field_type, 19, "VIF");
+  tdesc_add_flag (field_type, 20, "VIP");
+  tdesc_add_flag (field_type, 21, "ID");
+
   tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
   tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
   tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
@@ -91,6 +110,22 @@ initialize_tdesc_amd64 (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
 
+  field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (field_type, 0, "IE");
+  tdesc_add_flag (field_type, 1, "DE");
+  tdesc_add_flag (field_type, 2, "ZE");
+  tdesc_add_flag (field_type, 3, "OE");
+  tdesc_add_flag (field_type, 4, "UE");
+  tdesc_add_flag (field_type, 5, "PE");
+  tdesc_add_flag (field_type, 6, "DAZ");
+  tdesc_add_flag (field_type, 7, "IM");
+  tdesc_add_flag (field_type, 8, "DM");
+  tdesc_add_flag (field_type, 9, "ZM");
+  tdesc_add_flag (field_type, 10, "OM");
+  tdesc_add_flag (field_type, 11, "UM");
+  tdesc_add_flag (field_type, 12, "PM");
+  tdesc_add_flag (field_type, 15, "FZ");
+
   tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
diff --git a/gdb/features/i386/i386-linux.c b/gdb/features/i386/i386-linux.c
index 37447bd..cc1fb99 100644
--- a/gdb/features/i386/i386-linux.c
+++ b/gdb/features/i386/i386-linux.c
@@ -17,6 +17,25 @@ initialize_tdesc_i386_linux (void)
   set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (field_type, 0, "CF");
+  tdesc_add_flag (field_type, 1, "");
+  tdesc_add_flag (field_type, 2, "PF");
+  tdesc_add_flag (field_type, 4, "AF");
+  tdesc_add_flag (field_type, 6, "ZF");
+  tdesc_add_flag (field_type, 7, "SF");
+  tdesc_add_flag (field_type, 8, "TF");
+  tdesc_add_flag (field_type, 9, "IF");
+  tdesc_add_flag (field_type, 10, "DF");
+  tdesc_add_flag (field_type, 11, "OF");
+  tdesc_add_flag (field_type, 14, "NT");
+  tdesc_add_flag (field_type, 16, "RF");
+  tdesc_add_flag (field_type, 17, "VM");
+  tdesc_add_flag (field_type, 18, "AC");
+  tdesc_add_flag (field_type, 19, "VIF");
+  tdesc_add_flag (field_type, 20, "VIP");
+  tdesc_add_flag (field_type, 21, "ID");
+
   tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
   tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
   tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
@@ -88,6 +107,22 @@ initialize_tdesc_i386_linux (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
 
+  field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (field_type, 0, "IE");
+  tdesc_add_flag (field_type, 1, "DE");
+  tdesc_add_flag (field_type, 2, "ZE");
+  tdesc_add_flag (field_type, 3, "OE");
+  tdesc_add_flag (field_type, 4, "UE");
+  tdesc_add_flag (field_type, 5, "PE");
+  tdesc_add_flag (field_type, 6, "DAZ");
+  tdesc_add_flag (field_type, 7, "IM");
+  tdesc_add_flag (field_type, 8, "DM");
+  tdesc_add_flag (field_type, 9, "ZM");
+  tdesc_add_flag (field_type, 10, "OM");
+  tdesc_add_flag (field_type, 11, "UM");
+  tdesc_add_flag (field_type, 12, "PM");
+  tdesc_add_flag (field_type, 15, "FZ");
+
   tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
diff --git a/gdb/features/i386/i386.c b/gdb/features/i386/i386.c
index 5ac9ad9..7f7beb3 100644
--- a/gdb/features/i386/i386.c
+++ b/gdb/features/i386/i386.c
@@ -15,6 +15,25 @@ initialize_tdesc_i386 (void)
   set_tdesc_architecture (result, bfd_scan_arch ("i386"));
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  field_type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (field_type, 0, "CF");
+  tdesc_add_flag (field_type, 1, "");
+  tdesc_add_flag (field_type, 2, "PF");
+  tdesc_add_flag (field_type, 4, "AF");
+  tdesc_add_flag (field_type, 6, "ZF");
+  tdesc_add_flag (field_type, 7, "SF");
+  tdesc_add_flag (field_type, 8, "TF");
+  tdesc_add_flag (field_type, 9, "IF");
+  tdesc_add_flag (field_type, 10, "DF");
+  tdesc_add_flag (field_type, 11, "OF");
+  tdesc_add_flag (field_type, 14, "NT");
+  tdesc_add_flag (field_type, 16, "RF");
+  tdesc_add_flag (field_type, 17, "VM");
+  tdesc_add_flag (field_type, 18, "AC");
+  tdesc_add_flag (field_type, 19, "VIF");
+  tdesc_add_flag (field_type, 20, "VIP");
+  tdesc_add_flag (field_type, 21, "ID");
+
   tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
   tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
   tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
@@ -83,6 +102,22 @@ initialize_tdesc_i386 (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_add_field (type, "uint128", field_type);
 
+  field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (field_type, 0, "IE");
+  tdesc_add_flag (field_type, 1, "DE");
+  tdesc_add_flag (field_type, 2, "ZE");
+  tdesc_add_flag (field_type, 3, "OE");
+  tdesc_add_flag (field_type, 4, "UE");
+  tdesc_add_flag (field_type, 5, "PE");
+  tdesc_add_flag (field_type, 6, "DAZ");
+  tdesc_add_flag (field_type, 7, "IM");
+  tdesc_add_flag (field_type, 8, "DM");
+  tdesc_add_flag (field_type, 9, "ZM");
+  tdesc_add_flag (field_type, 10, "OM");
+  tdesc_add_flag (field_type, 11, "UM");
+  tdesc_add_flag (field_type, 12, "PM");
+  tdesc_add_flag (field_type, 15, "FZ");
+
   tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 77dd37b..86adc9d 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -126,8 +126,6 @@ typedef struct tdesc_type
     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,
@@ -483,9 +481,7 @@ static struct tdesc_type tdesc_predefined_types[] =
   { "ieee_single", TDESC_TYPE_IEEE_SINGLE },
   { "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
   { "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 }
+  { "i387_ext", TDESC_TYPE_I387_EXT }
 };
 
 /* Return the type associated with ID in the context of FEATURE, or
@@ -607,57 +603,6 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
       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:
       {
@@ -769,7 +714,8 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
 	  /* Note that contrary to the function name, this call will
 	     just set the properties of an already-allocated
 	     field.  */
-	  append_flags_type_flag (type, f->start, f->name);
+	  append_flags_type_flag (type, f->start,
+				  *f->name ? f->name : NULL);
 
 	return type;
       }
@@ -1602,6 +1548,7 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
   struct tdesc_reg *reg;
   struct tdesc_type *type;
   struct tdesc_type_field *f;
+  struct tdesc_type_flag *flag;
   int ix, ix2, ix3;
 
   /* Use the global target-supplied description, not the current
@@ -1715,6 +1662,18 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
 		     f->name);
 		}
 	      break;
+	    case TDESC_TYPE_FLAGS:
+	      printf_unfiltered
+		("  field_type = tdesc_create_flags (feature, \"%s\", %d);\n",
+		 type->name, (int) type->u.f.size);
+	      for (ix3 = 0;
+		   VEC_iterate (tdesc_type_flag, type->u.f.flags, ix3,
+				flag);
+		   ix3++)
+		printf_unfiltered
+		  ("  tdesc_add_flag (field_type, %d, \"%s\");\n",
+		   flag->start, flag->name);
+	      break;
 	    default:
 	      error (_("C output is not supported type \"%s\"."), type->name);
 	    }

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target  descriptions
  2010-03-01  0:57   ` H.J. Lu
  2010-03-01  2:20     ` H.J. Lu
@ 2010-03-01  2:46     ` Daniel Jacobowitz
  2010-03-01  3:06       ` H.J. Lu
  1 sibling, 1 reply; 9+ messages in thread
From: Daniel Jacobowitz @ 2010-03-01  2:46 UTC (permalink / raw)
  To: H.J. Lu; +Cc: gdb-patches

On Sun, Feb 28, 2010 at 04:56:50PM -0800, H.J. Lu wrote:
> This patch makes it to work. However, there is no equivalent of
> 
> append_flags_type_flag (type, 1, NULL);

Is this to separate unknown bits (which should be displayed) from
don't-care bits (which are hidden)?

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target   descriptions
  2010-03-01  2:46     ` Daniel Jacobowitz
@ 2010-03-01  3:06       ` H.J. Lu
  0 siblings, 0 replies; 9+ messages in thread
From: H.J. Lu @ 2010-03-01  3:06 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches

On Sun, Feb 28, 2010 at 6:45 PM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 28, 2010 at 04:56:50PM -0800, H.J. Lu wrote:
>> This patch makes it to work. However, there is no equivalent of
>>
>> append_flags_type_flag (type, 1, NULL);
>
> Is this to separate unknown bits (which should be displayed) from
> don't-care bits (which are hidden)?
>

I believe so.

-- 
H.J.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target    descriptions
  2010-03-01  2:20     ` H.J. Lu
@ 2010-03-01 17:20       ` Daniel Jacobowitz
  2010-03-01 17:26         ` H.J. Lu
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Jacobowitz @ 2010-03-01 17:20 UTC (permalink / raw)
  To: H.J. Lu; +Cc: gdb-patches

On Sun, Feb 28, 2010 at 06:20:25PM -0800, H.J. Lu wrote:
> Hi Daniel,
> 
> This patch on top of yours works.

Thanks.  I've checked in my patch; yours is OK also.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] Add support for <struct> and <flags> in target   descriptions
  2010-03-01 17:20       ` Daniel Jacobowitz
@ 2010-03-01 17:26         ` H.J. Lu
  0 siblings, 0 replies; 9+ messages in thread
From: H.J. Lu @ 2010-03-01 17:26 UTC (permalink / raw)
  To: H.J. Lu, gdb-patches

On Mon, Mar 1, 2010 at 9:20 AM, Daniel Jacobowitz <dan@codesourcery.com> wrote:
> On Sun, Feb 28, 2010 at 06:20:25PM -0800, H.J. Lu wrote:
>> Hi Daniel,
>>
>> This patch on top of yours works.
>
> Thanks.  I've checked in my patch; yours is OK also.
>

Done.  Thanks.

-- 
H.J.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-03-01 17:26 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-22 16:45 [patch] Add support for <struct> and <flags> in target descriptions Daniel Jacobowitz
2010-02-22 19:32 ` Eli Zaretskii
2010-03-01  0:15 ` H.J. Lu
2010-03-01  0:57   ` H.J. Lu
2010-03-01  2:20     ` H.J. Lu
2010-03-01 17:20       ` Daniel Jacobowitz
2010-03-01 17:26         ` H.J. Lu
2010-03-01  2:46     ` Daniel Jacobowitz
2010-03-01  3:06       ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox