1 # This testcase is part of GDB
, the GNU debugger.
3 # Copyright
2017-2024 Free Software Foundation
, Inc.
5 # This
program is free software
; you can redistribute it and
/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation
; either version
3 of the License
, or
8 #
(at your option
) any later version.
10 # This
program is distributed in the hope that it will be useful
,
11 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License
for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this
program.
If not
, see
<http
://www.gnu.org
/licenses
/>.
18 # Test listing reggroups and the registers in each group.
22 if {[prepare_for_testing
"failed to prepare" $testfile $srcfile debug]} {
30 set invalid_register_re
"Invalid register \[^\r\n\]*"
32 #
Fetch all reggroups from
'maint print reggroups'.
34 proc fetch_reggroups
{test
} {
38 gdb_test_multiple
"maint print reggroups" $test {
39 -re
"maint print reggroups\r\n" {
42 -re
"^Group\[ \t\]+Type\[ \t\]+\r\n" {
45 -re
"^(\[_0-9a-zA-Z-\]+)\[ \t\]+(user|internal)\[ \t\]+\r\n" {
46 lappend reggroups $expect_out
(1,string
)
50 gdb_assert
"[llength $reggroups] != 0" $test
54 verbose
-log "found reggroups: $reggroups"
58 #
Fetch all registers
for a reggroup from
'info reg <reggroup>'.
60 proc fetch_reggroup_regs
{reggroup test
} {
62 global invalid_register_re
64 # The command
info reg
<reggroup
> will
return something like the following
:
67 # r1
0x7fdffc 0x7fdffc^M
68 # r2
0x7fe000 0x7fe000^M
69 # npc
0x23a8 0x23a8 <main
+12>^M
70 # sr
0x8401 [ SM CY FO CID
=0 ]^M
72 # We
parse out and
return the reg names
, this is done by detecting
73 # that
for each line we have a register
name followed by a $hex number.
75 # Note
: we will not
return vector registers
, but I think this is ok because
76 #
for testing purposes we just want to ensure we
get some registers and dont
77 # fail. Example vector register
:
79 # xmm0
{v4_float
= {0x0, 0x0, 0x0, 0x0}, v2_double
= {0x0, ...
}}
82 set have_invalid_register_fail
0
83 set re_regname
"\[0-9a-zA-Z_-\]+"
85 set re_hs
"\[^\n\r\]+"
87 set re_lookahead_eol
"(?=$re_eol)"
88 gdb_test_multiple
"info reg $reggroup" $test -lbl {
89 -re
"^info reg $reggroup" {
92 -re
"^${re_eol}($re_regname)$re_hws$::hex$re_hws${re_hs}$re_lookahead_eol" {
93 lappend regs $expect_out
(1,string
)
96 -re $invalid_register_re
{
97 set have_invalid_register_fail
1
101 if { $have_invalid_register_fail
} {
102 fail
"$test (unexpected invalid register response)"
109 verbose
-log "found regs in reggroup $reggroup: [join $regs]"
113 set reggroups
[fetch_reggroups
"fetch reggroups"]
115 foreach reggroup $reggroups
{
116 set regs
[fetch_reggroup_regs $reggroup
"fetch reggroup regs $reggroup"]
117 set regcount
[expr $regcount
+ [llength $regs
]]
120 gdb_assert
"[llength $regcount] != 0" "system has reggroup registers"
122 #
If this fails it means that probably someone changed the error
text returned
123 #
for an invalid register
argument.
If that happens we should fix the pattern
124 # here and in the fetch_reggroup_regs procedure above.
125 gdb_test
"info reg invalid-reggroup" $invalid_register_re \
126 "info reg invalid-reggroup should report 'Invalid register'"