2010-02-10 Sterling Augustine <sterling@tensilica.com>
[deliverable/binutils-gdb.git] / gdb / reggroups.c
CommitLineData
b59ff9d5
AC
1/* Register groupings for GDB, the GNU debugger.
2
4c38e0a4
JB
3 Copyright (C) 2002, 2003, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
b59ff9d5
AC
5
6 Contributed by Red Hat.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
b59ff9d5
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b59ff9d5
AC
22
23#include "defs.h"
e17c207e 24#include "arch-utils.h"
b59ff9d5
AC
25#include "reggroups.h"
26#include "gdbtypes.h"
27#include "gdb_assert.h"
28#include "regcache.h"
29#include "command.h"
30#include "gdbcmd.h" /* For maintenanceprintlist. */
31
32/* Individual register groups. */
33
34struct reggroup
35{
36 const char *name;
37 enum reggroup_type type;
38};
39
40struct reggroup *
41reggroup_new (const char *name, enum reggroup_type type)
42{
43 struct reggroup *group = XMALLOC (struct reggroup);
44 group->name = name;
45 group->type = type;
46 return group;
47}
48
49/* Register group attributes. */
50
51const char *
52reggroup_name (struct reggroup *group)
53{
54 return group->name;
55}
56
57enum reggroup_type
58reggroup_type (struct reggroup *group)
59{
60 return group->type;
61}
62
6c7d17ba
AC
63/* A linked list of groups for the given architecture. */
64
65struct reggroup_el
66{
67 struct reggroup *group;
68 struct reggroup_el *next;
69};
b59ff9d5
AC
70
71struct reggroups
72{
6c7d17ba
AC
73 struct reggroup_el *first;
74 struct reggroup_el **last;
b59ff9d5
AC
75};
76
77static struct gdbarch_data *reggroups_data;
78
79static void *
80reggroups_init (struct gdbarch *gdbarch)
81{
6c7d17ba
AC
82 struct reggroups *groups = GDBARCH_OBSTACK_ZALLOC (gdbarch,
83 struct reggroups);
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
153/* Is REGNUM a member of REGGROUP? */
154int
155default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
156 struct reggroup *group)
157{
158 int vector_p;
159 int float_p;
160 int raw_p;
7e6d0ac8 161
6bcde365
UW
162 if (gdbarch_register_name (gdbarch, regnum) == NULL
163 || *gdbarch_register_name (gdbarch, regnum) == '\0')
b59ff9d5
AC
164 return 0;
165 if (group == all_reggroup)
166 return 1;
167 vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
168 float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
6bcde365 169 raw_p = regnum < gdbarch_num_regs (gdbarch);
b59ff9d5
AC
170 if (group == float_reggroup)
171 return float_p;
172 if (group == vector_reggroup)
173 return vector_p;
174 if (group == general_reggroup)
175 return (!vector_p && !float_p);
176 if (group == save_reggroup || group == restore_reggroup)
177 return raw_p;
178 return 0;
179}
180
181/* Dump out a table of register groups for the current architecture. */
182
183static void
184reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file)
185{
6c7d17ba 186 struct reggroup *group = NULL;
7e6d0ac8 187
b59ff9d5
AC
188 do
189 {
190 /* Group name. */
191 {
192 const char *name;
6c7d17ba 193 if (group == NULL)
b59ff9d5
AC
194 name = "Group";
195 else
6c7d17ba 196 name = reggroup_name (group);
b59ff9d5
AC
197 fprintf_unfiltered (file, " %-10s", name);
198 }
199
200 /* Group type. */
201 {
202 const char *type;
6c7d17ba 203 if (group == NULL)
b59ff9d5
AC
204 type = "Type";
205 else
206 {
6c7d17ba 207 switch (reggroup_type (group))
b59ff9d5
AC
208 {
209 case USER_REGGROUP:
210 type = "user";
211 break;
212 case INTERNAL_REGGROUP:
213 type = "internal";
214 break;
215 default:
e2e0b3e5 216 internal_error (__FILE__, __LINE__, _("bad switch"));
b59ff9d5
AC
217 }
218 }
219 fprintf_unfiltered (file, " %-10s", type);
220 }
221
222 /* Note: If you change this, be sure to also update the
223 documentation. */
224
225 fprintf_unfiltered (file, "\n");
6c7d17ba
AC
226
227 group = reggroup_next (gdbarch, group);
b59ff9d5 228 }
6c7d17ba 229 while (group != NULL);
b59ff9d5
AC
230}
231
232static void
233maintenance_print_reggroups (char *args, int from_tty)
234{
e17c207e
UW
235 struct gdbarch *gdbarch = get_current_arch ();
236
b59ff9d5 237 if (args == NULL)
e17c207e 238 reggroups_dump (gdbarch, gdb_stdout);
b59ff9d5
AC
239 else
240 {
724b958c 241 struct cleanup *cleanups;
b59ff9d5
AC
242 struct ui_file *file = gdb_fopen (args, "w");
243 if (file == NULL)
e2e0b3e5 244 perror_with_name (_("maintenance print reggroups"));
724b958c 245 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 246 reggroups_dump (gdbarch, file);
724b958c 247 do_cleanups (cleanups);
b59ff9d5
AC
248 }
249}
250
251/* Pre-defined register groups. */
252static struct reggroup general_group = { "general", USER_REGGROUP };
253static struct reggroup float_group = { "float", USER_REGGROUP };
254static struct reggroup system_group = { "system", USER_REGGROUP };
255static struct reggroup vector_group = { "vector", USER_REGGROUP };
256static struct reggroup all_group = { "all", USER_REGGROUP };
257static struct reggroup save_group = { "save", INTERNAL_REGGROUP };
258static struct reggroup restore_group = { "restore", INTERNAL_REGGROUP };
259
260struct reggroup *const general_reggroup = &general_group;
261struct reggroup *const float_reggroup = &float_group;
262struct reggroup *const system_reggroup = &system_group;
263struct reggroup *const vector_reggroup = &vector_group;
264struct reggroup *const all_reggroup = &all_group;
265struct reggroup *const save_reggroup = &save_group;
266struct reggroup *const restore_reggroup = &restore_group;
267
b9362cc7
AC
268extern initialize_file_ftype _initialize_reggroup; /* -Wmissing-prototypes */
269
b59ff9d5
AC
270void
271_initialize_reggroup (void)
272{
030f20e1 273 reggroups_data = gdbarch_data_register_post_init (reggroups_init);
b59ff9d5
AC
274
275 /* The pre-defined list of groups. */
6c7d17ba
AC
276 add_group (&default_groups, general_reggroup, XMALLOC (struct reggroup_el));
277 add_group (&default_groups, float_reggroup, XMALLOC (struct reggroup_el));
278 add_group (&default_groups, system_reggroup, XMALLOC (struct reggroup_el));
279 add_group (&default_groups, vector_reggroup, XMALLOC (struct reggroup_el));
280 add_group (&default_groups, all_reggroup, XMALLOC (struct reggroup_el));
281 add_group (&default_groups, save_reggroup, XMALLOC (struct reggroup_el));
282 add_group (&default_groups, restore_reggroup, XMALLOC (struct reggroup_el));
b59ff9d5
AC
283
284 add_cmd ("reggroups", class_maintenance,
1a966eab 285 maintenance_print_reggroups, _("\
b59ff9d5 286Print the internal register group names.\n\
1a966eab 287Takes an optional file parameter."),
b59ff9d5
AC
288 &maintenanceprintlist);
289
290}
This page took 0.775059 seconds and 4 git commands to generate.