Make tdesc_reg string fields std::string
Make the name, group and type fields of tdesc_reg std::strings. This way, we don't have to manually free them in ~tdesc_reg. Doing so results in a small change in the generated tdesc. Instead of passing an empty string for the group parameter of tdesc_create_reg, the two modified tdesc now pass NULL. The end result should be the same. gdb/ChangeLog: * target-descriptions.c (struct tdesc_reg) <tdesc_reg>: Change type of name_ parameter, adjust to std::string change. <name, group, type>: Change type to std::string. <~tdesc_reg>: Replace with default implementation. <operator==>: Adjust. (tdesc_find_register_early): Adjust. (tdesc_register_name): Adjust. (tdesc_register_type): Adjust. (tdesc_register_in_reggroup_p): Adjust. (class print_c_tdesc) <visit>: Adjust. (class print_c_feature) <visit>: Adjust.
This commit is contained in:
parent
c9c895b966
commit
a8142ee195
@ -1,3 +1,17 @@
|
|||||||
|
2017-12-05 Simon Marchi <simon.marchi@ericsson.com>
|
||||||
|
|
||||||
|
* target-descriptions.c (struct tdesc_reg) <tdesc_reg>: Change
|
||||||
|
type of name_ parameter, adjust to std::string change.
|
||||||
|
<name, group, type>: Change type to std::string.
|
||||||
|
<~tdesc_reg>: Replace with default implementation.
|
||||||
|
<operator==>: Adjust.
|
||||||
|
(tdesc_find_register_early): Adjust.
|
||||||
|
(tdesc_register_name): Adjust.
|
||||||
|
(tdesc_register_type): Adjust.
|
||||||
|
(tdesc_register_in_reggroup_p): Adjust.
|
||||||
|
(class print_c_tdesc) <visit>: Adjust.
|
||||||
|
(class print_c_feature) <visit>: Adjust.
|
||||||
|
|
||||||
2017-12-05 Simon Marchi <simon.marchi@ericsson.com>
|
2017-12-05 Simon Marchi <simon.marchi@ericsson.com>
|
||||||
|
|
||||||
* target-descriptions.c (tdesc_reg_p): Remove typedef.
|
* target-descriptions.c (tdesc_reg_p): Remove typedef.
|
||||||
|
@ -48,7 +48,7 @@ initialize_tdesc_arc_arcompact (void)
|
|||||||
tdesc_create_reg (feature, "ilink2", 30, 1, NULL, 32, "code_ptr");
|
tdesc_create_reg (feature, "ilink2", 30, 1, NULL, 32, "code_ptr");
|
||||||
tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
|
tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
|
||||||
tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
|
tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
|
||||||
tdesc_create_reg (feature, "pcl", 33, 1, "", 32, "code_ptr");
|
tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
|
||||||
|
|
||||||
feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
|
feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
|
||||||
struct tdesc_type *field_type;
|
struct tdesc_type *field_type;
|
||||||
|
@ -45,10 +45,10 @@ initialize_tdesc_arc_v2 (void)
|
|||||||
tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
|
tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
|
||||||
tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
|
tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
|
||||||
tdesc_create_reg (feature, "ilink", 29, 1, NULL, 32, "code_ptr");
|
tdesc_create_reg (feature, "ilink", 29, 1, NULL, 32, "code_ptr");
|
||||||
tdesc_create_reg (feature, "r30", 30, 1, "", 32, "int");
|
tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int");
|
||||||
tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
|
tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
|
||||||
tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
|
tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
|
||||||
tdesc_create_reg (feature, "pcl", 33, 1, "", 32, "code_ptr");
|
tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
|
||||||
|
|
||||||
feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
|
feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
|
||||||
struct tdesc_type *field_type;
|
struct tdesc_type *field_type;
|
||||||
|
@ -75,33 +75,28 @@ struct property
|
|||||||
|
|
||||||
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 regnum, int save_restore_, const char *group_,
|
||||||
int bitsize_, const char *type_)
|
int bitsize_, const char *type_)
|
||||||
: name (xstrdup (name_)), target_regnum (regnum),
|
: name (name_), target_regnum (regnum),
|
||||||
save_restore (save_restore_),
|
save_restore (save_restore_),
|
||||||
group (group_ != NULL ? xstrdup (group_) : NULL),
|
group (group_ != NULL ? group_ : ""),
|
||||||
bitsize (bitsize_),
|
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
|
/* 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. */
|
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 ()
|
virtual ~tdesc_reg () = default;
|
||||||
{
|
|
||||||
xfree (name);
|
|
||||||
xfree (type);
|
|
||||||
xfree (group);
|
|
||||||
}
|
|
||||||
|
|
||||||
DISABLE_COPY_AND_ASSIGN (tdesc_reg);
|
DISABLE_COPY_AND_ASSIGN (tdesc_reg);
|
||||||
|
|
||||||
/* The name of this register. In standard features, it may be
|
/* The name of this register. In standard features, it may be
|
||||||
recognized by the architecture support code, or it may be purely
|
recognized by the architecture support code, or it may be purely
|
||||||
for the user. */
|
for the user. */
|
||||||
char *name;
|
std::string name;
|
||||||
|
|
||||||
/* The register number used by this target to refer to this
|
/* The register number used by this target to refer to this
|
||||||
register. This is used for remote p/P packets and to determine
|
register. This is used for remote p/P packets and to determine
|
||||||
@ -112,14 +107,14 @@ struct tdesc_reg : tdesc_element
|
|||||||
around calls to an inferior function. */
|
around calls to an inferior function. */
|
||||||
int save_restore;
|
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
|
if the group should be automatically determined from the
|
||||||
register's type. If this is "general", "float", or "vector", the
|
register's type. If this is "general", "float", or "vector", the
|
||||||
corresponding "info" command should display this register's
|
corresponding "info" command should display this register's
|
||||||
value. It can be an arbitrary string, but should be limited to
|
value. It can be an arbitrary string, but should be limited to
|
||||||
alphanumeric characters and internal hyphens. Currently other
|
alphanumeric characters and internal hyphens. Currently other
|
||||||
strings are ignored (treated as NULL). */
|
strings are ignored (treated as empty). */
|
||||||
char *group;
|
std::string group;
|
||||||
|
|
||||||
/* The size of the register, in bits. */
|
/* The size of the register, in bits. */
|
||||||
int bitsize;
|
int bitsize;
|
||||||
@ -127,7 +122,7 @@ struct tdesc_reg : tdesc_element
|
|||||||
/* The type of the register. This string corresponds to either
|
/* The type of the register. This string corresponds to either
|
||||||
a named type from the target description or a predefined
|
a named type from the target description or a predefined
|
||||||
type from GDB. */
|
type from GDB. */
|
||||||
char *type;
|
std::string type;
|
||||||
|
|
||||||
/* The target-described type corresponding to TYPE, if found. */
|
/* The target-described type corresponding to TYPE, if found. */
|
||||||
struct tdesc_type *tdesc_type;
|
struct tdesc_type *tdesc_type;
|
||||||
@ -139,12 +134,12 @@ struct tdesc_reg : tdesc_element
|
|||||||
|
|
||||||
bool operator== (const tdesc_reg &other) const
|
bool operator== (const tdesc_reg &other) const
|
||||||
{
|
{
|
||||||
return (streq (name, other.name)
|
return (name == other.name
|
||||||
&& target_regnum == other.target_regnum
|
&& target_regnum == other.target_regnum
|
||||||
&& save_restore == other.save_restore
|
&& save_restore == other.save_restore
|
||||||
&& bitsize == other.bitsize
|
&& bitsize == other.bitsize
|
||||||
&& (group == other.group || streq (group, other.group))
|
&& group == other.group
|
||||||
&& streq (type, other.type));
|
&& type == other.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator!= (const tdesc_reg &other) const
|
bool operator!= (const tdesc_reg &other) const
|
||||||
@ -1088,7 +1083,7 @@ tdesc_find_register_early (const struct tdesc_feature *feature,
|
|||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
for (const tdesc_reg_up ® : feature->registers)
|
for (const tdesc_reg_up ® : feature->registers)
|
||||||
if (strcasecmp (reg->name, name) == 0)
|
if (strcasecmp (reg->name.c_str (), name) == 0)
|
||||||
return reg.get ();
|
return reg.get ();
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1194,7 +1189,7 @@ tdesc_register_name (struct gdbarch *gdbarch, int regno)
|
|||||||
int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
|
int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
|
||||||
|
|
||||||
if (reg != NULL)
|
if (reg != NULL)
|
||||||
return reg->name;
|
return reg->name.c_str ();
|
||||||
|
|
||||||
if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
|
if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
|
||||||
{
|
{
|
||||||
@ -1236,7 +1231,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
|
|||||||
arch_reg->type = tdesc_gdb_type (gdbarch, reg->tdesc_type);
|
arch_reg->type = tdesc_gdb_type (gdbarch, reg->tdesc_type);
|
||||||
|
|
||||||
/* Next try size-sensitive type shortcuts. */
|
/* 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))
|
if (reg->bitsize == gdbarch_float_bit (gdbarch))
|
||||||
arch_reg->type = builtin_type (gdbarch)->builtin_float;
|
arch_reg->type = builtin_type (gdbarch)->builtin_float;
|
||||||
@ -1247,11 +1242,11 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
warning (_("Register \"%s\" has an unsupported size (%d bits)"),
|
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;
|
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))
|
if (reg->bitsize == gdbarch_long_bit (gdbarch))
|
||||||
arch_reg->type = builtin_type (gdbarch)->builtin_long;
|
arch_reg->type = builtin_type (gdbarch)->builtin_long;
|
||||||
@ -1269,7 +1264,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
warning (_("Register \"%s\" has an unsupported size (%d bits)"),
|
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;
|
arch_reg->type = builtin_type (gdbarch)->builtin_long;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1277,7 +1272,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno)
|
|||||||
if (arch_reg->type == NULL)
|
if (arch_reg->type == NULL)
|
||||||
internal_error (__FILE__, __LINE__,
|
internal_error (__FILE__, __LINE__,
|
||||||
"Register \"%s\" has an unknown type \"%s\"",
|
"Register \"%s\" has an unknown type \"%s\"",
|
||||||
reg->name, reg->type);
|
reg->name.c_str (), reg->type.c_str ());
|
||||||
}
|
}
|
||||||
|
|
||||||
return arch_reg->type;
|
return arch_reg->type;
|
||||||
@ -1315,15 +1310,15 @@ tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
|
|||||||
{
|
{
|
||||||
struct tdesc_reg *reg = tdesc_find_register (gdbarch, 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;
|
int general_p = 0, float_p = 0, vector_p = 0;
|
||||||
|
|
||||||
if (strcmp (reg->group, "general") == 0)
|
if (reg->group == "general")
|
||||||
general_p = 1;
|
general_p = 1;
|
||||||
else if (strcmp (reg->group, "float") == 0)
|
else if (reg->group == "float")
|
||||||
float_p = 1;
|
float_p = 1;
|
||||||
else if (strcmp (reg->group, "vector") == 0)
|
else if (reg->group == "vector")
|
||||||
vector_p = 1;
|
vector_p = 1;
|
||||||
|
|
||||||
if (reggroup == float_reggroup)
|
if (reggroup == float_reggroup)
|
||||||
@ -2054,12 +2049,13 @@ public:
|
|||||||
void visit (const tdesc_reg *reg) override
|
void visit (const tdesc_reg *reg) override
|
||||||
{
|
{
|
||||||
printf_unfiltered (" tdesc_create_reg (feature, \"%s\", %ld, %d, ",
|
printf_unfiltered (" tdesc_create_reg (feature, \"%s\", %ld, %d, ",
|
||||||
reg->name, reg->target_regnum, reg->save_restore);
|
reg->name.c_str (), reg->target_regnum,
|
||||||
if (reg->group)
|
reg->save_restore);
|
||||||
printf_unfiltered ("\"%s\", ", reg->group);
|
if (!reg->group.empty ())
|
||||||
|
printf_unfiltered ("\"%s\", ", reg->group.c_str ());
|
||||||
else
|
else
|
||||||
printf_unfiltered ("NULL, ");
|
printf_unfiltered ("NULL, ");
|
||||||
printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
|
printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -2170,12 +2166,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf_unfiltered (" tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
|
printf_unfiltered (" tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
|
||||||
reg->name, reg->save_restore);
|
reg->name.c_str (), reg->save_restore);
|
||||||
if (reg->group)
|
if (!reg->group.empty ())
|
||||||
printf_unfiltered ("\"%s\", ", reg->group);
|
printf_unfiltered ("\"%s\", ", reg->group.c_str ());
|
||||||
else
|
else
|
||||||
printf_unfiltered ("NULL, ");
|
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++;
|
m_next_regnum++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user