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]

Per-type architecture (Re: [10/15] Basic value access routines)


Hello,

> That was one of main design questions of this whole effort.  The problems
> with associating a gdbarch with a type (and subsequently using the arch
> of a value's type as the arch of the value) is that:
> 
> - We have architecture-independent types (e.g. builtin_type_void,
>   builtin_type_int32 etc.), and last time we discussed this, the
>   consensus was that we want to keep this option
> 
> - The bulk of types is read in from symbol files -- these could be
>   associated with the generic objfile arch at this point, but that
>   is not sufficient as a value arch.  For example, the objfile arch
>   does not contain specific register number associations; those are
>   only determined by a run-time arch from the target.  For values
>   refering to registers, we need the latter however.

[It turns out the second point isn't really applicable as in those
situations where we need register number associations, we have in
fact the related frame ID and its architecture available, and
already use it.]

As to the first point, upon further investigation, it does seem
feasible to ensure every type is related to an architecture, and
this does in fact significantly simplify the rest of the patches.

Dan, one of the reasons you brought up to keep architecture-independent
types -back when I first started attempting to eliminate then- was the
target-descriptions infrastructure.  This currently builds up GDB type
structures while parsing the XML file, long before we know the actual
target gdbarch to use.

However, it seems to me it is relatively straightforward to delay
creation of GDB types until we're in tdesc_register_type, where we
know the target gdbarch.  This simply requires that while parsing
the XML file, we store the type details into temporary data structures
just like we do with all the other information read from XML.

The following patch does so, using a new "tdesc_type" structure to
hold type information from XML files.  Does this look reasonable?

Tested on powerpc64-linux.

Bye,
Ulrich



ChangeLog:

	* target-descriptions.h (struct type): Do not declare.
	(struct tdesc_type): Declare.
	(tdesc_named_type): Change return type to struct tdesc_type *.
	(tdesc_record_type): Remove.
	(tdesc_create_vector): Add prototype.
	(tdesc_create_union): Likewise.
	(tdesc_add_field): Likewise.

	* target-descriptions.c (struct tdesc_reg): Replace gdb_type
	member by tdesc_type member.
	(struct tdesc_type_field, tdesc_type_field): Add type and vector def.
	(struct tdesc_type, tdesc_type_p): Likewise.
	(struct tdesc_arch_reg, tdesc_arch_reg): Likewise.
	(struct tdesc_feature): Change type of "types" to VEC(tdesc_type_p).
	(struct tdesc_arch_data): Replace registers member by arch_regs.

	(tdesc_predefined_types): Change to array of pre-defined
	struct tdesc_type structures.  Add "code_ptr" and "data_ptr".
	(tdesc_named_type): Return struct tdesc_type * instead of GDB type.
	(tdesc_gdb_type): New function.

	(target_find_description): Update for data structure changes.
	(tdesc_data_cleanup): Likewise.
	(tdesc_numbered_register): Likewise.
	(tdesc_use_registers): Likewise.
	(tdesc_create_reg): Likewise.
	
	(tdesc_find_arch_register): New function.
	(tdesc_find_register): Use it.
	(tdesc_register_type): Use tdesc_gdb_type to generate GDB type from
	tdesc_type on demand; cache generated types in tdesc_arch_reg.

	(tdesc_free_type): New function.
	(tdesc_free_feature): Call it.

	(tdesc_create_vector): New function.
	(tdesc_create_union): Likewise.
	(tdesc_add_field): Likewise.
	(tdesc_record_type): Remove.

	(tdesc_type_id): Remove.
	(maint_print_c_tdesc_cmd): Update for data structure changes.  Update
	generated code to create tdesc_type structures instead of GDB types.

	* xml-tdesc.c: Do not include "gdbtypes.h".
	(struct tdesc_parsing_data): Change type of current_union to
	struct tdesc_type *.
	(tdesc_start_reg): Do not special-case "code_ptr" or "data_ptr".
	(tdesc_start_union): Call tdesc_create_union.
	(tdesc_start_field): Call tdesc_add_field.
	(tdesc_start_vector): Call tdesc_create_vector.
	(tdesc_end_union): Remove.
	(feature_children): Remove reference to tdesc_end_union.

	* features/arm-with-iwmmxt.c: Regenerate.
	* features/mips-linux.c: Regenerate.
	* features/mips64-linux.c: Regenerate.
	* features/rs6000/powerpc-32.c: Regenerate.
	* features/rs6000/powerpc-32l.c: Regenerate.
	* features/rs6000/powerpc-403.c: Regenerate.
	* features/rs6000/powerpc-403gc.c: Regenerate.
	* features/rs6000/powerpc-505.c: Regenerate.
	* features/rs6000/powerpc-601.c: Regenerate.
	* features/rs6000/powerpc-602.c: Regenerate.
	* features/rs6000/powerpc-603.c: Regenerate.
	* features/rs6000/powerpc-604.c: Regenerate.
	* features/rs6000/powerpc-64.c: Regenerate.
	* features/rs6000/powerpc-64l.c: Regenerate.
	* features/rs6000/powerpc-7400.c: Regenerate.
	* features/rs6000/powerpc-750.c: Regenerate.
	* features/rs6000/powerpc-860.c: Regenerate.
	* features/rs6000/powerpc-altivec32.c: Regenerate.
	* features/rs6000/powerpc-altivec32l.c: Regenerate.
	* features/rs6000/powerpc-altivec64.c: Regenerate.
	* features/rs6000/powerpc-altivec64l.c: Regenerate.
	* features/rs6000/powerpc-e500.c: Regenerate.
	* features/rs6000/powerpc-e500l.c: Regenerate.
	* features/rs6000/powerpc-isa205-32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-64l.c: Regenerate.
	* features/rs6000/powerpc-isa205-altivec32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-altivec64l.c: Regenerate.
	* features/rs6000/powerpc-isa205-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-isa205-vsx64l.c: Regenerate.
	* features/rs6000/powerpc-vsx32.c: Regenerate.
	* features/rs6000/powerpc-vsx32l.c: Regenerate.
	* features/rs6000/powerpc-vsx64.c: Regenerate.
	* features/rs6000/powerpc-vsx64l.c: Regenerate.
	* features/rs6000/rs6000.c: Regenerate.

Index: gdb-head/gdb/target-descriptions.c
===================================================================
--- gdb-head.orig/gdb/target-descriptions.c
+++ gdb-head/gdb/target-descriptions.c
@@ -79,13 +79,67 @@ typedef struct tdesc_reg
   char *type;
 
   /* The target-described type corresponding to TYPE, if found.  */
-  struct type *gdb_type;
+  struct tdesc_type *tdesc_type;
 } *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
 
 /* A named type from a target description.  */
-typedef struct type *type_p;
-DEF_VEC_P(type_p);
+
+typedef struct tdesc_type_field
+{
+  char *name;
+  struct tdesc_type *type;
+} tdesc_type_field;
+DEF_VEC_O(tdesc_type_field);
+
+typedef struct tdesc_type
+{
+  /* The name of this type.  */
+  char *name;
+
+  /* Identify the kind of this type.  */
+  enum
+  {
+    /* Predefined types.  */
+    TDESC_TYPE_INT8,
+    TDESC_TYPE_INT16,
+    TDESC_TYPE_INT32,
+    TDESC_TYPE_INT64,
+    TDESC_TYPE_INT128,
+    TDESC_TYPE_UINT8,
+    TDESC_TYPE_UINT16,
+    TDESC_TYPE_UINT32,
+    TDESC_TYPE_UINT64,
+    TDESC_TYPE_UINT128,
+    TDESC_TYPE_CODE_PTR,
+    TDESC_TYPE_DATA_PTR,
+    TDESC_TYPE_IEEE_SINGLE,
+    TDESC_TYPE_IEEE_DOUBLE,
+    TDESC_TYPE_ARM_FPA_EXT,
+
+    /* Types defined by a target feature.  */
+    TDESC_TYPE_VECTOR,
+    TDESC_TYPE_UNION
+  } kind;
+
+  /* Kind-specific data.  */
+  union
+  {
+    /* Vector type.  */
+    struct
+    {
+      struct tdesc_type *type;
+      int count;
+    } v;
+
+    /* Union type.  */
+    struct
+    {
+      VEC(tdesc_type_field) *fields;
+    } u;
+  } u;
+} *tdesc_type_p;
+DEF_VEC_P(tdesc_type_p);
 
 /* A feature from a target description.  Each feature is a collection
    of other elements, e.g. registers and types.  */
@@ -100,7 +154,7 @@ typedef struct tdesc_feature
   VEC(tdesc_reg_p) *registers;
 
   /* The types associated with this feature.  */
-  VEC(type_p) *types;
+  VEC(tdesc_type_p) *types;
 } *tdesc_feature_p;
 DEF_VEC_P(tdesc_feature_p);
 
@@ -122,15 +176,22 @@ struct target_desc
    target description may be shared by multiple architectures, but
    this data is private to one gdbarch.  */
 
+typedef struct tdesc_arch_reg
+{
+  struct tdesc_reg *reg;
+  struct type *type;
+} tdesc_arch_reg;
+DEF_VEC_O(tdesc_arch_reg);
+
 struct tdesc_arch_data
 {
-  /* A list of registers, indexed by GDB's internal register number.
+  /* A list of register/type pairs, indexed by GDB's internal register number.
      During initialization of the gdbarch this list is used to store
      registers which the architecture assigns a fixed register number.
      Registers which are NULL in this array, or off the end, are
      treated as zero-sized and nameless (i.e. placeholders in the
      numbering).  */
-  VEC(tdesc_reg_p) *registers;
+  VEC(tdesc_arch_reg) *arch_regs;
 
   /* Functions which report the register name, type, and reggroups for
      pseudo-registers.  */
@@ -218,7 +279,7 @@ target_find_description (void)
 
 	  data = gdbarch_data (target_gdbarch, tdesc_data);
 	  if (tdesc_has_registers (current_target_desc)
-	      && data->registers == NULL)
+	      && data->arch_regs == NULL)
 	    warning (_("Target-supplied registers are not supported "
 		       "by the current architecture"));
 	}
@@ -339,51 +400,145 @@ tdesc_feature_name (const struct tdesc_f
   return feature->name;
 }
 
-/* Predefined types.  Note that none of these types depend on the
-   current architecture; some of the builtin_type_foo variables are
-   swapped based on the architecture.  */
-static struct
-{
-  const char *name;
-  struct type **type;
-} tdesc_predefined_types[] =
-  {
-    { "int8", &builtin_type_int8 },
-    { "int16", &builtin_type_int16 },
-    { "int32", &builtin_type_int32 },
-    { "int64", &builtin_type_int64 },
-    { "int128", &builtin_type_int128 },
-    { "uint8", &builtin_type_uint8 },
-    { "uint16", &builtin_type_uint16 },
-    { "uint32", &builtin_type_uint32 },
-    { "uint64", &builtin_type_uint64 },
-    { "uint128", &builtin_type_uint128 },
-    { "ieee_single", &builtin_type_ieee_single },
-    { "ieee_double", &builtin_type_ieee_double },
-    { "arm_fpa_ext", &builtin_type_arm_ext }
-  };
+/* Predefined types.  */
+static struct tdesc_type tdesc_predefined_types[] =
+{
+  { "int8", TDESC_TYPE_INT8 },
+  { "int16", TDESC_TYPE_INT16 },
+  { "int32", TDESC_TYPE_INT32 },
+  { "int64", TDESC_TYPE_INT64 },
+  { "int128", TDESC_TYPE_INT128 },
+  { "uint8", TDESC_TYPE_UINT8 },
+  { "uint16", TDESC_TYPE_UINT16 },
+  { "uint32", TDESC_TYPE_UINT32 },
+  { "uint64", TDESC_TYPE_UINT64 },
+  { "uint128", TDESC_TYPE_UINT128 },
+  { "code_ptr", TDESC_TYPE_CODE_PTR },
+  { "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 }
+};
 
 /* Return the type associated with ID in the context of FEATURE, or
    NULL if none.  */
 
-struct type *
+struct tdesc_type *
 tdesc_named_type (const struct tdesc_feature *feature, const char *id)
 {
   int ix;
-  struct type *gdb_type;
+  struct tdesc_type *type;
 
   /* First try target-defined types.  */
-  for (ix = 0; VEC_iterate (type_p, feature->types, ix, gdb_type); ix++)
-    if (strcmp (TYPE_NAME (gdb_type), id) == 0)
-      return gdb_type;
+  for (ix = 0; VEC_iterate (tdesc_type_p, feature->types, ix, type); ix++)
+    if (strcmp (type->name, id) == 0)
+      return type;
 
   /* Next try the predefined types.  */
   for (ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++)
     if (strcmp (tdesc_predefined_types[ix].name, id) == 0)
-      return *tdesc_predefined_types[ix].type;
+      return &tdesc_predefined_types[ix];
 
   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)
+{
+  switch (tdesc_type->kind)
+    {
+    /* Predefined types.  */
+    case TDESC_TYPE_INT8:
+      return builtin_type_int8;
+
+    case TDESC_TYPE_INT16:
+      return builtin_type_int16;
+
+    case TDESC_TYPE_INT32:
+      return builtin_type_int32;
+
+    case TDESC_TYPE_INT64:
+      return builtin_type_int64;
+
+    case TDESC_TYPE_INT128:
+      return builtin_type_int128;
+
+    case TDESC_TYPE_UINT8:
+      return builtin_type_uint8;
+
+    case TDESC_TYPE_UINT16:
+      return builtin_type_uint16;
+
+    case TDESC_TYPE_UINT32:
+      return builtin_type_uint32;
+
+    case TDESC_TYPE_UINT64:
+      return builtin_type_uint64;
+
+    case TDESC_TYPE_UINT128:
+      return builtin_type_uint128;
+
+    case TDESC_TYPE_CODE_PTR:
+      return builtin_type (gdbarch)->builtin_func_ptr;
+
+    case TDESC_TYPE_DATA_PTR:
+      return builtin_type (gdbarch)->builtin_data_ptr;
+
+    case TDESC_TYPE_IEEE_SINGLE:
+      return builtin_type_ieee_single;
+
+    case TDESC_TYPE_IEEE_DOUBLE:
+      return builtin_type_ieee_double;
+
+    case TDESC_TYPE_ARM_FPA_EXT:
+      return builtin_type_arm_ext;
+
+    /* Types defined by a target feature.  */
+    case TDESC_TYPE_VECTOR:
+      {
+	struct type *type, *field_type;
+
+	field_type = tdesc_gdb_type (gdbarch, tdesc_type->u.v.type);
+	type = init_vector_type (field_type, tdesc_type->u.v.count);
+	TYPE_NAME (type) = xstrdup (tdesc_type->name);
+
+	return type;
+      }
+
+    case TDESC_TYPE_UNION:
+      {
+	struct type *type, *field_type;
+	struct tdesc_type_field *f;
+	int ix;
+
+	type = init_composite_type (NULL, TYPE_CODE_UNION);
+	TYPE_NAME (type) = xstrdup (tdesc_type->name);
+
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_field, tdesc_type->u.u.fields, ix, f);
+	     ix++)
+	  {
+	    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
+	       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;
+      }
+    }
+
+  internal_error (__FILE__, __LINE__,
+		  "Type \"%s\" has an unknown kind %d",
+		  tdesc_type->name, tdesc_type->kind);
+}
 
 
 /* Support for registers from target descriptions.  */
@@ -417,7 +572,7 @@ tdesc_data_cleanup (void *data_untyped)
 {
   struct tdesc_arch_data *data = data_untyped;
 
-  VEC_free (tdesc_reg_p, data->registers);
+  VEC_free (tdesc_arch_reg, data->arch_regs);
   xfree (data);
 }
 
@@ -446,15 +601,18 @@ tdesc_numbered_register (const struct td
 			 struct tdesc_arch_data *data,
 			 int regno, const char *name)
 {
+  struct tdesc_arch_reg arch_reg = { 0 };
   struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
 
   if (reg == NULL)
     return 0;
 
   /* Make sure the vector includes a REGNO'th element.  */
-  while (regno >= VEC_length (tdesc_reg_p, data->registers))
-    VEC_safe_push (tdesc_reg_p, data->registers, NULL);
-  VEC_replace (tdesc_reg_p, data->registers, regno, reg);
+  while (regno >= VEC_length (tdesc_arch_reg, data->arch_regs))
+    VEC_safe_push (tdesc_arch_reg, data->arch_regs, &arch_reg);
+
+  arch_reg.reg = reg;
+  VEC_replace (tdesc_arch_reg, data->arch_regs, regno, &arch_reg);
   return 1;
 }
 
@@ -490,19 +648,26 @@ tdesc_register_size (const struct tdesc_
 
 /* Look up a register by its GDB internal register number.  */
 
-static struct tdesc_reg *
-tdesc_find_register (struct gdbarch *gdbarch, int regno)
+static struct tdesc_arch_reg *
+tdesc_find_arch_register (struct gdbarch *gdbarch, int regno)
 {
-  struct tdesc_reg *reg;
+  struct tdesc_arch_reg *reg;
   struct tdesc_arch_data *data;
 
   data = gdbarch_data (gdbarch, tdesc_data);
-  if (regno < VEC_length (tdesc_reg_p, data->registers))
-    return VEC_index (tdesc_reg_p, data->registers, regno);
+  if (regno < VEC_length (tdesc_arch_reg, data->arch_regs))
+    return VEC_index (tdesc_arch_reg, data->arch_regs, regno);
   else
     return NULL;
 }
 
+static struct tdesc_reg *
+tdesc_find_register (struct gdbarch *gdbarch, int regno)
+{
+  struct tdesc_arch_reg *reg = tdesc_find_arch_register (gdbarch, regno);
+  return reg? reg->reg : NULL;
+}
+
 /* Return the name of register REGNO, from the target description or
    from an architecture-provided pseudo_register_name method.  */
 
@@ -529,7 +694,8 @@ tdesc_register_name (struct gdbarch *gdb
 static struct type *
 tdesc_register_type (struct gdbarch *gdbarch, int regno)
 {
-  struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
+  struct tdesc_arch_reg *arch_reg = tdesc_find_arch_register (gdbarch, regno);
+  struct tdesc_reg *reg = arch_reg? arch_reg->reg : NULL;
   int num_regs = gdbarch_num_regs (gdbarch);
   int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
 
@@ -544,48 +710,58 @@ tdesc_register_type (struct gdbarch *gdb
     /* Return "int0_t", since "void" has a misleading size of one.  */
     return builtin_type_int0;
 
-  /* First check for a predefined or target defined type.  */
-  if (reg->gdb_type)
-    return reg->gdb_type;
-
-  /* Next try size-sensitive type shortcuts.  */
-  if (strcmp (reg->type, "float") == 0)
-    {
-      if (reg->bitsize == gdbarch_float_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_float;
-      else if (reg->bitsize == gdbarch_double_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_double;
-      else if (reg->bitsize == gdbarch_long_double_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_long_double;
-    }
-  else if (strcmp (reg->type, "int") == 0)
+  if (arch_reg->type == NULL)
     {
-      if (reg->bitsize == gdbarch_long_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_long;
-      else if (reg->bitsize == TARGET_CHAR_BIT)
-	return builtin_type (gdbarch)->builtin_char;
-      else if (reg->bitsize == gdbarch_short_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_short;
-      else if (reg->bitsize == gdbarch_int_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_int;
-      else if (reg->bitsize == gdbarch_long_long_bit (gdbarch))
-	return builtin_type (gdbarch)->builtin_long_long;
-      else if (reg->bitsize == gdbarch_ptr_bit (gdbarch))
-	/* A bit desperate by this point... */
-	return builtin_type (gdbarch)->builtin_data_ptr;
+      /* First check for a predefined or target defined type.  */
+      if (reg->tdesc_type)
+        arch_reg->type = tdesc_gdb_type (gdbarch, reg->tdesc_type);
+
+      /* Next try size-sensitive type shortcuts.  */
+      else if (strcmp (reg->type, "float") == 0)
+	{
+	  if (reg->bitsize == gdbarch_float_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_float;
+	  else if (reg->bitsize == gdbarch_double_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_double;
+	  else if (reg->bitsize == gdbarch_long_double_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_long_double;
+	  else
+	    {
+	      warning (_("Register \"%s\" has an unsupported size (%d bits)"),
+		       reg->name, reg->bitsize);
+	      arch_reg->type = builtin_type (gdbarch)->builtin_double;
+	    }
+	}
+      else if (strcmp (reg->type, "int") == 0)
+	{
+	  if (reg->bitsize == gdbarch_long_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_long;
+	  else if (reg->bitsize == TARGET_CHAR_BIT)
+	    arch_reg->type = builtin_type (gdbarch)->builtin_char;
+	  else if (reg->bitsize == gdbarch_short_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_short;
+	  else if (reg->bitsize == gdbarch_int_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_int;
+	  else if (reg->bitsize == gdbarch_long_long_bit (gdbarch))
+	    arch_reg->type = builtin_type (gdbarch)->builtin_long_long;
+	  else if (reg->bitsize == gdbarch_ptr_bit (gdbarch))
+	  /* A bit desperate by this point... */
+	    arch_reg->type = builtin_type (gdbarch)->builtin_data_ptr;
+	  else
+	    {
+	      warning (_("Register \"%s\" has an unsupported size (%d bits)"),
+		       reg->name, reg->bitsize);
+	      arch_reg->type = builtin_type (gdbarch)->builtin_long;
+	    }
+	}
+
+      if (arch_reg->type == NULL)
+	internal_error (__FILE__, __LINE__,
+			"Register \"%s\" has an unknown type \"%s\"",
+			reg->name, reg->type);
     }
-  else if (strcmp (reg->type, "code_ptr") == 0)
-    return builtin_type (gdbarch)->builtin_func_ptr;
-  else if (strcmp (reg->type, "data_ptr") == 0)
-    return builtin_type (gdbarch)->builtin_data_ptr;
-  else
-    internal_error (__FILE__, __LINE__,
-		    "Register \"%s\" has an unknown type \"%s\"",
-		    reg->name, reg->type);
 
-  warning (_("Register \"%s\" has an unsupported size (%d bits)"),
-	   reg->name, reg->bitsize);
-  return builtin_type (gdbarch)->builtin_long;
+  return arch_reg->type;
 }
 
 static int
@@ -717,6 +893,7 @@ tdesc_use_registers (struct gdbarch *gdb
   struct tdesc_feature *feature;
   struct tdesc_reg *reg;
   struct tdesc_arch_data *data;
+  struct tdesc_arch_reg *arch_reg, new_arch_reg = { 0 };
   htab_t reg_hash;
 
   /* We can't use the description for registers if it doesn't describe
@@ -726,7 +903,7 @@ tdesc_use_registers (struct gdbarch *gdb
   gdb_assert (tdesc_has_registers (target_desc));
 
   data = gdbarch_data (gdbarch, tdesc_data);
-  data->registers = early_data->registers;
+  data->arch_regs = early_data->arch_regs;
   xfree (early_data);
 
   /* Build up a set of all registers, so that we can assign register
@@ -747,18 +924,20 @@ tdesc_use_registers (struct gdbarch *gdb
 
   /* Remove any registers which were assigned numbers by the
      architecture.  */
-  for (ixr = 0; VEC_iterate (tdesc_reg_p, data->registers, ixr, reg); ixr++)
-    if (reg)
-      htab_remove_elt (reg_hash, reg);
+  for (ixr = 0;
+       VEC_iterate (tdesc_arch_reg, data->arch_regs, ixr, arch_reg);
+       ixr++)
+    if (arch_reg->reg)
+      htab_remove_elt (reg_hash, arch_reg->reg);
 
   /* Assign numbers to the remaining registers and add them to the
      list of registers.  The new numbers are always above gdbarch_num_regs.
      Iterate over the features, not the hash table, so that the order
      matches that in the target description.  */
 
-  gdb_assert (VEC_length (tdesc_reg_p, data->registers) <= num_regs);
-  while (VEC_length (tdesc_reg_p, data->registers) < num_regs)
-    VEC_safe_push (tdesc_reg_p, data->registers, NULL);
+  gdb_assert (VEC_length (tdesc_arch_reg, data->arch_regs) <= num_regs);
+  while (VEC_length (tdesc_arch_reg, data->arch_regs) < num_regs)
+    VEC_safe_push (tdesc_arch_reg, data->arch_regs, &new_arch_reg);
   for (ixf = 0;
        VEC_iterate (tdesc_feature_p, target_desc->features, ixf, feature);
        ixf++)
@@ -767,7 +946,8 @@ tdesc_use_registers (struct gdbarch *gdb
 	 ixr++)
       if (htab_find (reg_hash, reg) != NULL)
 	{
-	  VEC_safe_push (tdesc_reg_p, data->registers, reg);
+	  new_arch_reg.reg = reg;
+	  VEC_safe_push (tdesc_arch_reg, data->arch_regs, &new_arch_reg);
 	  num_regs++;
 	}
 
@@ -810,27 +990,94 @@ tdesc_create_reg (struct tdesc_feature *
 
   /* If the register's type is target-defined, look it up now.  We may not
      have easy access to the containing feature when we want it later.  */
-  reg->gdb_type = tdesc_named_type (feature, reg->type);
+  reg->tdesc_type = tdesc_named_type (feature, reg->type);
 
   VEC_safe_push (tdesc_reg_p, feature->registers, reg);
 }
 
 static void
+tdesc_free_type (struct tdesc_type *type)
+{
+
+  switch (type->kind)
+    {
+    case TDESC_TYPE_UNION:
+      {
+	struct tdesc_type_field *f;
+	int ix;
+
+	for (ix = 0;
+	     VEC_iterate (tdesc_type_field, type->u.u.fields, ix, f);
+	     ix++)
+	  xfree (f->name);
+
+	VEC_free (tdesc_type_field, type->u.u.fields);
+      }
+      break;
+
+    default:
+      break;
+    }
+
+  xfree (type->name);
+  xfree (type);
+}
+
+struct tdesc_type *
+tdesc_create_vector (struct tdesc_feature *feature, const char *name,
+		     struct tdesc_type *field_type, int count)
+{
+  struct tdesc_type *type = XZALLOC (struct tdesc_type);
+
+  type->name = xstrdup (name);
+  type->kind = TDESC_TYPE_VECTOR;
+  type->u.v.type = field_type;
+  type->u.v.count = count;
+
+  VEC_safe_push (tdesc_type_p, feature->types, type);
+  return type;
+}
+
+struct tdesc_type *
+tdesc_create_union (struct tdesc_feature *feature, const char *name)
+{
+  struct tdesc_type *type = XZALLOC (struct tdesc_type);
+
+  type->name = xstrdup (name);
+  type->kind = TDESC_TYPE_UNION;
+
+  VEC_safe_push (tdesc_type_p, feature->types, type);
+  return type;
+}
+
+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);
+
+  f.name = xstrdup (field_name);
+  f.type = field_type;
+
+  VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
+}
+
+static void
 tdesc_free_feature (struct tdesc_feature *feature)
 {
   struct tdesc_reg *reg;
+  struct tdesc_type *type;
   int ix;
 
   for (ix = 0; VEC_iterate (tdesc_reg_p, feature->registers, ix, reg); ix++)
     tdesc_free_reg (reg);
   VEC_free (tdesc_reg_p, feature->registers);
 
-  /* There is no easy way to free xmalloc-allocated types, nor is
-     there a way to allocate types on an obstack not associated with
-     an objfile.  Therefore we never free types.  Since we only ever
-     parse an identical XML document once, this memory leak is mostly
-     contained.  */
-  VEC_free (type_p, feature->types);
+  for (ix = 0; VEC_iterate (tdesc_type_p, feature->types, ix, type); ix++)
+    tdesc_free_type (type);
+  VEC_free (tdesc_type_p, feature->types);
 
   xfree (feature->name);
   xfree (feature);
@@ -847,15 +1094,6 @@ tdesc_create_feature (struct target_desc
   return new_feature;
 }
 
-void
-tdesc_record_type (struct tdesc_feature *feature, struct type *type)
-{
-  /* The type's ID should be used as its TYPE_NAME.  */
-  gdb_assert (TYPE_NAME (type) != NULL);
-
-  VEC_safe_push (type_p, feature->types, type);
-}
-
 struct target_desc *
 allocate_target_description (void)
 {
@@ -976,19 +1214,6 @@ unset_tdesc_filename_cmd (char *args, in
   target_find_description ();
 }
 
-static const char *
-tdesc_type_id (struct type *type)
-{
-  int ix;
-
-  for (ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++)
-    if (TYPE_MAIN_TYPE (*tdesc_predefined_types[ix].type)
-	== TYPE_MAIN_TYPE (type))
-      return tdesc_predefined_types[ix].name;
-
-  return TYPE_NAME (type);
-}
-
 static void
 maint_print_c_tdesc_cmd (char *args, int from_tty)
 {
@@ -998,7 +1223,8 @@ maint_print_c_tdesc_cmd (char *args, int
   struct property *prop;
   struct tdesc_feature *feature;
   struct tdesc_reg *reg;
-  struct type *type;
+  struct tdesc_type *type;
+  struct tdesc_type_field *f;
   int ix, ix2, ix3;
 
   /* Use the global target-supplied description, not the current
@@ -1027,7 +1253,6 @@ maint_print_c_tdesc_cmd (char *args, int
   printf_unfiltered ("/* THIS FILE IS GENERATED.  Original: %s */\n\n",
 		     filename);
   printf_unfiltered ("#include \"defs.h\"\n");
-  printf_unfiltered ("#include \"gdbtypes.h\"\n");
   printf_unfiltered ("#include \"target-descriptions.h\"\n");
   printf_unfiltered ("\n");
 
@@ -1038,7 +1263,7 @@ maint_print_c_tdesc_cmd (char *args, int
   printf_unfiltered
     ("  struct target_desc *result = allocate_target_description ();\n");
   printf_unfiltered ("  struct tdesc_feature *feature;\n");
-  printf_unfiltered ("  struct type *field_type, *type;\n");
+  printf_unfiltered ("  struct tdesc_type *field_type, *type;\n");
   printf_unfiltered ("\n");
 
   if (tdesc_architecture (tdesc) != NULL)
@@ -1064,44 +1289,38 @@ maint_print_c_tdesc_cmd (char *args, int
 			 feature->name);
 
       for (ix2 = 0;
-	   VEC_iterate (type_p, feature->types, ix2, type);
+	   VEC_iterate (tdesc_type_p, feature->types, ix2, type);
 	   ix2++)
 	{
-	  switch (TYPE_CODE (type))
+	  switch (type->kind)
 	    {
-	    case TYPE_CODE_ARRAY:
+	    case TDESC_TYPE_VECTOR:
 	      printf_unfiltered
 		("  field_type = tdesc_named_type (feature, \"%s\");\n",
-		 tdesc_type_id (TYPE_TARGET_TYPE (type)));
+		 type->u.v.type->name);
 	      printf_unfiltered
-		("  type = init_vector_type (field_type, %d);\n",
-		 TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type)));
-	      printf_unfiltered
-		("  TYPE_NAME (type) = xstrdup (\"%s\");\n", TYPE_NAME (type));
+		("  tdesc_create_vector (feature, \"%s\", field_type, %d);\n",
+		 type->name, type->u.v.count);
 	      break;
-	    case TYPE_CODE_UNION:
-	      printf_unfiltered
-		("  type = init_composite_type (NULL, TYPE_CODE_UNION);\n");
+	    case TDESC_TYPE_UNION:
 	      printf_unfiltered
-		("  TYPE_NAME (type) = xstrdup (\"%s\");\n", TYPE_NAME (type));
-	      for (ix3 = 0; ix3 < TYPE_NFIELDS (type); ix3++)
+		("  type = tdesc_create_union (feature, \"%s\");\n",
+		 type->name);
+	      for (ix3 = 0;
+		   VEC_iterate (tdesc_type_field, type->u.u.fields, ix3, f);
+		   ix3++)
 		{
 		  printf_unfiltered
 		    ("  field_type = tdesc_named_type (feature, \"%s\");\n",
-		     tdesc_type_id (TYPE_FIELD_TYPE (type, ix3)));
+		     f->type->name);
 		  printf_unfiltered
-		    ("  append_composite_type_field (type, "
-		     "xstrdup (\"%s\"), field_type);\n",
-		     TYPE_FIELD_NAME (type, ix3));
+		    ("  tdesc_add_field (type, \"%s\", field_type);\n",
+		     f->name);
 		}
-	      if (TYPE_VECTOR (type))
-		printf_unfiltered
-		  ("  TYPE_VECTOR (type) = 1;\n");
 	      break;
 	    default:
-	      error (_("C output is not supported type \"%s\"."), TYPE_NAME (type));
+	      error (_("C output is not supported type \"%s\"."), type->name);
 	    }
-	  printf_unfiltered ("  tdesc_record_type (feature, type);\n");
 	  printf_unfiltered ("\n");
 	}
 
Index: gdb-head/gdb/target-descriptions.h
===================================================================
--- gdb-head.orig/gdb/target-descriptions.h
+++ gdb-head/gdb/target-descriptions.h
@@ -24,10 +24,10 @@
 
 struct tdesc_feature;
 struct tdesc_arch_data;
+struct tdesc_type;
 struct tdesc_reg;
 struct target_desc;
 struct target_ops;
-struct type;
 
 /* Fetch the current target's description, and switch the current
    architecture to one which incorporates that description.  */
@@ -146,8 +146,8 @@ const char *tdesc_feature_name (const st
 /* Return the type associated with ID in the context of FEATURE, or
    NULL if none.  */
 
-struct type *tdesc_named_type (const struct tdesc_feature *feature,
-			       const char *id);
+struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
+				     const char *id);
 
 /* Return the name of register REGNO, from the target description or
    from an architecture-provided pseudo_register_name method.  */
@@ -172,8 +172,14 @@ void set_tdesc_property (struct target_d
 
 struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
 					    const char *name);
-void tdesc_record_type (struct tdesc_feature *feature, struct type *type);
-
+struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
+					const char *name,
+					struct tdesc_type *field_type,
+					int count);
+struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
+				       const char *name);
+void tdesc_add_field (struct tdesc_type *type, const char *field_name,
+		      struct tdesc_type *field_type);
 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: gdb-head/gdb/xml-tdesc.c
===================================================================
--- gdb-head.orig/gdb/xml-tdesc.c
+++ gdb-head/gdb/xml-tdesc.c
@@ -20,7 +20,6 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target.h"
 #include "target-descriptions.h"
 #include "xml-support.h"
@@ -86,7 +85,7 @@ struct tdesc_parsing_data
   int next_regnum;
 
   /* The union we are currently parsing, or last parsed.  */
-  struct type *current_union;
+  struct tdesc_type *current_union;
 };
 
 /* Handle the end of an <architecture> element and its value.  */
@@ -176,8 +175,6 @@ tdesc_start_reg (struct gdb_xml_parser *
 
   if (strcmp (type, "int") != 0
       && strcmp (type, "float") != 0
-      && strcmp (type, "code_ptr") != 0
-      && strcmp (type, "data_ptr") != 0
       && tdesc_named_type (data->current_feature, type) == NULL)
     gdb_xml_error (parser, _("Register \"%s\" has unknown type \"%s\""),
 		   name, type);
@@ -198,33 +195,8 @@ 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;
-  struct type *type;
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup (id);
-  tdesc_record_type (data->current_feature, type);
-  data->current_union = type;
-}
-
-/* Handle the end of a <union> element.  */
-
-static void
-tdesc_end_union (struct gdb_xml_parser *parser,
-		 const struct gdb_xml_element *element,
-		 void *user_data, const char *body_text)
-{
-  struct tdesc_parsing_data *data = user_data;
-  int i;
-
-  /* If any of the children of this 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".  */
-  for (i = 0; i < TYPE_NFIELDS (data->current_union); i++)
-    if (TYPE_VECTOR (TYPE_FIELD_TYPE (data->current_union, i)))
-      {
-        TYPE_VECTOR (data->current_union) = 1;
-        break;
-      }
+  data->current_union = tdesc_create_union (data->current_feature, id);
 }
 
 /* Handle the start of a <field> element.  Attach the field to the
@@ -237,7 +209,7 @@ tdesc_start_field (struct gdb_xml_parser
 {
   struct tdesc_parsing_data *data = user_data;
   struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
-  struct type *type, *field_type;
+  struct tdesc_type *field_type;
   char *field_name, *field_type_id;
 
   field_name = attrs[0].value;
@@ -249,8 +221,7 @@ tdesc_start_field (struct gdb_xml_parser
 			     "type \"%s\""),
 		   field_name, field_type_id);
 
-  append_composite_type_field (data->current_union, xstrdup (field_name),
-			       field_type);
+  tdesc_add_field (data->current_union, field_name, field_type);
 }
 
 /* Handle the start of a <vector> element.  Initialize the type and
@@ -263,7 +234,7 @@ tdesc_start_vector (struct gdb_xml_parse
 {
   struct tdesc_parsing_data *data = user_data;
   struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
-  struct type *type, *field_type, *range_type;
+  struct tdesc_type *field_type;
   char *id, *field_type_id;
   int count;
 
@@ -276,10 +247,7 @@ tdesc_start_vector (struct gdb_xml_parse
     gdb_xml_error (parser, _("Vector \"%s\" references undefined type \"%s\""),
 		   id, field_type_id);
 
-  type = init_vector_type (field_type, count);
-  TYPE_NAME (type) = xstrdup (id);
-
-  tdesc_record_type (data->current_feature, type);
+  tdesc_create_vector (data->current_feature, id, field_type, count);
 }
 
 /* The elements and attributes of an XML target description.  */
@@ -330,7 +298,7 @@ static const struct gdb_xml_element feat
     tdesc_start_reg, NULL },
   { "union", union_attributes, union_children,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
-    tdesc_start_union, tdesc_end_union },
+    tdesc_start_union, NULL },
   { "vector", vector_attributes, NULL,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_vector, NULL },
Index: gdb-head/gdb/features/arm-with-iwmmxt.c
===================================================================
--- gdb-head.orig/gdb/features/arm-with-iwmmxt.c
+++ gdb-head/gdb/features/arm-with-iwmmxt.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: arm-with-iwmmxt.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_arm_with_iwmmxt;
@@ -10,7 +9,7 @@ initialize_tdesc_arm_with_iwmmxt (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("iwmmxt"));
 
@@ -35,32 +34,23 @@ initialize_tdesc_arm_with_iwmmxt (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.xscale.iwmmxt");
   field_type = tdesc_named_type (feature, "uint8");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("iwmmxt_v8u8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "iwmmxt_v8u8", field_type, 8);
 
   field_type = tdesc_named_type (feature, "uint16");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("iwmmxt_v4u16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "iwmmxt_v4u16", field_type, 4);
 
   field_type = tdesc_named_type (feature, "uint32");
-  type = init_vector_type (field_type, 2);
-  TYPE_NAME (type) = xstrdup ("iwmmxt_v2u32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "iwmmxt_v2u32", field_type, 2);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("iwmmxt_vec64i");
+  type = tdesc_create_union (feature, "iwmmxt_vec64i");
   field_type = tdesc_named_type (feature, "iwmmxt_v8u8");
-  append_composite_type_field (type, xstrdup ("u8"), field_type);
+  tdesc_add_field (type, "u8", field_type);
   field_type = tdesc_named_type (feature, "iwmmxt_v4u16");
-  append_composite_type_field (type, xstrdup ("u16"), field_type);
+  tdesc_add_field (type, "u16", field_type);
   field_type = tdesc_named_type (feature, "iwmmxt_v2u32");
-  append_composite_type_field (type, xstrdup ("u32"), field_type);
+  tdesc_add_field (type, "u32", field_type);
   field_type = tdesc_named_type (feature, "uint64");
-  append_composite_type_field (type, xstrdup ("u64"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "u64", field_type);
 
   tdesc_create_reg (feature, "wR0", 26, 1, NULL, 64, "iwmmxt_vec64i");
   tdesc_create_reg (feature, "wR1", 27, 1, NULL, 64, "iwmmxt_vec64i");
Index: gdb-head/gdb/features/mips-linux.c
===================================================================
--- gdb-head.orig/gdb/features/mips-linux.c
+++ gdb-head/gdb/features/mips-linux.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: mips-linux.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_mips_linux;
@@ -10,7 +9,7 @@ initialize_tdesc_mips_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
Index: gdb-head/gdb/features/mips64-linux.c
===================================================================
--- gdb-head.orig/gdb/features/mips64-linux.c
+++ gdb-head/gdb/features/mips64-linux.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: mips64-linux.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_mips64_linux;
@@ -10,7 +9,7 @@ initialize_tdesc_mips64_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("mips"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-32.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-32.c
+++ gdb-head/gdb/features/rs6000/powerpc-32.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-32.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_32;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_32 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_32l (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-403.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-403.c
+++ gdb-head/gdb/features/rs6000/powerpc-403.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-403.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_403;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_403 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-403gc.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-403gc.c
+++ gdb-head/gdb/features/rs6000/powerpc-403gc.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-403gc.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_403gc;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_403gc (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-505.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-505.c
+++ gdb-head/gdb/features/rs6000/powerpc-505.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-505.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_505;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_505 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-601.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-601.c
+++ gdb-head/gdb/features/rs6000/powerpc-601.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-601.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_601;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_601 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
Index: gdb-head/gdb/features/rs6000/powerpc-602.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-602.c
+++ gdb-head/gdb/features/rs6000/powerpc-602.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-602.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_602;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_602 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-603.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-603.c
+++ gdb-head/gdb/features/rs6000/powerpc-603.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-603.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_603;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_603 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-604.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-604.c
+++ gdb-head/gdb/features/rs6000/powerpc-604.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-604.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_604;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_604 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-64.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-64.c
+++ gdb-head/gdb/features/rs6000/powerpc-64.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-64.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_64;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_64 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_64l (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-7400.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-7400.c
+++ gdb-head/gdb/features/rs6000/powerpc-7400.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-7400.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_7400;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_7400 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
@@ -139,39 +138,28 @@ initialize_tdesc_powerpc_7400 (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 119, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 120, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-750.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-750.c
+++ gdb-head/gdb/features/rs6000/powerpc-750.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-750.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_750;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_750 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-860.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-860.c
+++ gdb-head/gdb/features/rs6000/powerpc-860.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-860.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_860;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_860 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
   tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
Index: gdb-head/gdb/features/rs6000/powerpc-altivec32.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-altivec32.c
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-altivec32.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_altivec32;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_altivec32 (void
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -91,39 +90,28 @@ initialize_tdesc_powerpc_altivec32 (void
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-altivec32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-altivec32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-altivec32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-altivec32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_altivec32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_altivec32l (voi
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_altivec32l (voi
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-altivec64.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-altivec64.c
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-altivec64.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_altivec64;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_altivec64 (void
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -91,39 +90,28 @@ initialize_tdesc_powerpc_altivec64 (void
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-altivec64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-altivec64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-altivec64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-altivec64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_altivec64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_altivec64l (voi
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_altivec64l (voi
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-e500.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-e500.c
+++ gdb-head/gdb/features/rs6000/powerpc-e500.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-e500.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_e500;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_e500 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-e500l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-e500l.c
+++ gdb-head/gdb/features/rs6000/powerpc-e500l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-e500l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_e500l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_e500l (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:e500"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_32l (voi
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_64l (voi
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-altivec32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-altivec32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-altivec32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-altivec32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_altivec32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_altivec3
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_isa205_altivec3
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-altivec64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-altivec64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-altivec64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-altivec64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_altivec64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_altivec6
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_isa205_altivec6
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-vsx32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-vsx32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-vsx32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-vsx32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_vsx32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_vsx32l (
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_isa205_vsx32l (
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-isa205-vsx64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-isa205-vsx64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-isa205-vsx64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-isa205-vsx64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_isa205_vsx64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_isa205_vsx64l (
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_isa205_vsx64l (
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-vsx32.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-vsx32.c
+++ gdb-head/gdb/features/rs6000/powerpc-vsx32.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-vsx32.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_vsx32;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_vsx32 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -91,39 +90,28 @@ initialize_tdesc_powerpc_vsx32 (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-vsx32l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-vsx32l.c
+++ gdb-head/gdb/features/rs6000/powerpc-vsx32l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-vsx32l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_vsx32l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_vsx32l (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_vsx32l (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-vsx64.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-vsx64.c
+++ gdb-head/gdb/features/rs6000/powerpc-vsx64.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-vsx64.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_vsx64;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_vsx64 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -91,39 +90,28 @@ initialize_tdesc_powerpc_vsx64 (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 71, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 72, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/powerpc-vsx64l.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/powerpc-vsx64l.c
+++ gdb-head/gdb/features/rs6000/powerpc-vsx64l.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: powerpc-vsx64l.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_powerpc_vsx64l;
@@ -10,7 +9,7 @@ initialize_tdesc_powerpc_vsx64l (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
 
@@ -95,39 +94,28 @@ initialize_tdesc_powerpc_vsx64l (void)
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
   field_type = tdesc_named_type (feature, "ieee_single");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4f");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4f", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int32");
-  type = init_vector_type (field_type, 4);
-  TYPE_NAME (type) = xstrdup ("v4i32");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
 
   field_type = tdesc_named_type (feature, "int16");
-  type = init_vector_type (field_type, 8);
-  TYPE_NAME (type) = xstrdup ("v8i16");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
 
   field_type = tdesc_named_type (feature, "int8");
-  type = init_vector_type (field_type, 16);
-  TYPE_NAME (type) = xstrdup ("v16i8");
-  tdesc_record_type (feature, type);
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
 
-  type = init_composite_type (NULL, TYPE_CODE_UNION);
-  TYPE_NAME (type) = xstrdup ("vec128");
+  type = tdesc_create_union (feature, "vec128");
   field_type = tdesc_named_type (feature, "uint128");
-  append_composite_type_field (type, xstrdup ("uint128"), field_type);
+  tdesc_add_field (type, "uint128", field_type);
   field_type = tdesc_named_type (feature, "v4f");
-  append_composite_type_field (type, xstrdup ("v4_float"), field_type);
+  tdesc_add_field (type, "v4_float", field_type);
   field_type = tdesc_named_type (feature, "v4i32");
-  append_composite_type_field (type, xstrdup ("v4_int32"), field_type);
+  tdesc_add_field (type, "v4_int32", field_type);
   field_type = tdesc_named_type (feature, "v8i16");
-  append_composite_type_field (type, xstrdup ("v8_int16"), field_type);
+  tdesc_add_field (type, "v8_int16", field_type);
   field_type = tdesc_named_type (feature, "v16i8");
-  append_composite_type_field (type, xstrdup ("v16_int8"), field_type);
-  TYPE_VECTOR (type) = 1;
-  tdesc_record_type (feature, type);
+  tdesc_add_field (type, "v16_int8", field_type);
 
   tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
Index: gdb-head/gdb/features/rs6000/rs6000.c
===================================================================
--- gdb-head.orig/gdb/features/rs6000/rs6000.c
+++ gdb-head/gdb/features/rs6000/rs6000.c
@@ -1,7 +1,6 @@
 /* THIS FILE IS GENERATED.  Original: rs6000.xml */
 
 #include "defs.h"
-#include "gdbtypes.h"
 #include "target-descriptions.h"
 
 struct target_desc *tdesc_rs6000;
@@ -10,7 +9,7 @@ initialize_tdesc_rs6000 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
-  struct type *field_type, *type;
+  struct tdesc_type *field_type, *type;
 
   set_tdesc_architecture (result, bfd_scan_arch ("rs6000:6000"));
 

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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