aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/NEWS4
-rw-r--r--gdb/doc/ChangeLog5
-rw-r--r--gdb/doc/gdb.texinfo11
-rw-r--r--gdb/target-descriptions.c58
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.xml/extra-regs.xml1
-rw-r--r--gdb/testsuite/gdb.xml/tdesc-regs.exp3
8 files changed, 57 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e3ef0fe..4d85029 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/NEWS b/gdb/NEWS
index 44f481d..c861853 100644
--- 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.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index e958c23..6a0dbda 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,5 +1,10 @@
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.
2017-12-15 Sergio Durigan Junior <sergiodj@redhat.com>
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index a16e79b..f8ecf21 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -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
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index b37f4f0..e8f098e 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -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
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 4f708f0..e3f18ae 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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.
* gdb.base/reggroups.exp: New file.
diff --git a/gdb/testsuite/gdb.xml/extra-regs.xml b/gdb/testsuite/gdb.xml/extra-regs.xml
index 997d659..302e64c 100644
--- a/gdb/testsuite/gdb.xml/extra-regs.xml
+++ b/gdb/testsuite/gdb.xml/extra-regs.xml
@@ -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>
diff --git a/gdb/testsuite/gdb.xml/tdesc-regs.exp b/gdb/testsuite/gdb.xml/tdesc-regs.exp
index d62ed98..e8b7fd5 100644
--- a/gdb/testsuite/gdb.xml/tdesc-regs.exp
+++ b/gdb/testsuite/gdb.xml/tdesc-regs.exp
@@ -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.