1 /* Register groupings for GDB, the GNU debugger.
3 Copyright 2002 Free Software Foundation, Inc.
5 Contributed by Red Hat.
7 This file is part of GDB.
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
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
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.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
25 #include "reggroups.h"
27 #include "gdb_assert.h"
30 #include "gdbcmd.h" /* For maintenanceprintlist. */
32 /* Individual register groups. */
37 enum reggroup_type type
;
41 reggroup_new (const char *name
, enum reggroup_type type
)
43 struct reggroup
*group
= XMALLOC (struct reggroup
);
49 /* Register group attributes. */
52 reggroup_name (struct reggroup
*group
)
58 reggroup_type (struct reggroup
*group
)
63 /* All the groups for a given architecture. */
68 struct reggroup
**group
;
71 static struct gdbarch_data
*reggroups_data
;
74 reggroups_init (struct gdbarch
*gdbarch
)
76 struct reggroups
*groups
= XMALLOC (struct reggroups
);
83 reggroups_free (struct gdbarch
*gdbarch
, void *data
)
85 struct reggroups
*groups
= data
;
86 xfree (groups
->group
);
90 /* Add a register group (with attribute values) to the pre-defined
91 list. This function can be called during architecture
92 initialization and hence needs to handle NULL architecture groups. */
95 add_group (struct reggroups
*groups
, struct reggroup
*group
)
97 gdb_assert (group
!= NULL
);
99 groups
->group
= xrealloc (groups
->group
, (sizeof (struct reggroup
*)
100 * (groups
->nr_group
+ 1)));
101 groups
->group
[groups
->nr_group
- 1] = group
;
102 groups
->group
[groups
->nr_group
] = NULL
;
106 reggroup_add (struct gdbarch
*gdbarch
, struct reggroup
*group
)
108 struct reggroups
*groups
= gdbarch_data (gdbarch
, reggroups_data
);
111 /* ULGH, called during architecture initialization. Patch
113 groups
= reggroups_init (gdbarch
);
114 set_gdbarch_data (gdbarch
, reggroups_data
, groups
);
116 add_group (groups
, group
);
119 /* The register groups for the current architecture. Mumble something
120 about the lifetime of the buffer.... */
122 static struct reggroups
*default_groups
;
124 struct reggroup
* const*
125 reggroups (struct gdbarch
*gdbarch
)
127 struct reggroups
*groups
= gdbarch_data (gdbarch
, reggroups_data
);
128 /* Don't allow this function to be called during architecture
130 gdb_assert (groups
!= NULL
);
131 if (groups
->group
== NULL
)
132 return default_groups
->group
;
134 return groups
->group
;
137 /* Is REGNUM a member of REGGROUP? */
139 default_register_reggroup_p (struct gdbarch
*gdbarch
, int regnum
,
140 struct reggroup
*group
)
145 if (REGISTER_NAME (regnum
) == NULL
146 || *REGISTER_NAME (regnum
) == '\0')
148 if (group
== all_reggroup
)
150 vector_p
= TYPE_VECTOR (register_type (gdbarch
, regnum
));
151 float_p
= TYPE_CODE (register_type (gdbarch
, regnum
)) == TYPE_CODE_FLT
;
152 /* FIXME: cagney/2003-04-13: Can't yet use gdbarch_num_regs
153 (gdbarch), as not all architectures are multi-arch. */
154 raw_p
= regnum
< NUM_REGS
;
155 if (group
== float_reggroup
)
157 if (group
== vector_reggroup
)
159 if (group
== general_reggroup
)
160 return (!vector_p
&& !float_p
);
161 if (group
== save_reggroup
|| group
== restore_reggroup
)
166 /* Dump out a table of register groups for the current architecture. */
169 reggroups_dump (struct gdbarch
*gdbarch
, struct ui_file
*file
)
171 struct reggroup
*const *groups
= reggroups (gdbarch
);
181 name
= reggroup_name (groups
[i
]);
182 fprintf_unfiltered (file
, " %-10s", name
);
192 switch (reggroup_type (groups
[i
]))
197 case INTERNAL_REGGROUP
:
201 internal_error (__FILE__
, __LINE__
, "bad switch");
204 fprintf_unfiltered (file
, " %-10s", type
);
207 /* Note: If you change this, be sure to also update the
210 fprintf_unfiltered (file
, "\n");
213 while (groups
[i
] != NULL
);
217 maintenance_print_reggroups (char *args
, int from_tty
)
220 reggroups_dump (current_gdbarch
, gdb_stdout
);
223 struct ui_file
*file
= gdb_fopen (args
, "w");
225 perror_with_name ("maintenance print reggroups");
226 reggroups_dump (current_gdbarch
, file
);
227 ui_file_delete (file
);
231 /* Pre-defined register groups. */
232 static struct reggroup general_group
= { "general", USER_REGGROUP
};
233 static struct reggroup float_group
= { "float", USER_REGGROUP
};
234 static struct reggroup system_group
= { "system", USER_REGGROUP
};
235 static struct reggroup vector_group
= { "vector", USER_REGGROUP
};
236 static struct reggroup all_group
= { "all", USER_REGGROUP
};
237 static struct reggroup save_group
= { "save", INTERNAL_REGGROUP
};
238 static struct reggroup restore_group
= { "restore", INTERNAL_REGGROUP
};
240 struct reggroup
*const general_reggroup
= &general_group
;
241 struct reggroup
*const float_reggroup
= &float_group
;
242 struct reggroup
*const system_reggroup
= &system_group
;
243 struct reggroup
*const vector_reggroup
= &vector_group
;
244 struct reggroup
*const all_reggroup
= &all_group
;
245 struct reggroup
*const save_reggroup
= &save_group
;
246 struct reggroup
*const restore_reggroup
= &restore_group
;
249 _initialize_reggroup (void)
251 reggroups_data
= register_gdbarch_data (reggroups_init
, reggroups_free
);
253 /* The pre-defined list of groups. */
254 default_groups
= reggroups_init (NULL
);
255 add_group (default_groups
, general_reggroup
);
256 add_group (default_groups
, float_reggroup
);
257 add_group (default_groups
, system_reggroup
);
258 add_group (default_groups
, vector_reggroup
);
259 add_group (default_groups
, all_reggroup
);
260 add_group (default_groups
, save_reggroup
);
261 add_group (default_groups
, restore_reggroup
);
264 add_cmd ("reggroups", class_maintenance
,
265 maintenance_print_reggroups
, "\
266 Print the internal register group names.\n\
267 Takes an optional file parameter.",
268 &maintenanceprintlist
);