tdesc: handle arbitrary strings in tdesc_register_in_reggroup_p
authorStafford Horne <shorne@gmail.com>
Wed, 27 Dec 2017 14:36:31 +0000 (23:36 +0900)
committerStafford Horne <shorne@gmail.com>
Wed, 27 Dec 2017 14:36:31 +0000 (23:36 +0900)
tdesc_register_in_reggroup_p in now able to handle arbitrary
groups. This is useful when groups are created while the
target descriptor file is received from the remote.

This can be the case of a soft core target processor where
registers/groups can change.

gdb/ChangeLog:

yyyy-mm-dd  Franck Jullien  <franck.jullien@gmail.com>
    Stafford Horne  <shorne@gmail.com>

* target-descriptions.c (tdesc_register_in_reggroup_p): Support
arbitrary strings.
(tdesc_use_registers): Add logic to register new reggroups.
(tdesc_reg::group): Update comment to indicate we allow
arbitrary strings.
* NEWS (Changes since GDB 8.0): Announce that GDB supports
arbitrary reggroups.

gdb/testsuite/ChangeLog:

yyyy-mm-dd  Stafford Horne  <shorne@gmail.com>

* gdb.xml/extra-regs.xml: Add example foo reggroup.
* gdb.xml/tdesc-regs.exp: Add test to check for foo reggroup.

gdb/doc/ChangeLog:

yyyy-mm-dd  Stafford Horne  <shorne@gmail.com>

* gdb.texinfo (Target Description Format): Explain that arbitrary
strings are now allowed for register groups.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/target-descriptions.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.xml/extra-regs.xml
gdb/testsuite/gdb.xml/tdesc-regs.exp

index e3ef0fe5d9125258cf9d6dc5a867df38eca18ae1..4d85029b99aa9d16da48f1c607f6a3386badd5a2 100644 (file)
@@ -1,3 +1,14 @@
+2017-12-27  Franck Jullien  <franck.jullien@gmail.com>
+           Stafford Horne  <shorne@gmail.com>
+
+       * target-descriptions.c (tdesc_register_in_reggroup_p): Support
+       arbitrary strings.
+       (tdesc_use_registers): Add logic to register new reggroups.
+       (tdesc_reg::group): Update comment to indicate we allow
+       arbitrary strings.
+       * NEWS (Changes since GDB 8.0): Announce that GDB supports
+       arbitrary reggroups.
+
 2017-12-27  Stafford Horne  <shorne@gmail.com>
 
        * reggroups.c (reggroup_gdbarch_new): New function.
index 44f481d1f52e0f3e5988528fdf9de14a0344d86f..c861853798326aad5a7de391d36cba29dda4d578 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,10 @@
 
 *** Changes since GDB 8.0
 
+* GDB now supports dynamically creating arbitrary register groups specified
+  in XML target descriptions.  This allows for finer grain grouping of
+  registers on systems with a large amount of registers.
+
 * The 'ptype' command now accepts a '/o' flag, which prints the
   offsets and sizes of fields in a struct, like the pahole(1) tool.
 
index e958c23d88edf67fe2972d6a005904fb0de6ceaa..6a0dbda51effc2dce6019a5a27fe52f337cb33d8 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-27  Stafford Horne  <shorne@gmail.com>
+
+       * gdb.texinfo (Target Description Format): Explain that arbitrary
+       strings are now allowed for register groups.
+
 2017-12-27  Stafford Horne  <shorne@gmail.com>
 
        * gdb.texinfo (Registers): Document info reg $reggroup feature.
index a16e79bc2a768463629589770e9237c6428cad91..f8ecf216b469636a9b4c39c50692fa17d6601c00 100644 (file)
@@ -41761,10 +41761,13 @@ architecture's normal floating point format) of the correct size for
 @var{bitsize}.  The default is @code{int}.
 
 @item group
-The register group to which this register belongs.  It must
-be either @code{general}, @code{float}, or @code{vector}.  If no
-@var{group} is specified, @value{GDBN} will not display the register
-in @code{info registers}.
+The register group to which this register belongs.  It can be one of the
+standard register groups @code{general}, @code{float}, @code{vector} or an
+arbitrary string.  Group names should be limited to alphanumeric characters.
+If a group name is made up of multiple words the words may be separated by
+hyphens; e.g.@: @code{special-group} or @code{ultra-special-group}.  If no
+@var{group} is specified, @value{GDBN} will not display the register in
+@code{info registers}.
 
 @end table
 
index b37f4f0c193f5a4dfc652c2d67b8e523e8987d81..e8f098e09e42524328e23920e833e1055f99c9a5 100644 (file)
@@ -111,12 +111,11 @@ struct tdesc_reg : tdesc_element
   int save_restore;
 
   /* 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 empty).  */
+     if the group should be automatically determined from the register's
+     type.  This is traditionally "general", "float", "vector" but can
+     also be an arbitrary string.  If defined the corresponding "info"
+     command should display this register's value.  The string should be
+     limited to alphanumeric characters and internal hyphens.  */
   std::string group;
 
   /* The size of the register, in bits.  */
@@ -1279,17 +1278,13 @@ tdesc_remote_register_number (struct gdbarch *gdbarch, int regno)
 }
 
 /* Check whether REGNUM is a member of REGGROUP.  Registers from the
-   target description may be classified as general, float, or vector.
-   Unlike a gdbarch register_reggroup_p method, this function will
-   return -1 if it does not know; the caller should handle registers
-   with no specified group.
-
-   Arbitrary strings (other than "general", "float", and "vector")
-   from the description are not used; they cause the register to be
-   displayed in "info all-registers" but excluded from "info
-   registers" et al.  The names of containing features are also not
-   used.  This might be extended to display registers in some more
-   useful groupings.
+   target description may be classified as general, float, vector or other
+   register groups registered with reggroup_add().  Unlike a gdbarch
+   register_reggroup_p method, this function will return -1 if it does not
+   know; the caller should handle registers with no specified group.
+
+   The names of containing features are not used.  This might be extended
+   to display registers in some more useful groupings.
 
    The save-restore flag is also implemented here.  */
 
@@ -1299,26 +1294,9 @@ tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
 {
   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
 
-  if (reg != NULL && !reg->group.empty ())
-    {
-      int general_p = 0, float_p = 0, vector_p = 0;
-
-      if (reg->group == "general")
-       general_p = 1;
-      else if (reg->group == "float")
-       float_p = 1;
-      else if (reg->group == "vector")
-       vector_p = 1;
-
-      if (reggroup == float_reggroup)
-       return float_p;
-
-      if (reggroup == vector_reggroup)
-       return vector_p;
-
-      if (reggroup == general_reggroup)
-       return general_p;
-    }
+  if (reg != NULL && !reg->group.empty ()
+      && (reg->group == reggroup_name (reggroup)))
+       return 1;
 
   if (reg != NULL
       && (reggroup == save_reggroup || reggroup == restore_reggroup))
@@ -1421,6 +1399,12 @@ tdesc_use_registers (struct gdbarch *gdbarch,
        void **slot = htab_find_slot (reg_hash, reg.get (), INSERT);
 
        *slot = reg.get ();
+       /* Add reggroup if its new.  */
+       if (!reg->group.empty ())
+         if (reggroup_find (gdbarch, reg->group.c_str ()) == NULL)
+           reggroup_add (gdbarch, reggroup_gdbarch_new (gdbarch,
+                                                        reg->group.c_str (),
+                                                        USER_REGGROUP));
       }
 
   /* Remove any registers which were assigned numbers by the
index 4f708f0bfe66ca6cc428e43fe611b3433cf22a84..e3f18aeeeac1eaea247edddb90ee16743698f8b2 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-27  Stafford Horne  <shorne@gmail.com>
+
+       * gdb.xml/extra-regs.xml: Add example foo reggroup.
+       * gdb.xml/tdesc-regs.exp: Add test to check for foo reggroup.
+
 2017-12-27  Stafford Horne  <shorne@gmail.com>
 
        * gdb.base/reggroups.c: New file.
index 997d6598e522f94ba3a7348d816e67118c7aa941..302e64ce7db75bb6dd84909ef914170f43937e56 100644 (file)
@@ -53,5 +53,6 @@
     <reg name="bitfields" bitsize="64" type="struct2"/>
     <reg name="flags" bitsize="32" type="flags"/>
     <reg name="mixed_flags" bitsize="32" type="mixed_flags"/>
+    <reg name="groupreg" bitsize="32" type="uint32" group="foo"/>
   </feature>
 </target>
index d62ed9841b71bc44537a1b41a4e6ee1a09455bfc..e8b7fd506b6d8a50624b3b5995a6764e8c1cd8de 100644 (file)
@@ -190,6 +190,9 @@ gdb_test "ptype \$flags" \
     "type = flag flags {\r\n *bool X @0;\r\n *uint32_t Y @2;\r\n}"
 gdb_test "ptype \$mixed_flags" \
     "type = flag mixed_flags {\r\n *bool A @0;\r\n *uint32_t B @1-3;\r\n *bool C @4;\r\n *uint32_t D @5;\r\n *uint32_t @6-7;\r\n *enum {yes = 1, no = 0, maybe = 2, so} Z @8-9;\r\n}"
+# Reggroups should have at least general and the extra foo group
+gdb_test "maintenance print reggroups" \
+    " Group\[ \t\]+Type\[ \t\]+\r\n.* general\[ \t\]+user\[ \t\]+\r\n.* foo\[ \t\]+user\[ \t\]+"
 
 load_description "core-only.xml" "" "test-regs.xml"
 # The extra register from the previous description should be gone.