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"
26 #include "user-regs.h"
27 #include <unordered_map>
29 /* Token to access per-gdbarch data related to register descriptors. */
30 static struct gdbarch_data
*gdbpy_register_object_data
= NULL
;
32 /* Structure for iterator over register descriptors. */
36 /* The register group that the user is iterating over. This will never
38 struct reggroup
*reggroup
;
40 /* The next register number to lookup. Starts at 0 and counts up. */
43 /* Pointer back to the architecture we're finding registers for. */
44 struct gdbarch
*gdbarch
;
45 } register_descriptor_iterator_object
;
47 extern PyTypeObject register_descriptor_iterator_object_type
48 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_iterator_object");
50 /* A register descriptor. */
54 /* The register this is a descriptor for. */
57 /* The architecture this is a register for. */
58 struct gdbarch
*gdbarch
;
59 } register_descriptor_object
;
61 extern PyTypeObject register_descriptor_object_type
62 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_object");
64 /* Structure for iterator over register groups. */
68 /* The last register group returned. Initially this will be NULL. */
69 struct reggroup
*reggroup
;
71 /* Pointer back to the architecture we're finding registers for. */
72 struct gdbarch
*gdbarch
;
73 } reggroup_iterator_object
;
75 extern PyTypeObject reggroup_iterator_object_type
76 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_iterator_object");
78 /* A register group object. */
82 /* The register group being described. */
83 struct reggroup
*reggroup
;
86 extern PyTypeObject reggroup_object_type
87 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_object");
89 /* Associates a vector of gdb.RegisterDescriptor objects with GDBARCH as
90 gdbarch_data via the gdbarch post init registration mechanism
91 (gdbarch_data_register_post_init). */
94 gdbpy_register_object_data_init (struct gdbarch
*gdbarch
)
96 return new std::vector
<gdbpy_ref
<>>;
99 /* Return a gdb.RegisterGroup object wrapping REGGROUP. The register
100 group objects are cached, and the same Python object will always be
101 returned for the same REGGROUP pointer. */
104 gdbpy_get_reggroup (struct reggroup
*reggroup
)
106 /* Map from GDB's internal reggroup objects to the Python representation.
107 GDB's reggroups are global, and are never deleted, so using a map like
109 static std::unordered_map
<struct reggroup
*,gdbpy_ref
<>>
110 gdbpy_reggroup_object_map
;
112 /* If there is not already a suitable Python object in the map then
113 create a new one, and add it to the map. */
114 if (gdbpy_reggroup_object_map
[reggroup
] == nullptr)
116 /* Create a new object and fill in its details. */
117 gdbpy_ref
<reggroup_object
> group
118 (PyObject_New (reggroup_object
, ®group_object_type
));
121 group
->reggroup
= reggroup
;
122 gdbpy_reggroup_object_map
[reggroup
]
123 = gdbpy_ref
<> ((PyObject
*) group
.release ());
126 /* Fetch the Python object wrapping REGGROUP from the map, increasing
127 the reference count is handled by the gdbpy_ref class. */
128 return gdbpy_reggroup_object_map
[reggroup
];
131 /* Convert a gdb.RegisterGroup to a string, it just returns the name of
132 the register group. */
135 gdbpy_reggroup_to_string (PyObject
*self
)
137 reggroup_object
*group
= (reggroup_object
*) self
;
138 struct reggroup
*reggroup
= group
->reggroup
;
140 const char *name
= reggroup_name (reggroup
);
141 return PyString_FromString (name
);
144 /* Implement gdb.RegisterGroup.name (self) -> String.
145 Return a string that is the name of this register group. */
148 gdbpy_reggroup_name (PyObject
*self
, void *closure
)
150 return gdbpy_reggroup_to_string (self
);
153 /* Return a gdb.RegisterDescriptor object for REGNUM from GDBARCH. For
154 each REGNUM (in GDBARCH) only one descriptor is ever created, which is
155 then cached on the GDBARCH. */
158 gdbpy_get_register_descriptor (struct gdbarch
*gdbarch
,
162 = *(std::vector
<gdbpy_ref
<>> *) gdbarch_data (gdbarch
,
163 gdbpy_register_object_data
);
165 /* Ensure that we have enough entries in the vector. */
166 if (vec
.size () <= regnum
)
167 vec
.resize ((regnum
+ 1), nullptr);
169 /* If we don't already have a descriptor for REGNUM in GDBARCH then
171 if (vec
[regnum
] == nullptr)
173 gdbpy_ref
<register_descriptor_object
> reg
174 (PyObject_New (register_descriptor_object
,
175 ®ister_descriptor_object_type
));
178 reg
->regnum
= regnum
;
179 reg
->gdbarch
= gdbarch
;
180 vec
[regnum
] = gdbpy_ref
<> ((PyObject
*) reg
.release ());
183 /* Grab the register descriptor from the vector, the reference count is
184 automatically incremented thanks to gdbpy_ref. */
188 /* Convert the register descriptor to a string. */
191 gdbpy_register_descriptor_to_string (PyObject
*self
)
193 register_descriptor_object
*reg
194 = (register_descriptor_object
*) self
;
195 struct gdbarch
*gdbarch
= reg
->gdbarch
;
196 int regnum
= reg
->regnum
;
198 const char *name
= gdbarch_register_name (gdbarch
, regnum
);
199 return PyString_FromString (name
);
202 /* Implement gdb.RegisterDescriptor.name attribute get function. Return a
203 string that is the name of this register. Due to checking when register
204 descriptors are created the name will never by the empty string. */
207 gdbpy_register_descriptor_name (PyObject
*self
, void *closure
)
209 return gdbpy_register_descriptor_to_string (self
);
212 /* Return a reference to the gdb.RegisterGroupsIterator object. */
215 gdbpy_reggroup_iter (PyObject
*self
)
221 /* Return the next gdb.RegisterGroup object from the iterator. */
224 gdbpy_reggroup_iter_next (PyObject
*self
)
226 reggroup_iterator_object
*iter_obj
227 = (reggroup_iterator_object
*) self
;
228 struct gdbarch
*gdbarch
= iter_obj
->gdbarch
;
230 struct reggroup
*next_group
= reggroup_next (gdbarch
, iter_obj
->reggroup
);
231 if (next_group
== NULL
)
233 PyErr_SetString (PyExc_StopIteration
, _("No more groups"));
237 iter_obj
->reggroup
= next_group
;
238 return gdbpy_get_reggroup (iter_obj
->reggroup
).release ();
241 /* Return a new gdb.RegisterGroupsIterator over all the register groups in
245 gdbpy_new_reggroup_iterator (struct gdbarch
*gdbarch
)
247 gdb_assert (gdbarch
!= nullptr);
249 /* Create a new object and fill in its internal state. */
250 reggroup_iterator_object
*iter
251 = PyObject_New (reggroup_iterator_object
,
252 ®group_iterator_object_type
);
255 iter
->reggroup
= NULL
;
256 iter
->gdbarch
= gdbarch
;
257 return (PyObject
*) iter
;
260 /* Create and return a new gdb.RegisterDescriptorIterator object which
261 will iterate over all registers in GROUP_NAME for GDBARCH. If
262 GROUP_NAME is either NULL or the empty string then the ALL_REGGROUP is
263 used, otherwise lookup the register group matching GROUP_NAME and use
266 This function can return NULL if GROUP_NAME isn't found. */
269 gdbpy_new_register_descriptor_iterator (struct gdbarch
*gdbarch
,
270 const char *group_name
)
272 struct reggroup
*grp
= NULL
;
274 /* Lookup the requested register group, or find the default. */
275 if (group_name
== NULL
|| *group_name
== '\0')
279 grp
= reggroup_find (gdbarch
, group_name
);
282 PyErr_SetString (PyExc_ValueError
,
283 _("Unknown register group name."));
287 /* Create a new iterator object initialised for this architecture and
288 fill in all of the details. */
289 register_descriptor_iterator_object
*iter
290 = PyObject_New (register_descriptor_iterator_object
,
291 ®ister_descriptor_iterator_object_type
);
295 iter
->gdbarch
= gdbarch
;
296 gdb_assert (grp
!= NULL
);
297 iter
->reggroup
= grp
;
299 return (PyObject
*) iter
;
302 /* Return a reference to the gdb.RegisterDescriptorIterator object. */
305 gdbpy_register_descriptor_iter (PyObject
*self
)
311 /* Return the next register name. */
314 gdbpy_register_descriptor_iter_next (PyObject
*self
)
316 register_descriptor_iterator_object
*iter_obj
317 = (register_descriptor_iterator_object
*) self
;
318 struct gdbarch
*gdbarch
= iter_obj
->gdbarch
;
322 if (iter_obj
->regnum
>= gdbarch_num_cooked_regs (gdbarch
))
324 PyErr_SetString (PyExc_StopIteration
, _("No more registers"));
328 const char *name
= nullptr;
329 int regnum
= iter_obj
->regnum
;
330 if (gdbarch_register_reggroup_p (gdbarch
, regnum
,
332 name
= gdbarch_register_name (gdbarch
, regnum
);
335 if (name
!= nullptr && *name
!= '\0')
336 return gdbpy_get_register_descriptor (gdbarch
, regnum
).release ();
343 gdb.RegisterDescriptorIterator.find (self, name) -> gdb.RegisterDescriptor
345 Look up a descriptor for register with NAME. If no matching register is
346 found then return None. */
349 register_descriptor_iter_find (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
351 static const char *keywords
[] = { "name", NULL
};
352 const char *register_name
= NULL
;
354 register_descriptor_iterator_object
*iter_obj
355 = (register_descriptor_iterator_object
*) self
;
356 struct gdbarch
*gdbarch
= iter_obj
->gdbarch
;
358 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "s", keywords
,
362 if (register_name
!= NULL
&& *register_name
!= '\0')
364 int regnum
= user_reg_map_name_to_regnum (gdbarch
, register_name
,
365 strlen (register_name
));
367 return gdbpy_get_register_descriptor (gdbarch
, regnum
).release ();
373 /* Initializes the new Python classes from this file in the gdb module. */
376 gdbpy_initialize_registers ()
378 gdbpy_register_object_data
379 = gdbarch_data_register_post_init (gdbpy_register_object_data_init
);
381 register_descriptor_object_type
.tp_new
= PyType_GenericNew
;
382 if (PyType_Ready (®ister_descriptor_object_type
) < 0)
384 if (gdb_pymodule_addobject
385 (gdb_module
, "RegisterDescriptor",
386 (PyObject
*) ®ister_descriptor_object_type
) < 0)
389 reggroup_iterator_object_type
.tp_new
= PyType_GenericNew
;
390 if (PyType_Ready (®group_iterator_object_type
) < 0)
392 if (gdb_pymodule_addobject
393 (gdb_module
, "RegisterGroupsIterator",
394 (PyObject
*) ®group_iterator_object_type
) < 0)
397 reggroup_object_type
.tp_new
= PyType_GenericNew
;
398 if (PyType_Ready (®group_object_type
) < 0)
400 if (gdb_pymodule_addobject
401 (gdb_module
, "RegisterGroup",
402 (PyObject
*) ®group_object_type
) < 0)
405 register_descriptor_iterator_object_type
.tp_new
= PyType_GenericNew
;
406 if (PyType_Ready (®ister_descriptor_iterator_object_type
) < 0)
408 return (gdb_pymodule_addobject
409 (gdb_module
, "RegisterDescriptorIterator",
410 (PyObject
*) ®ister_descriptor_iterator_object_type
));
413 static PyMethodDef register_descriptor_iterator_object_methods
[] = {
414 { "find", (PyCFunction
) register_descriptor_iter_find
,
415 METH_VARARGS
| METH_KEYWORDS
,
416 "registers (name) -> gdb.RegisterDescriptor.\n\
417 Return a register descriptor for the register NAME, or None if no register\n\
418 with that name exists in this iterator." },
419 {NULL
} /* Sentinel */
422 PyTypeObject register_descriptor_iterator_object_type
= {
423 PyVarObject_HEAD_INIT (NULL
, 0)
424 "gdb.RegisterDescriptorIterator", /*tp_name*/
425 sizeof (register_descriptor_iterator_object
), /*tp_basicsize*/
434 0, /*tp_as_sequence*/
442 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
443 "GDB architecture register descriptor iterator object", /*tp_doc */
446 0, /*tp_richcompare */
447 0, /*tp_weaklistoffset */
448 gdbpy_register_descriptor_iter
, /*tp_iter */
449 gdbpy_register_descriptor_iter_next
, /*tp_iternext */
450 register_descriptor_iterator_object_methods
/*tp_methods */
453 static gdb_PyGetSetDef gdbpy_register_descriptor_getset
[] = {
454 { "name", gdbpy_register_descriptor_name
, NULL
,
455 "The name of this register.", NULL
},
456 { NULL
} /* Sentinel */
459 PyTypeObject register_descriptor_object_type
= {
460 PyVarObject_HEAD_INIT (NULL
, 0)
461 "gdb.RegisterDescriptor", /*tp_name*/
462 sizeof (register_descriptor_object
), /*tp_basicsize*/
471 0, /*tp_as_sequence*/
475 gdbpy_register_descriptor_to_string
, /*tp_str*/
479 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
480 "GDB architecture register descriptor object", /*tp_doc */
483 0, /*tp_richcompare */
484 0, /*tp_weaklistoffset */
489 gdbpy_register_descriptor_getset
/*tp_getset */
492 PyTypeObject reggroup_iterator_object_type
= {
493 PyVarObject_HEAD_INIT (NULL
, 0)
494 "gdb.RegisterGroupsIterator", /*tp_name*/
495 sizeof (reggroup_iterator_object
), /*tp_basicsize*/
504 0, /*tp_as_sequence*/
512 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
513 "GDB register groups iterator object", /*tp_doc */
516 0, /*tp_richcompare */
517 0, /*tp_weaklistoffset */
518 gdbpy_reggroup_iter
, /*tp_iter */
519 gdbpy_reggroup_iter_next
, /*tp_iternext */
523 static gdb_PyGetSetDef gdbpy_reggroup_getset
[] = {
524 { "name", gdbpy_reggroup_name
, NULL
,
525 "The name of this register group.", NULL
},
526 { NULL
} /* Sentinel */
529 PyTypeObject reggroup_object_type
= {
530 PyVarObject_HEAD_INIT (NULL
, 0)
531 "gdb.RegisterGroup", /*tp_name*/
532 sizeof (reggroup_object
), /*tp_basicsize*/
541 0, /*tp_as_sequence*/
545 gdbpy_reggroup_to_string
, /*tp_str*/
549 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
550 "GDB register group object", /*tp_doc */
553 0, /*tp_richcompare */
554 0, /*tp_weaklistoffset */
559 gdbpy_reggroup_getset
/*tp_getset */