]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/reggroups.c
Add some more casts (1/2)
[thirdparty/binutils-gdb.git] / gdb / reggroups.c
CommitLineData
b59ff9d5
AC
1/* Register groupings for GDB, the GNU debugger.
2
32d0add0 3 Copyright (C) 2002-2015 Free Software Foundation, Inc.
b59ff9d5
AC
4
5 Contributed by Red Hat.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
b59ff9d5
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b59ff9d5
AC
21
22#include "defs.h"
e17c207e 23#include "arch-utils.h"
b59ff9d5
AC
24#include "reggroups.h"
25#include "gdbtypes.h"
b59ff9d5
AC
26#include "regcache.h"
27#include "command.h"
28#include "gdbcmd.h" /* For maintenanceprintlist. */
29
30/* Individual register groups. */
31
32struct reggroup
33{
34 const char *name;
35 enum reggroup_type type;
36};
37
38struct reggroup *
39reggroup_new (const char *name, enum reggroup_type type)
40{
70ba0933 41 struct reggroup *group = XNEW (struct reggroup);
123f5f96 42
b59ff9d5
AC
43 group->name = name;
44 group->type = type;
45 return group;
46}
47
48/* Register group attributes. */
49
50const char *
51reggroup_name (struct reggroup *group)
52{
53 return group->name;
54}
55
56enum reggroup_type
57reggroup_type (struct reggroup *group)
58{
59 return group->type;
60}
61
6c7d17ba
AC
62/* A linked list of groups for the given architecture. */
63
64struct reggroup_el
65{
66 struct reggroup *group;
67 struct reggroup_el *next;
68};
b59ff9d5
AC
69
70struct reggroups
71{
6c7d17ba
AC
72 struct reggroup_el *first;
73 struct reggroup_el **last;
b59ff9d5
AC
74};
75
76static struct gdbarch_data *reggroups_data;
77
78static void *
79reggroups_init (struct gdbarch *gdbarch)
80{
6c7d17ba
AC
81 struct reggroups *groups = GDBARCH_OBSTACK_ZALLOC (gdbarch,
82 struct reggroups);
123f5f96 83
6c7d17ba 84 groups->last = &groups->first;
b59ff9d5
AC
85 return groups;
86}
87
b59ff9d5 88/* Add a register group (with attribute values) to the pre-defined
6c7d17ba 89 list. */
b59ff9d5
AC
90
91static void
6c7d17ba
AC
92add_group (struct reggroups *groups, struct reggroup *group,
93 struct reggroup_el *el)
b59ff9d5
AC
94{
95 gdb_assert (group != NULL);
6c7d17ba
AC
96 el->group = group;
97 el->next = NULL;
98 (*groups->last) = el;
99 groups->last = &el->next;
b59ff9d5
AC
100}
101
102void
103reggroup_add (struct gdbarch *gdbarch, struct reggroup *group)
104{
105 struct reggroups *groups = gdbarch_data (gdbarch, reggroups_data);
7e6d0ac8 106
b59ff9d5
AC
107 if (groups == NULL)
108 {
109 /* ULGH, called during architecture initialization. Patch
110 things up. */
111 groups = reggroups_init (gdbarch);
030f20e1 112 deprecated_set_gdbarch_data (gdbarch, reggroups_data, groups);
b59ff9d5 113 }
6c7d17ba
AC
114 add_group (groups, group,
115 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct reggroup_el));
b59ff9d5
AC
116}
117
6c7d17ba
AC
118/* The default register groups for an architecture. */
119
120static struct reggroups default_groups = { NULL, &default_groups.first };
b59ff9d5 121
6c7d17ba 122/* A register group iterator. */
b59ff9d5 123
6c7d17ba
AC
124struct reggroup *
125reggroup_next (struct gdbarch *gdbarch, struct reggroup *last)
b59ff9d5 126{
6c7d17ba
AC
127 struct reggroups *groups;
128 struct reggroup_el *el;
7e6d0ac8 129
b59ff9d5 130 /* Don't allow this function to be called during architecture
6c7d17ba
AC
131 creation. If there are no groups, use the default groups list. */
132 groups = gdbarch_data (gdbarch, reggroups_data);
b59ff9d5 133 gdb_assert (groups != NULL);
6c7d17ba
AC
134 if (groups->first == NULL)
135 groups = &default_groups;
136
9dd5f34f 137 /* Return the first/next reggroup. */
6c7d17ba
AC
138 if (last == NULL)
139 return groups->first->group;
140 for (el = groups->first; el != NULL; el = el->next)
141 {
142 if (el->group == last)
9dd5f34f
AC
143 {
144 if (el->next != NULL)
145 return el->next->group;
146 else
147 return NULL;
148 }
6c7d17ba
AC
149 }
150 return NULL;
b59ff9d5
AC
151}
152
55b40027
AB
153/* See reggroups.h. */
154
155struct reggroup *
156reggroup_prev (struct gdbarch *gdbarch, struct reggroup *curr)
157{
158 struct reggroups *groups;
159 struct reggroup_el *el;
160 struct reggroup *prev;
161
162 /* Don't allow this function to be called during architecture
163 creation. If there are no groups, use the default groups list. */
164 groups = gdbarch_data (gdbarch, reggroups_data);
165 gdb_assert (groups != NULL);
166 if (groups->first == NULL)
167 groups = &default_groups;
168
169 prev = NULL;
170 for (el = groups->first; el != NULL; el = el->next)
171 {
172 gdb_assert (el->group != NULL);
173 if (el->group == curr)
174 return prev;
175 prev = el->group;
176 }
177 if (curr == NULL)
178 return prev;
179 return NULL;
180}
181
b59ff9d5
AC
182/* Is REGNUM a member of REGGROUP? */
183int
184default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
185 struct reggroup *group)
186{
187 int vector_p;
188 int float_p;
189 int raw_p;
7e6d0ac8 190
6bcde365
UW
191 if (gdbarch_register_name (gdbarch, regnum) == NULL
192 || *gdbarch_register_name (gdbarch, regnum) == '\0')
b59ff9d5
AC
193 return 0;
194 if (group == all_reggroup)
195 return 1;
196 vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
197 float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
6bcde365 198 raw_p = regnum < gdbarch_num_regs (gdbarch);
b59ff9d5
AC
199 if (group == float_reggroup)
200 return float_p;
201 if (group == vector_reggroup)
202 return vector_p;
203 if (group == general_reggroup)
204 return (!vector_p && !float_p);
205 if (group == save_reggroup || group == restore_reggroup)
206 return raw_p;
207 return 0;
208}
209
210/* Dump out a table of register groups for the current architecture. */
211
212static void
213reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file)
214{
6c7d17ba 215 struct reggroup *group = NULL;
7e6d0ac8 216
b59ff9d5
AC
217 do
218 {
219 /* Group name. */
220 {
221 const char *name;
123f5f96 222
6c7d17ba 223 if (group == NULL)
b59ff9d5
AC
224 name = "Group";
225 else
6c7d17ba 226 name = reggroup_name (group);
b59ff9d5
AC
227 fprintf_unfiltered (file, " %-10s", name);
228 }
229
230 /* Group type. */
231 {
232 const char *type;
123f5f96 233
6c7d17ba 234 if (group == NULL)
b59ff9d5
AC
235 type = "Type";
236 else
237 {
6c7d17ba 238 switch (reggroup_type (group))
b59ff9d5
AC
239 {
240 case USER_REGGROUP:
241 type = "user";
242 break;
243 case INTERNAL_REGGROUP:
244 type = "internal";
245 break;
246 default:
e2e0b3e5 247 internal_error (__FILE__, __LINE__, _("bad switch"));
b59ff9d5
AC
248 }
249 }
250 fprintf_unfiltered (file, " %-10s", type);
251 }
252
253 /* Note: If you change this, be sure to also update the
254 documentation. */
255
256 fprintf_unfiltered (file, "\n");
6c7d17ba
AC
257
258 group = reggroup_next (gdbarch, group);
b59ff9d5 259 }
6c7d17ba 260 while (group != NULL);
b59ff9d5
AC
261}
262
263static void
264maintenance_print_reggroups (char *args, int from_tty)
265{
e17c207e
UW
266 struct gdbarch *gdbarch = get_current_arch ();
267
b59ff9d5 268 if (args == NULL)
e17c207e 269 reggroups_dump (gdbarch, gdb_stdout);
b59ff9d5
AC
270 else
271 {
724b958c 272 struct cleanup *cleanups;
b59ff9d5 273 struct ui_file *file = gdb_fopen (args, "w");
123f5f96 274
b59ff9d5 275 if (file == NULL)
e2e0b3e5 276 perror_with_name (_("maintenance print reggroups"));
724b958c 277 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 278 reggroups_dump (gdbarch, file);
724b958c 279 do_cleanups (cleanups);
b59ff9d5
AC
280 }
281}
282
283/* Pre-defined register groups. */
284static struct reggroup general_group = { "general", USER_REGGROUP };
285static struct reggroup float_group = { "float", USER_REGGROUP };
286static struct reggroup system_group = { "system", USER_REGGROUP };
287static struct reggroup vector_group = { "vector", USER_REGGROUP };
288static struct reggroup all_group = { "all", USER_REGGROUP };
289static struct reggroup save_group = { "save", INTERNAL_REGGROUP };
290static struct reggroup restore_group = { "restore", INTERNAL_REGGROUP };
291
292struct reggroup *const general_reggroup = &general_group;
293struct reggroup *const float_reggroup = &float_group;
294struct reggroup *const system_reggroup = &system_group;
295struct reggroup *const vector_reggroup = &vector_group;
296struct reggroup *const all_reggroup = &all_group;
297struct reggroup *const save_reggroup = &save_group;
298struct reggroup *const restore_reggroup = &restore_group;
299
b9362cc7
AC
300extern initialize_file_ftype _initialize_reggroup; /* -Wmissing-prototypes */
301
b59ff9d5
AC
302void
303_initialize_reggroup (void)
304{
030f20e1 305 reggroups_data = gdbarch_data_register_post_init (reggroups_init);
b59ff9d5
AC
306
307 /* The pre-defined list of groups. */
70ba0933
TT
308 add_group (&default_groups, general_reggroup, XNEW (struct reggroup_el));
309 add_group (&default_groups, float_reggroup, XNEW (struct reggroup_el));
310 add_group (&default_groups, system_reggroup, XNEW (struct reggroup_el));
311 add_group (&default_groups, vector_reggroup, XNEW (struct reggroup_el));
312 add_group (&default_groups, all_reggroup, XNEW (struct reggroup_el));
313 add_group (&default_groups, save_reggroup, XNEW (struct reggroup_el));
314 add_group (&default_groups, restore_reggroup, XNEW (struct reggroup_el));
b59ff9d5
AC
315
316 add_cmd ("reggroups", class_maintenance,
1a966eab 317 maintenance_print_reggroups, _("\
b59ff9d5 318Print the internal register group names.\n\
1a966eab 319Takes an optional file parameter."),
b59ff9d5
AC
320 &maintenanceprintlist);
321
322}