windows-nat: Don't change current_event.dwThreadId in handle_output_debug_string()
[deliverable/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
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;
123f5f96 193
6c7d17ba 194 if (group == NULL)
b59ff9d5
AC
195 name = "Group";
196 else
6c7d17ba 197 name = reggroup_name (group);
b59ff9d5
AC
198 fprintf_unfiltered (file, " %-10s", name);
199 }
200
201 /* Group type. */
202 {
203 const char *type;
123f5f96 204
6c7d17ba 205 if (group == NULL)
b59ff9d5
AC
206 type = "Type";
207 else
208 {
6c7d17ba 209 switch (reggroup_type (group))
b59ff9d5
AC
210 {
211 case USER_REGGROUP:
212 type = "user";
213 break;
214 case INTERNAL_REGGROUP:
215 type = "internal";
216 break;
217 default:
e2e0b3e5 218 internal_error (__FILE__, __LINE__, _("bad switch"));
b59ff9d5
AC
219 }
220 }
221 fprintf_unfiltered (file, " %-10s", type);
222 }
223
224 /* Note: If you change this, be sure to also update the
225 documentation. */
226
227 fprintf_unfiltered (file, "\n");
6c7d17ba
AC
228
229 group = reggroup_next (gdbarch, group);
b59ff9d5 230 }
6c7d17ba 231 while (group != NULL);
b59ff9d5
AC
232}
233
234static void
235maintenance_print_reggroups (char *args, int from_tty)
236{
e17c207e
UW
237 struct gdbarch *gdbarch = get_current_arch ();
238
b59ff9d5 239 if (args == NULL)
e17c207e 240 reggroups_dump (gdbarch, gdb_stdout);
b59ff9d5
AC
241 else
242 {
724b958c 243 struct cleanup *cleanups;
b59ff9d5 244 struct ui_file *file = gdb_fopen (args, "w");
123f5f96 245
b59ff9d5 246 if (file == NULL)
e2e0b3e5 247 perror_with_name (_("maintenance print reggroups"));
724b958c 248 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 249 reggroups_dump (gdbarch, file);
724b958c 250 do_cleanups (cleanups);
b59ff9d5
AC
251 }
252}
253
254/* Pre-defined register groups. */
255static struct reggroup general_group = { "general", USER_REGGROUP };
256static struct reggroup float_group = { "float", USER_REGGROUP };
257static struct reggroup system_group = { "system", USER_REGGROUP };
258static struct reggroup vector_group = { "vector", USER_REGGROUP };
259static struct reggroup all_group = { "all", USER_REGGROUP };
260static struct reggroup save_group = { "save", INTERNAL_REGGROUP };
261static struct reggroup restore_group = { "restore", INTERNAL_REGGROUP };
262
263struct reggroup *const general_reggroup = &general_group;
264struct reggroup *const float_reggroup = &float_group;
265struct reggroup *const system_reggroup = &system_group;
266struct reggroup *const vector_reggroup = &vector_group;
267struct reggroup *const all_reggroup = &all_group;
268struct reggroup *const save_reggroup = &save_group;
269struct reggroup *const restore_reggroup = &restore_group;
270
b9362cc7
AC
271extern initialize_file_ftype _initialize_reggroup; /* -Wmissing-prototypes */
272
b59ff9d5
AC
273void
274_initialize_reggroup (void)
275{
030f20e1 276 reggroups_data = gdbarch_data_register_post_init (reggroups_init);
b59ff9d5
AC
277
278 /* The pre-defined list of groups. */
70ba0933
TT
279 add_group (&default_groups, general_reggroup, XNEW (struct reggroup_el));
280 add_group (&default_groups, float_reggroup, XNEW (struct reggroup_el));
281 add_group (&default_groups, system_reggroup, XNEW (struct reggroup_el));
282 add_group (&default_groups, vector_reggroup, XNEW (struct reggroup_el));
283 add_group (&default_groups, all_reggroup, XNEW (struct reggroup_el));
284 add_group (&default_groups, save_reggroup, XNEW (struct reggroup_el));
285 add_group (&default_groups, restore_reggroup, XNEW (struct reggroup_el));
b59ff9d5
AC
286
287 add_cmd ("reggroups", class_maintenance,
1a966eab 288 maintenance_print_reggroups, _("\
b59ff9d5 289Print the internal register group names.\n\
1a966eab 290Takes an optional file parameter."),
b59ff9d5
AC
291 &maintenanceprintlist);
292
293}
This page took 1.267372 seconds and 4 git commands to generate.