From: Simon Marchi <simon.marchi@ericsson.com>
To: <gdb-patches@sourceware.org>
Cc: Simon Marchi <simon.marchi@ericsson.com>
Subject: [PATCH 06/10] Make tdesc_reg string fields std::string
Date: Tue, 31 Oct 2017 01:42:00 -0000 [thread overview]
Message-ID: <1509414120-14659-7-git-send-email-simon.marchi@ericsson.com> (raw)
In-Reply-To: <1509414120-14659-1-git-send-email-simon.marchi@ericsson.com>
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.
---
gdb/features/arc-arcompact.c | 2 +-
gdb/features/arc-v2.c | 4 +--
gdb/target-descriptions.c | 72 +++++++++++++++++++++-----------------------
3 files changed, 37 insertions(+), 41 deletions(-)
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
index ea84a40..fd11e31 100644
--- a/gdb/features/arc-arcompact.c
+++ b/gdb/features/arc-arcompact.c
@@ -48,7 +48,7 @@ initialize_tdesc_arc_arcompact (void)
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, "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");
struct tdesc_type *field_type;
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
index 1eefc24..6eeefdb 100644
--- a/gdb/features/arc-v2.c
+++ b/gdb/features/arc-v2.c
@@ -45,10 +45,10 @@ initialize_tdesc_arc_v2 (void)
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, "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, "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");
struct tdesc_type *field_type;
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 4293996..647d42d 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -75,33 +75,28 @@ struct property
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 @@ 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 @@ 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,12 +134,12 @@ 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
@@ -1091,7 +1086,7 @@ tdesc_find_register_early (const struct tdesc_feature *feature,
const char *name)
{
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 NULL;
@@ -1197,7 +1192,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)
{
@@ -1239,7 +1234,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;
@@ -1250,11 +1245,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;
@@ -1272,7 +1267,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;
}
}
@@ -1280,7 +1275,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;
@@ -1318,15 +1313,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)
@@ -2057,12 +2052,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:
@@ -2173,12 +2169,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++;
}
--
2.7.4
next prev parent reply other threads:[~2017-10-31 1:42 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-31 1:42 [PATCH 00/10] Use std::vector and std::string throughout target-descriptions.c Simon Marchi
2017-10-31 1:42 ` [PATCH 04/10] Make tdesc_feature::name an std::string Simon Marchi
2017-10-31 1:42 ` [PATCH 05/10] Make tdesc_feature::registers an std::vector Simon Marchi
2017-11-02 9:32 ` Yao Qi
2017-11-02 13:22 ` Simon Marchi
2017-10-31 1:42 ` [PATCH 07/10] Make tdesc_feature::types " Simon Marchi
2017-10-31 1:42 ` [PATCH 08/10] Make tdesc_type::name an std::string Simon Marchi
2017-10-31 1:42 ` [PATCH 01/10] Make target_desc::properties an std::vector Simon Marchi
2017-10-31 1:42 ` [PATCH 03/10] Make target_desc::features " Simon Marchi
2017-11-02 9:29 ` Yao Qi
2017-11-02 13:20 ` Simon Marchi
2017-10-31 1:42 ` Simon Marchi [this message]
2017-11-02 9:43 ` [PATCH 06/10] Make tdesc_reg string fields std::string Yao Qi
2017-11-02 13:24 ` Simon Marchi
2017-10-31 1:42 ` [PATCH 10/10] Make tdesc_arch_data::arch_regs an std::vector Simon Marchi
2017-10-31 1:42 ` [PATCH 09/10] Make tdesc_type::u::u::fields " Simon Marchi
2017-11-02 10:02 ` Yao Qi
2017-11-02 13:27 ` Simon Marchi
2017-12-03 16:04 ` [PATCH 11/10] Split tdesc_type into multiple classes Simon Marchi
2017-12-05 16:46 ` Yao Qi
2017-12-05 21:42 ` Simon Marchi
2017-10-31 1:43 ` [PATCH 02/10] Make target_desc::compatible an std::vector Simon Marchi
2017-11-02 10:16 ` [PATCH 00/10] Use std::vector and std::string throughout target-descriptions.c Yao Qi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1509414120-14659-7-git-send-email-simon.marchi@ericsson.com \
--to=simon.marchi@ericsson.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox