*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / reggroups.c
CommitLineData
b59ff9d5
AC
1/* Register groupings for GDB, the GNU debugger.
2
0fb0cc75 3 Copyright (C) 2002, 2003, 2007, 2008, 2009 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"
26#include "gdb_assert.h"
27#include "regcache.h"
28#include "command.h"
29#include "gdbcmd.h" /* For maintenanceprintlist. */
30
31/* Individual register groups. */
32
33struct reggroup
34{
35 const char *name;
36 enum reggroup_type type;
37};
38
39struct reggroup *
40reggroup_new (const char *name, enum reggroup_type type)
41{
42 struct reggroup *group = XMALLOC (struct reggroup);
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);
83 groups->last = &groups->first;
b59ff9d5
AC
84 return groups;
85}
86
b59ff9d5 87/* Add a register group (with attribute values) to the pre-defined
6c7d17ba 88 list. */
b59ff9d5
AC
89
90static void
6c7d17ba
AC
91add_group (struct reggroups *groups, struct reggroup *group,
92 struct reggroup_el *el)
b59ff9d5
AC
93{
94 gdb_assert (group != NULL);
6c7d17ba
AC
95 el->group = group;
96 el->next = NULL;
97 (*groups->last) = el;
98 groups->last = &el->next;
b59ff9d5
AC
99}
100
101void
102reggroup_add (struct gdbarch *gdbarch, struct reggroup *group)
103{
104 struct reggroups *groups = gdbarch_data (gdbarch, reggroups_data);
7e6d0ac8 105
b59ff9d5
AC
106 if (groups == NULL)
107 {
108 /* ULGH, called during architecture initialization. Patch
109 things up. */
110 groups = reggroups_init (gdbarch);
030f20e1 111 deprecated_set_gdbarch_data (gdbarch, reggroups_data, groups);
b59ff9d5 112 }
6c7d17ba
AC
113 add_group (groups, group,
114 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct reggroup_el));
b59ff9d5
AC
115}
116
6c7d17ba
AC
117/* The default register groups for an architecture. */
118
119static struct reggroups default_groups = { NULL, &default_groups.first };
b59ff9d5 120
6c7d17ba 121/* A register group iterator. */
b59ff9d5 122
6c7d17ba
AC
123struct reggroup *
124reggroup_next (struct gdbarch *gdbarch, struct reggroup *last)
b59ff9d5 125{
6c7d17ba
AC
126 struct reggroups *groups;
127 struct reggroup_el *el;
7e6d0ac8 128
b59ff9d5 129 /* Don't allow this function to be called during architecture
6c7d17ba
AC
130 creation. If there are no groups, use the default groups list. */
131 groups = gdbarch_data (gdbarch, reggroups_data);
b59ff9d5 132 gdb_assert (groups != NULL);
6c7d17ba
AC
133 if (groups->first == NULL)
134 groups = &default_groups;
135
9dd5f34f 136 /* Return the first/next reggroup. */
6c7d17ba
AC
137 if (last == NULL)
138 return groups->first->group;
139 for (el = groups->first; el != NULL; el = el->next)
140 {
141 if (el->group == last)
9dd5f34f
AC
142 {
143 if (el->next != NULL)
144 return el->next->group;
145 else
146 return NULL;
147 }
6c7d17ba
AC
148 }
149 return NULL;
b59ff9d5
AC
150}
151
152/* Is REGNUM a member of REGGROUP? */
153int
154default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
155 struct reggroup *group)
156{
157 int vector_p;
158 int float_p;
159 int raw_p;
7e6d0ac8 160
6bcde365
UW
161 if (gdbarch_register_name (gdbarch, regnum) == NULL
162 || *gdbarch_register_name (gdbarch, regnum) == '\0')
b59ff9d5
AC
163 return 0;
164 if (group == all_reggroup)
165 return 1;
166 vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
167 float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
6bcde365 168 raw_p = regnum < gdbarch_num_regs (gdbarch);
b59ff9d5
AC
169 if (group == float_reggroup)
170 return float_p;
171 if (group == vector_reggroup)
172 return vector_p;
173 if (group == general_reggroup)
174 return (!vector_p && !float_p);
175 if (group == save_reggroup || group == restore_reggroup)
176 return raw_p;
177 return 0;
178}
179
180/* Dump out a table of register groups for the current architecture. */
181
182static void
183reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file)
184{
6c7d17ba 185 struct reggroup *group = NULL;
7e6d0ac8 186
b59ff9d5
AC
187 do
188 {
189 /* Group name. */
190 {
191 const char *name;
6c7d17ba 192 if (group == NULL)
b59ff9d5
AC
193 name = "Group";
194 else
6c7d17ba 195 name = reggroup_name (group);
b59ff9d5
AC
196 fprintf_unfiltered (file, " %-10s", name);
197 }
198
199 /* Group type. */
200 {
201 const char *type;
6c7d17ba 202 if (group == NULL)
b59ff9d5
AC
203 type = "Type";
204 else
205 {
6c7d17ba 206 switch (reggroup_type (group))
b59ff9d5
AC
207 {
208 case USER_REGGROUP:
209 type = "user";
210 break;
211 case INTERNAL_REGGROUP:
212 type = "internal";
213 break;
214 default:
e2e0b3e5 215 internal_error (__FILE__, __LINE__, _("bad switch"));
b59ff9d5
AC
216 }
217 }
218 fprintf_unfiltered (file, " %-10s", type);
219 }
220
221 /* Note: If you change this, be sure to also update the
222 documentation. */
223
224 fprintf_unfiltered (file, "\n");
6c7d17ba
AC
225
226 group = reggroup_next (gdbarch, group);
b59ff9d5 227 }
6c7d17ba 228 while (group != NULL);
b59ff9d5
AC
229}
230
231static void
232maintenance_print_reggroups (char *args, int from_tty)
233{
e17c207e
UW
234 struct gdbarch *gdbarch = get_current_arch ();
235
b59ff9d5 236 if (args == NULL)
e17c207e 237 reggroups_dump (gdbarch, gdb_stdout);
b59ff9d5
AC
238 else
239 {
724b958c 240 struct cleanup *cleanups;
b59ff9d5
AC
241 struct ui_file *file = gdb_fopen (args, "w");
242 if (file == NULL)
e2e0b3e5 243 perror_with_name (_("maintenance print reggroups"));
724b958c 244 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 245 reggroups_dump (gdbarch, file);
724b958c 246 do_cleanups (cleanups);
b59ff9d5
AC
247 }
248}
249
250/* Pre-defined register groups. */
251static struct reggroup general_group = { "general", USER_REGGROUP };
252static struct reggroup float_group = { "float", USER_REGGROUP };
253static struct reggroup system_group = { "system", USER_REGGROUP };
254static struct reggroup vector_group = { "vector", USER_REGGROUP };
255static struct reggroup all_group = { "all", USER_REGGROUP };
256static struct reggroup save_group = { "save", INTERNAL_REGGROUP };
257static struct reggroup restore_group = { "restore", INTERNAL_REGGROUP };
258
259struct reggroup *const general_reggroup = &general_group;
260struct reggroup *const float_reggroup = &float_group;
261struct reggroup *const system_reggroup = &system_group;
262struct reggroup *const vector_reggroup = &vector_group;
263struct reggroup *const all_reggroup = &all_group;
264struct reggroup *const save_reggroup = &save_group;
265struct reggroup *const restore_reggroup = &restore_group;
266
b9362cc7
AC
267extern initialize_file_ftype _initialize_reggroup; /* -Wmissing-prototypes */
268
b59ff9d5
AC
269void
270_initialize_reggroup (void)
271{
030f20e1 272 reggroups_data = gdbarch_data_register_post_init (reggroups_init);
b59ff9d5
AC
273
274 /* The pre-defined list of groups. */
6c7d17ba
AC
275 add_group (&default_groups, general_reggroup, XMALLOC (struct reggroup_el));
276 add_group (&default_groups, float_reggroup, XMALLOC (struct reggroup_el));
277 add_group (&default_groups, system_reggroup, XMALLOC (struct reggroup_el));
278 add_group (&default_groups, vector_reggroup, XMALLOC (struct reggroup_el));
279 add_group (&default_groups, all_reggroup, XMALLOC (struct reggroup_el));
280 add_group (&default_groups, save_reggroup, XMALLOC (struct reggroup_el));
281 add_group (&default_groups, restore_reggroup, XMALLOC (struct reggroup_el));
b59ff9d5
AC
282
283 add_cmd ("reggroups", class_maintenance,
1a966eab 284 maintenance_print_reggroups, _("\
b59ff9d5 285Print the internal register group names.\n\
1a966eab 286Takes an optional file parameter."),
b59ff9d5
AC
287 &maintenanceprintlist);
288
289}
This page took 1.152657 seconds and 4 git commands to generate.