This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Target-description enhancement for typed-bitfield and enum-type.


Hi,

This is a patch supporting target-description typed-bitfield and enum-type.

Current bitfield doesn't support explicit type.
However, the formats of non-GPRs are usually complex.  It's not friendly
to represent such registers by a simple numeric.
For example, CPSR register of ARM.

   (gdb) p $cpsr
   $1 = 1610612784

With this patch, we could use target-description to describe
complex register formats, for example

   (gdb) p $cpsr
   $1 = {[ T C Z ], M = User, IT_cond = 0, GE = 0, DNM = 0}

Wei-cheng Wang
--

2013-12-17  Wei-cheng Wang  <cole945@gmail.com>

	* target-description.c (struct tdesc_type) Add TDESC_TYPE_ENUM
	  (tdesc_gdb_type): Revise TDESC_TYPE_STRUCT for bitfields.
	  Handle TDESC_TYPE_ENUM.
	  (tdesc_free_type): Cleanup TDESC_TYPE_ENUM.
	  (tdesc_add_field): Initial start/end for non-bitfields.
	  (tdesc_add_bitfield): Add filed-type parameter.
	  (tdesc_add_flag): Handle TDESC_TYPE_ENUM too.
	  (maint_print_c_tdesc_cmd): Handle typed-bitfled and TDESC_TYPE_ENUM.
	* target-description.h (tdesc_create_enum): Declare.
	  (tdesc_add_bitfield): Add field_type parameter.
	* xml-tdesc.c (tdesc_start_enum): New function for enum.
	  (tdesc_start_field): Handle typed-bitfield.
	  (enum_attributes): Add gdb_xml_attribute definition for enum.
	  (vector_attributes): Ditto.
	* features/gdb-target.dtd: Add enum element.
	* features/i386/amd64-mpx-linux.c: Re-generated.
	* features/i386/amd64-mpx.c: Ditto.
	* features/i386/i386-mpx-linux.c: Ditto.
	* features/i386/i386-mpx.c: Ditto.


--
 gdb/features/gdb-target.dtd         |  5 +++
 gdb/target-descriptions.c           | 90 +++++++++++++++++++++++++++++++++++++++------
 gdb/target-descriptions.h           |  5 ++-
 gdb/xml-tdesc.c                     | 84 +++++++++++++++++++++++++++---------------
 gdb/features/i386/amd64-mpx-linux.c | 18 ++++++++++++------
 gdb/features/i386/amd64-mpx.c       | 18 ++++++++++++------
 gdb/features/i386/i386-mpx-linux.c  | 18 ++++++++++++------
 gdb/features/i386/i386-mpx.c        | 18 ++++++++++++------

diff --git a/gdb/features/gdb-target.dtd b/gdb/features/gdb-target.dtd
index 0900d2c..646b986 100644
--- a/gdb/features/gdb-target.dtd
+++ b/gdb/features/gdb-target.dtd
@@ -45,6 +45,11 @@
 	id		CDATA	#REQUIRED
 	size		CDATA	#REQUIRED>

+<!ELEMENT enum		(field+)>
+<!ATTLIST enum
+	id		CDATA	#REQUIRED
+	size		CDATA	#REQUIRED>
+
 <!ELEMENT struct	(field+)>
 <!ATTLIST struct
 	id		CDATA	#REQUIRED
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 1410c02..8da367b 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -132,7 +132,8 @@ typedef struct tdesc_type
     TDESC_TYPE_VECTOR,
     TDESC_TYPE_STRUCT,
     TDESC_TYPE_UNION,
-    TDESC_TYPE_FLAGS
+    TDESC_TYPE_FLAGS,
+    TDESC_TYPE_ENUM
   } kind;

   /* Kind-specific data.  */
@@ -688,7 +689,7 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
 	     VEC_iterate (tdesc_type_field, tdesc_type->u.u.fields, ix, f);
 	     ix++)
 	  {
-	    if (f->type == NULL)
+	    if (f->start != -1 && f->end != -1)
 	      {
 		/* Bitfield.  */
 		struct field *fld;
@@ -698,7 +699,9 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
 		/* This invariant should be preserved while creating
 		   types.  */
 		gdb_assert (tdesc_type->u.u.size != 0);
-		if (tdesc_type->u.u.size > 4)
+		if (f->type != NULL)
+		  field_type = tdesc_gdb_type (gdbarch, f->type);
+		else if (tdesc_type->u.u.size > 4)
 		  field_type = builtin_type (gdbarch)->builtin_uint64;
 		else
 		  field_type = builtin_type (gdbarch)->builtin_uint32;
@@ -777,6 +780,27 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)

 	return type;
       }
+
+    case TDESC_TYPE_ENUM:
+      {
+	struct tdesc_type_flag *f;
+	int ix;
+
+	type = arch_type (gdbarch, TYPE_CODE_ENUM,
+			  tdesc_type->u.f.size, tdesc_type->name);
+	TYPE_UNSIGNED (type) = 1;
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_flag, tdesc_type->u.f.flags, ix, f);
+	     ix++)
+	  {
+	    struct field *fld;
+	    fld = append_composite_type_field_raw (type,
+					xstrdup (f->name), NULL);
+	    SET_FIELD_BITPOS (fld[0], f->start);
+	  }
+
+	return type;
+      }
     }

   internal_error (__FILE__, __LINE__,
@@ -1278,6 +1302,7 @@ tdesc_free_type (struct tdesc_type *type)
       }
       break;

+    case TDESC_TYPE_ENUM:
     case TDESC_TYPE_FLAGS:
       {
 	struct tdesc_type_flag *f;
@@ -1364,6 +1389,20 @@ tdesc_create_flags (struct tdesc_feature *feature, const char *name,
   return type;
 }

+struct tdesc_type *
+tdesc_create_enum (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_ENUM;
+  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).  */
@@ -1379,6 +1418,10 @@ tdesc_add_field (struct tdesc_type *type, const char *field_name,

   f.name = xstrdup (field_name);
   f.type = field_type;
+  /* Initialize these values so we know this is not a bit-field
+     when print-c-tdesc.  */
+  f.start = -1;
+  f.end = -1;

   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
@@ -1387,7 +1430,7 @@ tdesc_add_field (struct tdesc_type *type, const char *field_name,

 void
 tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
-		    int start, int end)
+		    int start, int end, struct tdesc_type *field_type)
 {
   struct tdesc_type_field f = { 0 };

@@ -1396,6 +1439,7 @@ tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
   f.name = xstrdup (field_name);
   f.start = start;
   f.end = end;
+  f.type = field_type;

   VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
 }
@@ -1406,7 +1450,8 @@ tdesc_add_flag (struct tdesc_type *type, int start,
 {
   struct tdesc_type_flag f = { 0 };

-  gdb_assert (type->kind == TDESC_TYPE_FLAGS);
+  gdb_assert (type->kind == TDESC_TYPE_FLAGS
+	      || type->kind == TDESC_TYPE_ENUM);

   f.name = xstrdup (flag_name);
   f.start = start;
@@ -1759,21 +1804,29 @@ feature = tdesc_create_feature (result, \"%s\");\n",
 		   VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
 		   ix3++)
 		{
-		  /* Going first for implicitly sized types, else part handles
-		     bitfields.  As reported on xml-tdesc.c implicitly sized types
-		     cannot contain a bitfield.  */
+		  const char *type_name;
+
 		  if (f->type != NULL)
+		    type_name = f->type->name;
+		  else if (type->u.u.size > 4)
+		    type_name = "uint64";
+		  else
+		    type_name = "uint32";
+
+		  printf_unfiltered
+		    ("  field_type = tdesc_named_type (feature, \"%s\");\n",
+		     type_name);
+		  /* If start and end are not specified at all, then it is
+		     a bitfield.  */
+		  if (f->start == -1 || f->end == -1)
 		    {
 		      printf_unfiltered
-			("  field_type = tdesc_named_type (feature, \"%s\");\n",
-			 f->type->name);
-		      printf_unfiltered
 			("  tdesc_add_field (type, \"%s\", field_type);\n",
 			 f->name);
 		    }
 		  else
 		    printf_unfiltered
-		      ("  tdesc_add_bitfield (type, \"%s\", %d, %d);\n",
+		      ("  tdesc_add_bitfield (type, \"%s\", %d, %d, field_type);\n",
 		       f->name, f->start, f->end);
 		}
 	      break;
@@ -1805,6 +1858,19 @@ feature = tdesc_create_feature (result, \"%s\");\n",
 		  ("  tdesc_add_flag (field_type, %d, \"%s\");\n",
 		   flag->start, flag->name);
 	      break;
+	    case TDESC_TYPE_ENUM:
+	      printf_unfiltered
+		("  field_type = tdesc_create_enum (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);
 	    }
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index e9369ad..d15ee37 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -235,10 +235,13 @@ struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
 struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
 				       const char *name,
 				       LONGEST size);
+struct tdesc_type *tdesc_create_enum (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);
+			 int start, int end, struct tdesc_type *field_type);
 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,
diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c
index b9207d1..8fac3b5 100644
--- a/gdb/xml-tdesc.c
+++ b/gdb/xml-tdesc.c
@@ -286,6 +286,24 @@ tdesc_start_flags (struct gdb_xml_parser *parser,
   data->current_type_is_flags = 1;
 }

+static void
+tdesc_start_enum (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 = xml_find_attribute (attributes, "id")->value;
+  int length = (int) * (ULONGEST *)
+    xml_find_attribute (attributes, "size")->value;
+  struct tdesc_type *type;
+
+  type = tdesc_create_enum (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 struct or union.  */

@@ -304,9 +322,15 @@ tdesc_start_field (struct gdb_xml_parser *parser,

   attr = xml_find_attribute (attributes, "type");
   if (attr != NULL)
-    field_type_id = attr->value;
+    {
+      field_type_id = attr->value;
+      field_type = tdesc_named_type (data->current_feature, field_type_id);
+    }
   else
-    field_type_id = NULL;
+    {
+      field_type_id = NULL;
+      field_type = NULL;
+    }

   attr = xml_find_attribute (attributes, "start");
   if (attr != NULL)
@@ -320,26 +344,7 @@ tdesc_start_field (struct gdb_xml_parser *parser,
   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)
+  if (start != -1 && end != -1)
     {
       struct tdesc_type *t = data->current_type;

@@ -347,12 +352,6 @@ tdesc_start_field (struct gdb_xml_parser *parser,
 	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 "
@@ -371,9 +370,27 @@ tdesc_start_field (struct gdb_xml_parser *parser,
 	    gdb_xml_error (parser,
 			   _("Bitfield \"%s\" does not fit in struct"));

-	  tdesc_add_bitfield (t, field_name, start, end);
+	  tdesc_add_bitfield (t, field_name, start, end, field_type);
 	}
     }
+  else 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);
+
+      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
     gdb_xml_error (parser, _("Field \"%s\" has neither type nor bit position"),
 		   field_name);
@@ -444,6 +461,12 @@ static const struct gdb_xml_attribute flags_attributes[] = {
   { NULL, GDB_XML_AF_NONE, NULL, NULL }
 };

+static const struct gdb_xml_attribute enum_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 }
+};
+
 static const struct gdb_xml_attribute vector_attributes[] = {
   { "id", GDB_XML_AF_NONE, NULL, NULL },
   { "type", GDB_XML_AF_NONE, NULL, NULL },
@@ -469,6 +492,9 @@ static const struct gdb_xml_element feature_children[] = {
   { "flags", flags_attributes, struct_union_children,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_flags, NULL },
+  { "enum", enum_attributes, struct_union_children,
+    GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
+    tdesc_start_enum, NULL },
   { "vector", vector_attributes, NULL,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_vector, NULL },
diff --git a/gdb/features/i386/amd64-mpx-linux.c b/gdb/features/i386/amd64-mpx-linux.c
index 86a1774..c360005 100644
--- a/gdb/features/i386/amd64-mpx-linux.c
+++ b/gdb/features/i386/amd64-mpx-linux.c
@@ -178,8 +178,10 @@ initialize_tdesc_amd64_mpx_linux (void)

   type = tdesc_create_struct (feature, "_bndstatus");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "bde", 2, 63, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "error", 0, 1, field_type);

   type = tdesc_create_union (feature, "status");
   field_type = tdesc_named_type (feature, "data_ptr");
@@ -189,10 +191,14 @@ initialize_tdesc_amd64_mpx_linux (void)

   type = tdesc_create_struct (feature, "_bndcfgu");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "base", 12, 63, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "reserved", 2, 11, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "preserved", 1, 1, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "enabled", 0, 0, field_type);

   type = tdesc_create_union (feature, "cfgu");
   field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/amd64-mpx.c b/gdb/features/i386/amd64-mpx.c
index 15ae5f7..ce40302 100644
--- a/gdb/features/i386/amd64-mpx.c
+++ b/gdb/features/i386/amd64-mpx.c
@@ -173,8 +173,10 @@ initialize_tdesc_amd64_mpx (void)

   type = tdesc_create_struct (feature, "_bndstatus");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "bde", 2, 63, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "error", 0, 1, field_type);

   type = tdesc_create_union (feature, "status");
   field_type = tdesc_named_type (feature, "data_ptr");
@@ -184,10 +186,14 @@ initialize_tdesc_amd64_mpx (void)

   type = tdesc_create_struct (feature, "_bndcfgu");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "base", 12, 63, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "reserved", 2, 11, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "preserved", 1, 1, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "enabled", 0, 0, field_type);

   type = tdesc_create_union (feature, "cfgu");
   field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-mpx-linux.c b/gdb/features/i386/i386-mpx-linux.c
index dbf8789..f1e7062 100644
--- a/gdb/features/i386/i386-mpx-linux.c
+++ b/gdb/features/i386/i386-mpx-linux.c
@@ -154,8 +154,10 @@ initialize_tdesc_i386_mpx_linux (void)

   type = tdesc_create_struct (feature, "_bndstatus");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 31);
-  tdesc_add_bitfield (type, "error", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "bde", 2, 31, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "error", 0, 1, field_type);

   type = tdesc_create_union (feature, "status");
   field_type = tdesc_named_type (feature, "data_ptr");
@@ -165,10 +167,14 @@ initialize_tdesc_i386_mpx_linux (void)

   type = tdesc_create_struct (feature, "_bndcfgu");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 31);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "base", 12, 31, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "reserved", 2, 11, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "preserved", 1, 1, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "enabled", 0, 1, field_type);

   type = tdesc_create_union (feature, "cfgu");
   field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-mpx.c b/gdb/features/i386/i386-mpx.c
index 1e04afd..af23b65 100644
--- a/gdb/features/i386/i386-mpx.c
+++ b/gdb/features/i386/i386-mpx.c
@@ -149,8 +149,10 @@ initialize_tdesc_i386_mpx (void)

   type = tdesc_create_struct (feature, "_bndstatus");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 31);
-  tdesc_add_bitfield (type, "error", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "bde", 2, 31, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "error", 0, 1, field_type);

   type = tdesc_create_union (feature, "status");
   field_type = tdesc_named_type (feature, "data_ptr");
@@ -160,10 +162,14 @@ initialize_tdesc_i386_mpx (void)

   type = tdesc_create_struct (feature, "_bndcfgu");
   tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 31);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "base", 12, 31, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "reserved", 2, 11, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "preserved", 1, 1, field_type);
+  field_type = tdesc_named_type (feature, "uint64");
+  tdesc_add_bitfield (type, "enabled", 0, 1, field_type);

   type = tdesc_create_union (feature, "cfgu");
   field_type = tdesc_named_type (feature, "data_ptr");
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]