From 5cd3e386e0ac84b0ba1e0737853f4504ba24f677 Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Mon, 26 Mar 2018 10:39:24 +0100 Subject: [PATCH] Make gdbserver reg_defs a vector of objects gdb/ * regformats/regdef.h (reg): Add constructors. gdb/gdbserver/ * regcache.c (find_register_by_number): Return a ref. (find_regno): Use references. (register_size): Likewise. (register_data): Likewise. * tdesc.c (target_desc::~target_desc): Remove free calls. (target_desc::operator==): Use std::vector compare. (init_target_desc): Use reference. (tdesc_create_reg): Use reg constructors. * tdesc.h (struct target_desc): Replace pointer with object. --- gdb/ChangeLog | 4 ++++ gdb/gdbserver/ChangeLog | 12 ++++++++++++ gdb/gdbserver/regcache.c | 10 +++++----- gdb/gdbserver/tdesc.c | 39 ++++++++------------------------------- gdb/gdbserver/tdesc.h | 2 +- gdb/regformats/regdef.h | 12 ++++++++++++ 6 files changed, 42 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 57f4f77..20bf941 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2018-03-26 Alan Hayward + + * regformats/regdef.h (reg): Add constructors. + 2018-03-25 Pedro Alves * eval.c (evaluate_funcall): Swap OP_VAR_MSYM_VALUE/OP_VAR_VALUE diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index c07d40a..8e6afef 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,15 @@ +2018-03-26 Alan Hayward + + * regcache.c (find_register_by_number): Return a ref. + (find_regno): Use references. + (register_size): Likewise. + (register_data): Likewise. + * tdesc.c (target_desc::~target_desc): Remove free calls. + (target_desc::operator==): Use std::vector compare. + (init_target_desc): Use reference. + (tdesc_create_reg): Use reg constructors. + * tdesc.h (struct target_desc): Replace pointer with object. + 2018-03-23 Alan Hayward * regcache.c (find_register_by_number): Make static. diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c index d6511fd..cbdf766 100644 --- a/gdb/gdbserver/regcache.c +++ b/gdb/gdbserver/regcache.c @@ -196,9 +196,9 @@ regcache_cpy (struct regcache *dst, struct regcache *src) dst->registers_valid = src->registers_valid; } -/* Return a pointer to the description of register N. */ +/* Return a reference to the description of register N. */ -static const struct reg * +static const struct reg & find_register_by_number (const struct target_desc *tdesc, int n) { return tdesc->reg_defs[n]; @@ -251,7 +251,7 @@ find_regno (const struct target_desc *tdesc, const char *name) { for (int i = 0; i < tdesc->reg_defs.size (); ++i) { - if (strcmp (name, find_register_by_number (tdesc, i)->name) == 0) + if (strcmp (name, find_register_by_number (tdesc, i).name) == 0) return i; } internal_error (__FILE__, __LINE__, "Unknown register %s requested", @@ -288,7 +288,7 @@ register_cache_size (const struct target_desc *tdesc) int register_size (const struct target_desc *tdesc, int n) { - return find_register_by_number (tdesc, n)->size / 8; + return find_register_by_number (tdesc, n).size / 8; } /* See common/common-regcache.h. */ @@ -303,7 +303,7 @@ static unsigned char * register_data (struct regcache *regcache, int n, int fetch) { return (regcache->registers - + find_register_by_number (regcache->tdesc, n)->offset / 8); + + find_register_by_number (regcache->tdesc, n).offset / 8); } /* Supply register N, whose contents are stored in BUF, to REGCACHE. diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index e50a848..cec7a66 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -25,9 +25,6 @@ target_desc::~target_desc () { int i; - for (reg *reg : reg_defs) - xfree (reg); - xfree ((char *) arch); xfree ((char *) osabi); @@ -40,18 +37,9 @@ target_desc::~target_desc () bool target_desc::operator== (const target_desc &other) const { - if (reg_defs.size () != other.reg_defs.size ()) + if (reg_defs != other.reg_defs) return false; - for (int i = 0; i < reg_defs.size (); ++i) - { - struct reg *reg = reg_defs[i]; - struct reg *reg2 = other.reg_defs[i]; - - if (reg != reg2 && *reg != *reg2) - return false; - } - /* Compare expedite_regs. */ int i = 0; for (; expedite_regs[i] != NULL; i++) @@ -72,10 +60,10 @@ init_target_desc (struct target_desc *tdesc) { int offset = 0; - for (reg *reg : tdesc->reg_defs) + for (reg ® : tdesc->reg_defs) { - reg->offset = offset; - offset += reg->size; + reg.offset = offset; + offset += reg.size; } tdesc->registers_size = offset / 8; @@ -241,23 +229,12 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name, { struct target_desc *tdesc = (struct target_desc *) feature; - while (tdesc->reg_defs.size () < regnum) - { - struct reg *reg = XCNEW (struct reg); - - reg->name = ""; - reg->size = 0; - tdesc->reg_defs.push_back (reg); - } - - gdb_assert (regnum == 0 - || regnum == tdesc->reg_defs.size ()); + gdb_assert (regnum == 0 || regnum >= tdesc->reg_defs.size ()); - struct reg *reg = XCNEW (struct reg); + if (regnum != 0) + tdesc->reg_defs.resize (regnum); - reg->name = name; - reg->size = bitsize; - tdesc->reg_defs.push_back (reg); + tdesc->reg_defs.emplace_back (name, bitsize); } /* See common/tdesc.h. */ diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index 4513ea7..a625443 100644 --- a/gdb/gdbserver/tdesc.h +++ b/gdb/gdbserver/tdesc.h @@ -34,7 +34,7 @@ struct target_desc : tdesc_feature { /* A vector of elements of register definitions that describe the inferior's register set. */ - std::vector reg_defs; + std::vector reg_defs; /* The register cache size, in bytes. */ int registers_size; diff --git a/gdb/regformats/regdef.h b/gdb/regformats/regdef.h index 262d03c..4775e86 100644 --- a/gdb/regformats/regdef.h +++ b/gdb/regformats/regdef.h @@ -21,6 +21,18 @@ struct reg { + reg () + : name (""), + offset (0), + size (0) + {} + + reg (const char *_name, int _size) + : name (_name), + offset (0), + size (_size) + {} + /* The name of this register - NULL for pad entries. */ const char *name; -- 2.7.4