1 /* Python interface to register, and register group information.
3 Copyright (C) 2020 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "arch-utils.h"
24 #include "reggroups.h"
25 #include "python-internal.h"
27 /* Structure for iterator over register descriptors. */
31 /* The register group that the user is iterating over. This will never
33 struct reggroup
*reggroup
;
35 /* The next register number to lookup. Starts at 0 and counts up. */
38 /* Pointer back to the architecture we're finding registers for. */
39 struct gdbarch
*gdbarch
;
40 } register_descriptor_iterator_object
;
42 extern PyTypeObject register_descriptor_iterator_object_type
43 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_iterator_object");
45 /* A register descriptor. */
49 /* The register this is a descriptor for. */
52 /* The architecture this is a register for. */
53 struct gdbarch
*gdbarch
;
54 } register_descriptor_object
;
56 extern PyTypeObject register_descriptor_object_type
57 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_object");
59 /* Structure for iterator over register groups. */
63 /* The last register group returned. Initially this will be NULL. */
64 struct reggroup
*reggroup
;
66 /* Pointer back to the architecture we're finding registers for. */
67 struct gdbarch
*gdbarch
;
68 } reggroup_iterator_object
;
70 extern PyTypeObject reggroup_iterator_object_type
71 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_iterator_object");
73 /* A register group object. */
77 /* The register group being described. */
78 struct reggroup
*reggroup
;
81 extern PyTypeObject reggroup_object_type
82 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_object");
84 /* Create a new gdb.RegisterGroup object wrapping REGGROUP. */
87 gdbpy_new_reggroup (struct reggroup
*reggroup
)
89 /* Create a new object and fill in its details. */
90 reggroup_object
*group
91 = PyObject_New (reggroup_object
, ®group_object_type
);
94 group
->reggroup
= reggroup
;
95 return (PyObject
*) group
;
98 /* Convert a gdb.RegisterGroup to a string, it just returns the name of
99 the register group. */
102 gdbpy_reggroup_to_string (PyObject
*self
)
104 reggroup_object
*group
= (reggroup_object
*) self
;
105 struct reggroup
*reggroup
= group
->reggroup
;
107 const char *name
= reggroup_name (reggroup
);
108 return PyString_FromString (name
);
111 /* Implement gdb.RegisterGroup.name (self) -> String.
112 Return a string that is the name of this register group. */
115 gdbpy_reggroup_name (PyObject
*self
, void *closure
)
117 return gdbpy_reggroup_to_string (self
);
120 /* Create an return a new gdb.RegisterDescriptor object. */
122 gdbpy_new_register_descriptor (struct gdbarch
*gdbarch
,
125 /* Create a new object and fill in its details. */
126 register_descriptor_object
*reg
127 = PyObject_New (register_descriptor_object
,
128 ®ister_descriptor_object_type
);
131 reg
->regnum
= regnum
;
132 reg
->gdbarch
= gdbarch
;
133 return (PyObject
*) reg
;
136 /* Convert the register descriptor to a string. */
139 gdbpy_register_descriptor_to_string (PyObject
*self
)
141 register_descriptor_object
*reg
142 = (register_descriptor_object
*) self
;
143 struct gdbarch
*gdbarch
= reg
->gdbarch
;
144 int regnum
= reg
->regnum
;
146 const char *name
= gdbarch_register_name (gdbarch
, regnum
);
147 return PyString_FromString (name
);
150 /* Implement gdb.RegisterDescriptor.name attribute get function. Return a
151 string that is the name of this register. Due to checking when register
152 descriptors are created the name will never by the empty string. */
155 gdbpy_register_descriptor_name (PyObject
*self
, void *closure
)
157 return gdbpy_register_descriptor_to_string (self
);
160 /* Return a reference to the gdb.RegisterGroupsIterator object. */
163 gdbpy_reggroup_iter (PyObject
*self
)
169 /* Return the next gdb.RegisterGroup object from the iterator. */
172 gdbpy_reggroup_iter_next (PyObject
*self
)
174 reggroup_iterator_object
*iter_obj
175 = (reggroup_iterator_object
*) self
;
176 struct gdbarch
*gdbarch
= iter_obj
->gdbarch
;
178 struct reggroup
*next_group
= reggroup_next (gdbarch
, iter_obj
->reggroup
);
179 if (next_group
== NULL
)
181 PyErr_SetString (PyExc_StopIteration
, _("No more groups"));
185 iter_obj
->reggroup
= next_group
;
186 return gdbpy_new_reggroup (iter_obj
->reggroup
);
189 /* Return a new gdb.RegisterGroupsIterator over all the register groups in
193 gdbpy_new_reggroup_iterator (struct gdbarch
*gdbarch
)
195 gdb_assert (gdbarch
!= nullptr);
197 /* Create a new object and fill in its internal state. */
198 reggroup_iterator_object
*iter
199 = PyObject_New (reggroup_iterator_object
,
200 ®group_iterator_object_type
);
203 iter
->reggroup
= NULL
;
204 iter
->gdbarch
= gdbarch
;
205 return (PyObject
*) iter
;
208 /* Create and return a new gdb.RegisterDescriptorIterator object which
209 will iterate over all registers in GROUP_NAME for GDBARCH. If
210 GROUP_NAME is either NULL or the empty string then the ALL_REGGROUP is
211 used, otherwise lookup the register group matching GROUP_NAME and use
214 This function can return NULL if GROUP_NAME isn't found. */
217 gdbpy_new_register_descriptor_iterator (struct gdbarch
*gdbarch
,
218 const char *group_name
)
220 struct reggroup
*grp
= NULL
;
222 /* Lookup the requested register group, or find the default. */
223 if (group_name
== NULL
|| *group_name
== '\0')
227 grp
= reggroup_find (gdbarch
, group_name
);
230 PyErr_SetString (PyExc_ValueError
,
231 _("Unknown register group name."));
235 /* Create a new iterator object initialised for this architecture and
236 fill in all of the details. */
237 register_descriptor_iterator_object
*iter
238 = PyObject_New (register_descriptor_iterator_object
,
239 ®ister_descriptor_iterator_object_type
);
243 iter
->gdbarch
= gdbarch
;
244 gdb_assert (grp
!= NULL
);
245 iter
->reggroup
= grp
;
247 return (PyObject
*) iter
;
250 /* Return a reference to the gdb.RegisterDescriptorIterator object. */
253 gdbpy_register_descriptor_iter (PyObject
*self
)
259 /* Return the next register name. */
262 gdbpy_register_descriptor_iter_next (PyObject
*self
)
264 register_descriptor_iterator_object
*iter_obj
265 = (register_descriptor_iterator_object
*) self
;
266 struct gdbarch
*gdbarch
= iter_obj
->gdbarch
;
270 if (iter_obj
->regnum
>= gdbarch_num_cooked_regs (gdbarch
))
272 PyErr_SetString (PyExc_StopIteration
, _("No more registers"));
276 const char *name
= nullptr;
277 int regnum
= iter_obj
->regnum
;
278 if (gdbarch_register_reggroup_p (gdbarch
, regnum
,
280 name
= gdbarch_register_name (gdbarch
, regnum
);
283 if (name
!= nullptr && *name
!= '\0')
284 return gdbpy_new_register_descriptor (gdbarch
, regnum
);
289 /* Initializes the new Python classes from this file in the gdb module. */
292 gdbpy_initialize_registers ()
294 register_descriptor_object_type
.tp_new
= PyType_GenericNew
;
295 if (PyType_Ready (®ister_descriptor_object_type
) < 0)
297 if (gdb_pymodule_addobject
298 (gdb_module
, "RegisterDescriptor",
299 (PyObject
*) ®ister_descriptor_object_type
) < 0)
302 reggroup_iterator_object_type
.tp_new
= PyType_GenericNew
;
303 if (PyType_Ready (®group_iterator_object_type
) < 0)
305 if (gdb_pymodule_addobject
306 (gdb_module
, "RegisterGroupsIterator",
307 (PyObject
*) ®group_iterator_object_type
) < 0)
310 reggroup_object_type
.tp_new
= PyType_GenericNew
;
311 if (PyType_Ready (®group_object_type
) < 0)
313 if (gdb_pymodule_addobject
314 (gdb_module
, "RegisterGroup",
315 (PyObject
*) ®group_object_type
) < 0)
318 register_descriptor_iterator_object_type
.tp_new
= PyType_GenericNew
;
319 if (PyType_Ready (®ister_descriptor_iterator_object_type
) < 0)
321 return (gdb_pymodule_addobject
322 (gdb_module
, "RegisterDescriptorIterator",
323 (PyObject
*) ®ister_descriptor_iterator_object_type
));
326 PyTypeObject register_descriptor_iterator_object_type
= {
327 PyVarObject_HEAD_INIT (NULL
, 0)
328 "gdb.RegisterDescriptorIterator", /*tp_name*/
329 sizeof (register_descriptor_iterator_object
), /*tp_basicsize*/
338 0, /*tp_as_sequence*/
346 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
347 "GDB architecture register descriptor iterator object", /*tp_doc */
350 0, /*tp_richcompare */
351 0, /*tp_weaklistoffset */
352 gdbpy_register_descriptor_iter
, /*tp_iter */
353 gdbpy_register_descriptor_iter_next
, /*tp_iternext */
357 static gdb_PyGetSetDef gdbpy_register_descriptor_getset
[] = {
358 { "name", gdbpy_register_descriptor_name
, NULL
,
359 "The name of this register.", NULL
},
360 { NULL
} /* Sentinel */
363 PyTypeObject register_descriptor_object_type
= {
364 PyVarObject_HEAD_INIT (NULL
, 0)
365 "gdb.RegisterDescriptor", /*tp_name*/
366 sizeof (register_descriptor_object
), /*tp_basicsize*/
375 0, /*tp_as_sequence*/
379 gdbpy_register_descriptor_to_string
, /*tp_str*/
383 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
384 "GDB architecture register descriptor object", /*tp_doc */
387 0, /*tp_richcompare */
388 0, /*tp_weaklistoffset */
393 gdbpy_register_descriptor_getset
/*tp_getset */
396 PyTypeObject reggroup_iterator_object_type
= {
397 PyVarObject_HEAD_INIT (NULL
, 0)
398 "gdb.RegisterGroupsIterator", /*tp_name*/
399 sizeof (reggroup_iterator_object
), /*tp_basicsize*/
408 0, /*tp_as_sequence*/
416 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
417 "GDB register groups iterator object", /*tp_doc */
420 0, /*tp_richcompare */
421 0, /*tp_weaklistoffset */
422 gdbpy_reggroup_iter
, /*tp_iter */
423 gdbpy_reggroup_iter_next
, /*tp_iternext */
427 static gdb_PyGetSetDef gdbpy_reggroup_getset
[] = {
428 { "name", gdbpy_reggroup_name
, NULL
,
429 "The name of this register group.", NULL
},
430 { NULL
} /* Sentinel */
433 PyTypeObject reggroup_object_type
= {
434 PyVarObject_HEAD_INIT (NULL
, 0)
435 "gdb.RegisterGroup", /*tp_name*/
436 sizeof (reggroup_object
), /*tp_basicsize*/
445 0, /*tp_as_sequence*/
449 gdbpy_reggroup_to_string
, /*tp_str*/
453 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
454 "GDB register group object", /*tp_doc */
457 0, /*tp_richcompare */
458 0, /*tp_weaklistoffset */
463 gdbpy_reggroup_getset
/*tp_getset */