Make tdesc_feature::types an std::vector
[deliverable/binutils-gdb.git] / gdb / target-descriptions.c
index c669b7060c74990a0b627e94e546d0bef6561754..8f105a6a7bd13ed2ab75a20c7cf9898837885543 100644 (file)
@@ -73,35 +73,30 @@ struct property
 
 /* An individual register from a target description.  */
 
-typedef struct tdesc_reg : tdesc_element
+struct tdesc_reg : tdesc_element
 {
-  tdesc_reg (struct tdesc_feature *feature, const char *name_,
+  tdesc_reg (struct tdesc_feature *feature, const std::string &name_,
             int regnum, int save_restore_, const char *group_,
             int bitsize_, const char *type_)
-    : name (xstrdup (name_)), target_regnum (regnum),
+    : name (name_), target_regnum (regnum),
       save_restore (save_restore_),
-      group (group_ != NULL ? xstrdup (group_) : NULL),
+      group (group_ != NULL ? group_ : ""),
       bitsize (bitsize_),
-      type (type_ != NULL ? xstrdup (type_) : xstrdup ("<unknown>"))
+      type (type_ != NULL ? type_ : "<unknown>")
   {
     /* 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.  */
-    tdesc_type = tdesc_named_type (feature, type);
+    tdesc_type = tdesc_named_type (feature, type.c_str ());
   }
 
-  virtual ~tdesc_reg ()
-  {
-    xfree (name);
-    xfree (type);
-    xfree (group);
-  }
+  virtual ~tdesc_reg () = default;
 
   DISABLE_COPY_AND_ASSIGN (tdesc_reg);
 
   /* The name of this register.  In standard features, it may be
      recognized by the architecture support code, or it may be purely
      for the user.  */
-  char *name;
+  std::string name;
 
   /* The register number used by this target to refer to this
      register.  This is used for remote p/P packets and to determine
@@ -112,14 +107,14 @@ typedef struct tdesc_reg : tdesc_element
      around calls to an inferior function.  */
   int save_restore;
 
-  /* The name of the register group containing this register, or NULL
+  /* The name of the register group containing this register, or empty
      if the group should be automatically determined from the
      register's type.  If this is "general", "float", or "vector", the
      corresponding "info" command should display this register's
      value.  It can be an arbitrary string, but should be limited to
      alphanumeric characters and internal hyphens.  Currently other
-     strings are ignored (treated as NULL).  */
-  char *group;
+     strings are ignored (treated as empty).  */
+  std::string group;
 
   /* The size of the register, in bits.  */
   int bitsize;
@@ -127,7 +122,7 @@ typedef struct tdesc_reg : tdesc_element
   /* The type of the register.  This string corresponds to either
      a named type from the target description or a predefined
      type from GDB.  */
-  char *type;
+  std::string type;
 
   /* The target-described type corresponding to TYPE, if found.  */
   struct tdesc_type *tdesc_type;
@@ -139,20 +134,21 @@ typedef struct tdesc_reg : tdesc_element
 
   bool operator== (const tdesc_reg &other) const
   {
-    return (streq (name, other.name)
+    return (name == other.name
            && target_regnum == other.target_regnum
            && save_restore == other.save_restore
            && bitsize == other.bitsize
-           && (group == other.group || streq (group, other.group))
-           && streq (type, other.type));
+           && group == other.group
+           && type == other.type);
   }
 
   bool operator!= (const tdesc_reg &other) const
   {
     return !(*this == other);
   }
-} *tdesc_reg_p;
-DEF_VEC_P(tdesc_reg_p);
+};
+
+typedef std::unique_ptr<tdesc_reg> tdesc_reg_up;
 
 /* A named type from a target description.  */
 
@@ -196,7 +192,7 @@ enum tdesc_type_kind
   TDESC_TYPE_ENUM
 };
 
-typedef struct tdesc_type : tdesc_element
+struct tdesc_type : tdesc_element
 {
   tdesc_type (const char *name_, enum tdesc_type_kind kind_)
     : name (xstrdup (name_)), kind (kind_)
@@ -273,105 +269,72 @@ typedef struct tdesc_type : tdesc_element
   {
     return !(*this == other);
   }
-} *tdesc_type_p;
-DEF_VEC_P(tdesc_type_p);
+};
+
+typedef std::unique_ptr<tdesc_type> tdesc_type_up;
 
 /* A feature from a target description.  Each feature is a collection
    of other elements, e.g. registers and types.  */
 
 struct tdesc_feature : tdesc_element
 {
-  tdesc_feature (const char *name_)
-    : name (xstrdup (name_))
+  tdesc_feature (const std::string &name_)
+    : name (name_)
   {}
 
-  virtual ~tdesc_feature ()
-  {
-    struct tdesc_reg *reg;
-    struct tdesc_type *type;
-    int ix;
-
-    for (ix = 0; VEC_iterate (tdesc_reg_p, registers, ix, reg); ix++)
-      delete reg;
-    VEC_free (tdesc_reg_p, registers);
-
-    for (ix = 0; VEC_iterate (tdesc_type_p, types, ix, type); ix++)
-      delete type;
-    VEC_free (tdesc_type_p, types);
-
-    xfree (name);
-  }
+  virtual ~tdesc_feature () = default;
 
   DISABLE_COPY_AND_ASSIGN (tdesc_feature);
 
   /* The name of this feature.  It may be recognized by the architecture
      support code.  */
-  char *name;
+  std::string name;
 
   /* The registers associated with this feature.  */
-  VEC(tdesc_reg_p) *registers = NULL;
+  std::vector<std::unique_ptr<tdesc_reg>> registers;
 
   /* The types associated with this feature.  */
-  VEC(tdesc_type_p) *types = NULL;
+  std::vector<tdesc_type_up> types;
 
   void accept (tdesc_element_visitor &v) const override
   {
     v.visit_pre (this);
 
-    struct tdesc_type *type;
-
-    for (int ix = 0;
-        VEC_iterate (tdesc_type_p, types, ix, type);
-        ix++)
+    for (const tdesc_type_up &type : types)
       type->accept (v);
 
-    struct tdesc_reg *reg;
-
-    for (int ix = 0;
-        VEC_iterate (tdesc_reg_p, registers, ix, reg);
-        ix++)
+    for (const tdesc_reg_up &reg : registers)
       reg->accept (v);
 
-
     v.visit_post (this);
   }
 
   bool operator== (const tdesc_feature &other) const
   {
-    if (strcmp (name, other.name) != 0)
+    if (name != other.name)
       return false;
 
-    if (VEC_length (tdesc_reg_p, registers)
-       != VEC_length (tdesc_reg_p, other.registers))
+    if (registers.size () != other.registers.size ())
       return false;
 
-    struct tdesc_reg *reg;
-
-    for (int ix = 0;
-        VEC_iterate (tdesc_reg_p, registers, ix, reg);
-        ix++)
+    for (int ix = 0; ix < registers.size (); ix++)
       {
-       tdesc_reg *reg2
-         = VEC_index (tdesc_reg_p, other.registers, ix);
+       const tdesc_reg_up &reg1 = registers[ix];
+       const tdesc_reg_up &reg2 = other.registers[ix];
 
-       if (reg != reg2 && *reg != *reg2)
+       if (reg1 != reg2 && *reg1 != *reg2)
          return false;
       }
 
-    if (VEC_length (tdesc_type_p, types)
-       != VEC_length (tdesc_type_p, other.types))
+    if (types.size () != other.types.size ())
       return false;
 
-    tdesc_type *type;
-
-    for (int ix = 0;
-        VEC_iterate (tdesc_type_p, types, ix, type);
-        ix++)
+    for (int ix = 0; ix < types.size (); ix++)
       {
-       tdesc_type *type2
-         = VEC_index (tdesc_type_p, other.types, ix);
+       const tdesc_type_up &type1 = types[ix];
+       const tdesc_type_up &type2 = other.types[ix];
 
-       if (type != type2 && *type != *type2)
+       if (type1 != type2 && *type1 != *type2)
          return false;
       }
 
@@ -382,7 +345,6 @@ struct tdesc_feature : tdesc_element
   {
     return !(*this == other);
   }
-
 };
 
 typedef std::unique_ptr<tdesc_feature> tdesc_feature_up;
@@ -727,7 +689,7 @@ tdesc_has_registers (const struct target_desc *target_desc)
     return 0;
 
   for (const tdesc_feature_up &feature : target_desc->features)
-    if (! VEC_empty (tdesc_reg_p, feature->registers))
+    if (!feature->registers.empty ())
       return 1;
 
   return 0;
@@ -741,7 +703,7 @@ tdesc_find_feature (const struct target_desc *target_desc,
                    const char *name)
 {
   for (const tdesc_feature_up &feature : target_desc->features)
-    if (strcmp (feature->name, name) == 0)
+    if (feature->name == name)
       return feature.get ();
 
   return NULL;
@@ -752,7 +714,7 @@ tdesc_find_feature (const struct target_desc *target_desc,
 const char *
 tdesc_feature_name (const struct tdesc_feature *feature)
 {
-  return feature->name;
+  return feature->name.c_str ();
 }
 
 /* Predefined types.  */
@@ -794,16 +756,13 @@ tdesc_predefined_type (enum tdesc_type_kind kind)
 struct tdesc_type *
 tdesc_named_type (const struct tdesc_feature *feature, const char *id)
 {
-  int ix;
-  struct tdesc_type *type;
-
   /* First try target-defined types.  */
-  for (ix = 0; VEC_iterate (tdesc_type_p, feature->types, ix, type); ix++)
+  for (const tdesc_type_up &type : feature->types)
     if (strcmp (type->name, id) == 0)
-      return type;
+      return type.get ();
 
   /* Next try the predefined types.  */
-  for (ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++)
+  for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++)
     if (strcmp (tdesc_predefined_types[ix].name, id) == 0)
       return &tdesc_predefined_types[ix];
 
@@ -1103,14 +1062,9 @@ static struct tdesc_reg *
 tdesc_find_register_early (const struct tdesc_feature *feature,
                           const char *name)
 {
-  int ixr;
-  struct tdesc_reg *reg;
-
-  for (ixr = 0;
-       VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg);
-       ixr++)
-    if (strcasecmp (reg->name, name) == 0)
-      return reg;
+  for (const tdesc_reg_up &reg : feature->registers)
+    if (strcasecmp (reg->name.c_str (), name) == 0)
+      return reg.get ();
 
   return NULL;
 }
@@ -1215,7 +1169,7 @@ tdesc_register_name (struct gdbarch *gdbarch, int regno)
   int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
 
   if (reg != NULL)
-    return reg->name;
+    return reg->name.c_str ();
 
   if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
     {
@@ -1257,7 +1211,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
         arch_reg->type = tdesc_gdb_type (gdbarch, reg->tdesc_type);
 
       /* Next try size-sensitive type shortcuts.  */
-      else if (strcmp (reg->type, "float") == 0)
+      else if (reg->type == "float")
        {
          if (reg->bitsize == gdbarch_float_bit (gdbarch))
            arch_reg->type = builtin_type (gdbarch)->builtin_float;
@@ -1268,11 +1222,11 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
          else
            {
              warning (_("Register \"%s\" has an unsupported size (%d bits)"),
-                      reg->name, reg->bitsize);
+                      reg->name.c_str (), reg->bitsize);
              arch_reg->type = builtin_type (gdbarch)->builtin_double;
            }
        }
-      else if (strcmp (reg->type, "int") == 0)
+      else if (reg->type == "int")
        {
          if (reg->bitsize == gdbarch_long_bit (gdbarch))
            arch_reg->type = builtin_type (gdbarch)->builtin_long;
@@ -1290,7 +1244,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
          else
            {
              warning (_("Register \"%s\" has an unsupported size (%d bits)"),
-                      reg->name, reg->bitsize);
+                      reg->name.c_str (), reg->bitsize);
              arch_reg->type = builtin_type (gdbarch)->builtin_long;
            }
        }
@@ -1298,7 +1252,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
       if (arch_reg->type == NULL)
        internal_error (__FILE__, __LINE__,
                        "Register \"%s\" has an unknown type \"%s\"",
-                       reg->name, reg->type);
+                       reg->name.c_str (), reg->type.c_str ());
     }
 
   return arch_reg->type;
@@ -1336,15 +1290,15 @@ tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
 {
   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
 
-  if (reg != NULL && reg->group != NULL)
+  if (reg != NULL && !reg->group.empty ())
     {
       int general_p = 0, float_p = 0, vector_p = 0;
 
-      if (strcmp (reg->group, "general") == 0)
+      if (reg->group == "general")
        general_p = 1;
-      else if (strcmp (reg->group, "float") == 0)
+      else if (reg->group == "float")
        float_p = 1;
-      else if (strcmp (reg->group, "vector") == 0)
+      else if (reg->group == "vector")
        vector_p = 1;
 
       if (reggroup == float_reggroup)
@@ -1435,8 +1389,6 @@ tdesc_use_registers (struct gdbarch *gdbarch,
                     struct tdesc_arch_data *early_data)
 {
   int num_regs = gdbarch_num_regs (gdbarch);
-  int ixr;
-  struct tdesc_reg *reg;
   struct tdesc_arch_data *data;
   struct tdesc_arch_reg *arch_reg, new_arch_reg = { 0 };
   htab_t reg_hash;
@@ -1456,18 +1408,16 @@ tdesc_use_registers (struct gdbarch *gdbarch,
      the initial size is arbitrary.  */
   reg_hash = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
   for (const tdesc_feature_up &feature : target_desc->features)
-    for (ixr = 0;
-        VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg);
-        ixr++)
+    for (const tdesc_reg_up &reg : feature->registers)
       {
-       void **slot = htab_find_slot (reg_hash, reg, INSERT);
+       void **slot = htab_find_slot (reg_hash, reg.get (), INSERT);
 
-       *slot = reg;
+       *slot = reg.get ();
       }
 
   /* Remove any registers which were assigned numbers by the
      architecture.  */
-  for (ixr = 0;
+  for (int ixr = 0;
        VEC_iterate (tdesc_arch_reg, data->arch_regs, ixr, arch_reg);
        ixr++)
     if (arch_reg->reg)
@@ -1482,12 +1432,10 @@ tdesc_use_registers (struct gdbarch *gdbarch,
   while (VEC_length (tdesc_arch_reg, data->arch_regs) < num_regs)
     VEC_safe_push (tdesc_arch_reg, data->arch_regs, &new_arch_reg);
   for (const tdesc_feature_up &feature : target_desc->features)
-    for (ixr = 0;
-        VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg);
-        ixr++)
-      if (htab_find (reg_hash, reg) != NULL)
+    for (const tdesc_reg_up &reg : feature->registers)
+      if (htab_find (reg_hash, reg.get ()) != NULL)
        {
-         new_arch_reg.reg = reg;
+         new_arch_reg.reg = reg.get ();
          VEC_safe_push (tdesc_arch_reg, data->arch_regs, &new_arch_reg);
          num_regs++;
        }
@@ -1514,7 +1462,7 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name,
   tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore,
                                  group, bitsize, type);
 
-  VEC_safe_push (tdesc_reg_p, feature->registers, reg);
+  feature->registers.emplace_back (reg);
 }
 
 /* See arch/tdesc.h.  */
@@ -1528,7 +1476,7 @@ tdesc_create_vector (struct tdesc_feature *feature, const char *name,
   type->u.v.type = field_type;
   type->u.v.count = count;
 
-  VEC_safe_push (tdesc_type_p, feature->types, type);
+  feature->types.emplace_back (type);
   return type;
 }
 
@@ -1539,7 +1487,7 @@ tdesc_create_struct (struct tdesc_feature *feature, const char *name)
 {
   struct tdesc_type *type = new tdesc_type (name, TDESC_TYPE_STRUCT);
 
-  VEC_safe_push (tdesc_type_p, feature->types, type);
+  feature->types.emplace_back (type);
   return type;
 }
 
@@ -1560,7 +1508,7 @@ tdesc_create_union (struct tdesc_feature *feature, const char *name)
 {
   struct tdesc_type *type = new tdesc_type (name, TDESC_TYPE_UNION);
 
-  VEC_safe_push (tdesc_type_p, feature->types, type);
+  feature->types.emplace_back (type);
   return type;
 }
 
@@ -1576,7 +1524,7 @@ tdesc_create_flags (struct tdesc_feature *feature, const char *name,
 
   type->u.u.size = size;
 
-  VEC_safe_push (tdesc_type_p, feature->types, type);
+  feature->types.emplace_back (type);
   return type;
 }
 
@@ -1590,7 +1538,7 @@ tdesc_create_enum (struct tdesc_feature *feature, const char *name,
 
   type->u.u.size = size;
 
-  VEC_safe_push (tdesc_type_p, feature->types, type);
+  feature->types.emplace_back (type);
   return type;
 }
 
@@ -1925,7 +1873,7 @@ public:
   void visit_pre (const tdesc_feature *e) override
   {
     printf_unfiltered ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
-                      e->name);
+                      e->name.c_str ());
   }
 
   void visit_post (const tdesc_feature *e) override
@@ -2081,12 +2029,13 @@ public:
   void visit (const tdesc_reg *reg) override
   {
     printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", %ld, %d, ",
-                      reg->name, reg->target_regnum, reg->save_restore);
-    if (reg->group)
-      printf_unfiltered ("\"%s\", ", reg->group);
+                      reg->name.c_str (), reg->target_regnum,
+                      reg->save_restore);
+    if (!reg->group.empty ())
+      printf_unfiltered ("\"%s\", ", reg->group.c_str ());
     else
       printf_unfiltered ("NULL, ");
-    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
   }
 
 protected:
@@ -2143,7 +2092,7 @@ public:
 
     printf_unfiltered
       ("\n  feature = tdesc_create_feature (result, \"%s\", \"%s\");\n",
-       e->name, lbasename (m_filename_after_features.c_str ()));
+       e->name.c_str (), lbasename (m_filename_after_features.c_str ()));
   }
 
   void visit_post (const tdesc_feature *e) override
@@ -2197,12 +2146,12 @@ public:
       }
 
     printf_unfiltered ("  tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
-                      reg->name, reg->save_restore);
-    if (reg->group)
-      printf_unfiltered ("\"%s\", ", reg->group);
+                      reg->name.c_str (), reg->save_restore);
+    if (!reg->group.empty ())
+      printf_unfiltered ("\"%s\", ", reg->group.c_str ());
     else
       printf_unfiltered ("NULL, ");
-    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+    printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
 
     m_next_regnum++;
   }
This page took 0.031465 seconds and 4 git commands to generate.