]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/python/py-registers.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / python / py-registers.c
CommitLineData
0f767f94
AB
1/* Python interface to register, and register group information.
2
1d506c26 3 Copyright (C) 2020-2024 Free Software Foundation, Inc.
0f767f94
AB
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20#include "defs.h"
21#include "gdbarch.h"
22#include "arch-utils.h"
0f767f94
AB
23#include "reggroups.h"
24#include "python-internal.h"
14fa8fb3 25#include "user-regs.h"
baf8791e 26#include <unordered_map>
0f767f94 27
cb275538
TT
28/* Per-gdbarch data type. */
29typedef std::vector<gdbpy_ref<>> gdbpy_register_type;
30
f7306dac 31/* Token to access per-gdbarch data related to register descriptors. */
cb275538
TT
32static const registry<gdbarch>::key<gdbpy_register_type>
33 gdbpy_register_object_data;
f7306dac 34
0f767f94 35/* Structure for iterator over register descriptors. */
f99b5177 36struct register_descriptor_iterator_object {
0f767f94
AB
37 PyObject_HEAD
38
39 /* The register group that the user is iterating over. This will never
40 be NULL. */
0ee33659 41 const struct reggroup *reggroup;
0f767f94
AB
42
43 /* The next register number to lookup. Starts at 0 and counts up. */
44 int regnum;
45
46 /* Pointer back to the architecture we're finding registers for. */
47 struct gdbarch *gdbarch;
f99b5177 48};
0f767f94
AB
49
50extern PyTypeObject register_descriptor_iterator_object_type
51 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_iterator_object");
52
53/* A register descriptor. */
f99b5177 54struct register_descriptor_object {
0f767f94
AB
55 PyObject_HEAD
56
57 /* The register this is a descriptor for. */
58 int regnum;
59
60 /* The architecture this is a register for. */
61 struct gdbarch *gdbarch;
f99b5177 62};
0f767f94
AB
63
64extern PyTypeObject register_descriptor_object_type
65 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_object");
66
64cb3757 67/* Structure for iterator over register groups. */
f99b5177 68struct reggroup_iterator_object {
64cb3757
AB
69 PyObject_HEAD
70
1bca9b1e
AB
71 /* The index into GROUPS for the next group to return. */
72 std::vector<const reggroup *>::size_type index;
64cb3757
AB
73
74 /* Pointer back to the architecture we're finding registers for. */
75 struct gdbarch *gdbarch;
f99b5177 76};
64cb3757
AB
77
78extern PyTypeObject reggroup_iterator_object_type
79 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_iterator_object");
80
81/* A register group object. */
f99b5177 82struct reggroup_object {
64cb3757
AB
83 PyObject_HEAD
84
85 /* The register group being described. */
0ee33659 86 const struct reggroup *reggroup;
f99b5177 87};
64cb3757
AB
88
89extern PyTypeObject reggroup_object_type
90 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_object");
91
baf8791e
AB
92/* Return a gdb.RegisterGroup object wrapping REGGROUP. The register
93 group objects are cached, and the same Python object will always be
94 returned for the same REGGROUP pointer. */
64cb3757 95
baf8791e 96static gdbpy_ref<>
0ee33659 97gdbpy_get_reggroup (const reggroup *reggroup)
64cb3757 98{
baf8791e
AB
99 /* Map from GDB's internal reggroup objects to the Python representation.
100 GDB's reggroups are global, and are never deleted, so using a map like
101 this is safe. */
0ee33659 102 static std::unordered_map<const struct reggroup *,gdbpy_ref<>>
baf8791e
AB
103 gdbpy_reggroup_object_map;
104
105 /* If there is not already a suitable Python object in the map then
106 create a new one, and add it to the map. */
107 if (gdbpy_reggroup_object_map[reggroup] == nullptr)
108 {
109 /* Create a new object and fill in its details. */
110 gdbpy_ref<reggroup_object> group
111 (PyObject_New (reggroup_object, &reggroup_object_type));
112 if (group == NULL)
113 return NULL;
114 group->reggroup = reggroup;
115 gdbpy_reggroup_object_map[reggroup]
116 = gdbpy_ref<> ((PyObject *) group.release ());
117 }
118
119 /* Fetch the Python object wrapping REGGROUP from the map, increasing
120 the reference count is handled by the gdbpy_ref class. */
121 return gdbpy_reggroup_object_map[reggroup];
64cb3757
AB
122}
123
124/* Convert a gdb.RegisterGroup to a string, it just returns the name of
125 the register group. */
126
127static PyObject *
128gdbpy_reggroup_to_string (PyObject *self)
129{
130 reggroup_object *group = (reggroup_object *) self;
0ee33659 131 const reggroup *reggroup = group->reggroup;
64cb3757 132
af7ce09b 133 return PyUnicode_FromString (reggroup->name ());
64cb3757
AB
134}
135
136/* Implement gdb.RegisterGroup.name (self) -> String.
137 Return a string that is the name of this register group. */
138
139static PyObject *
140gdbpy_reggroup_name (PyObject *self, void *closure)
141{
142 return gdbpy_reggroup_to_string (self);
143}
144
f7306dac
AB
145/* Return a gdb.RegisterDescriptor object for REGNUM from GDBARCH. For
146 each REGNUM (in GDBARCH) only one descriptor is ever created, which is
147 then cached on the GDBARCH. */
148
149static gdbpy_ref<>
150gdbpy_get_register_descriptor (struct gdbarch *gdbarch,
0f767f94
AB
151 int regnum)
152{
cb275538
TT
153 gdbpy_register_type *vecp = gdbpy_register_object_data.get (gdbarch);
154 if (vecp == nullptr)
155 vecp = gdbpy_register_object_data.emplace (gdbarch);
156 gdbpy_register_type &vec = *vecp;
f7306dac
AB
157
158 /* Ensure that we have enough entries in the vector. */
a67a1c41
AB
159 if (vec.size () <= regnum)
160 vec.resize ((regnum + 1), nullptr);
f7306dac
AB
161
162 /* If we don't already have a descriptor for REGNUM in GDBARCH then
163 create one now. */
a67a1c41 164 if (vec[regnum] == nullptr)
f7306dac
AB
165 {
166 gdbpy_ref <register_descriptor_object> reg
167 (PyObject_New (register_descriptor_object,
168 &register_descriptor_object_type));
169 if (reg == NULL)
170 return NULL;
171 reg->regnum = regnum;
172 reg->gdbarch = gdbarch;
a67a1c41 173 vec[regnum] = gdbpy_ref<> ((PyObject *) reg.release ());
f7306dac
AB
174 }
175
176 /* Grab the register descriptor from the vector, the reference count is
177 automatically incremented thanks to gdbpy_ref. */
a67a1c41 178 return vec[regnum];
0f767f94
AB
179}
180
181/* Convert the register descriptor to a string. */
182
183static PyObject *
184gdbpy_register_descriptor_to_string (PyObject *self)
185{
186 register_descriptor_object *reg
187 = (register_descriptor_object *) self;
188 struct gdbarch *gdbarch = reg->gdbarch;
189 int regnum = reg->regnum;
190
191 const char *name = gdbarch_register_name (gdbarch, regnum);
5aee4587 192 return PyUnicode_FromString (name);
0f767f94
AB
193}
194
195/* Implement gdb.RegisterDescriptor.name attribute get function. Return a
196 string that is the name of this register. Due to checking when register
197 descriptors are created the name will never by the empty string. */
198
199static PyObject *
200gdbpy_register_descriptor_name (PyObject *self, void *closure)
201{
202 return gdbpy_register_descriptor_to_string (self);
203}
204
64cb3757
AB
205/* Return a reference to the gdb.RegisterGroupsIterator object. */
206
207static PyObject *
208gdbpy_reggroup_iter (PyObject *self)
209{
210 Py_INCREF (self);
211 return self;
212}
213
214/* Return the next gdb.RegisterGroup object from the iterator. */
215
216static PyObject *
217gdbpy_reggroup_iter_next (PyObject *self)
218{
219 reggroup_iterator_object *iter_obj
220 = (reggroup_iterator_object *) self;
64cb3757 221
1bca9b1e
AB
222 const std::vector<const reggroup *> &groups
223 = gdbarch_reggroups (iter_obj->gdbarch);
224 if (iter_obj->index >= groups.size ())
64cb3757
AB
225 {
226 PyErr_SetString (PyExc_StopIteration, _("No more groups"));
227 return NULL;
228 }
229
1bca9b1e
AB
230 const reggroup *group = groups[iter_obj->index];
231 iter_obj->index++;
232 return gdbpy_get_reggroup (group).release ();
64cb3757
AB
233}
234
235/* Return a new gdb.RegisterGroupsIterator over all the register groups in
236 GDBARCH. */
237
238PyObject *
239gdbpy_new_reggroup_iterator (struct gdbarch *gdbarch)
240{
241 gdb_assert (gdbarch != nullptr);
242
243 /* Create a new object and fill in its internal state. */
244 reggroup_iterator_object *iter
245 = PyObject_New (reggroup_iterator_object,
246 &reggroup_iterator_object_type);
247 if (iter == NULL)
248 return NULL;
1bca9b1e 249 iter->index = 0;
64cb3757
AB
250 iter->gdbarch = gdbarch;
251 return (PyObject *) iter;
252}
253
0f767f94
AB
254/* Create and return a new gdb.RegisterDescriptorIterator object which
255 will iterate over all registers in GROUP_NAME for GDBARCH. If
256 GROUP_NAME is either NULL or the empty string then the ALL_REGGROUP is
257 used, otherwise lookup the register group matching GROUP_NAME and use
258 that.
259
260 This function can return NULL if GROUP_NAME isn't found. */
261
262PyObject *
263gdbpy_new_register_descriptor_iterator (struct gdbarch *gdbarch,
264 const char *group_name)
265{
0ee33659 266 const reggroup *grp = NULL;
0f767f94
AB
267
268 /* Lookup the requested register group, or find the default. */
269 if (group_name == NULL || *group_name == '\0')
270 grp = all_reggroup;
271 else
272 {
273 grp = reggroup_find (gdbarch, group_name);
274 if (grp == NULL)
275 {
276 PyErr_SetString (PyExc_ValueError,
277 _("Unknown register group name."));
278 return NULL;
279 }
280 }
281 /* Create a new iterator object initialised for this architecture and
282 fill in all of the details. */
283 register_descriptor_iterator_object *iter
284 = PyObject_New (register_descriptor_iterator_object,
285 &register_descriptor_iterator_object_type);
286 if (iter == NULL)
287 return NULL;
288 iter->regnum = 0;
289 iter->gdbarch = gdbarch;
290 gdb_assert (grp != NULL);
291 iter->reggroup = grp;
292
293 return (PyObject *) iter;
294}
295
296/* Return a reference to the gdb.RegisterDescriptorIterator object. */
297
298static PyObject *
299gdbpy_register_descriptor_iter (PyObject *self)
300{
301 Py_INCREF (self);
302 return self;
303}
304
305/* Return the next register name. */
306
307static PyObject *
308gdbpy_register_descriptor_iter_next (PyObject *self)
309{
310 register_descriptor_iterator_object *iter_obj
311 = (register_descriptor_iterator_object *) self;
312 struct gdbarch *gdbarch = iter_obj->gdbarch;
313
314 do
315 {
316 if (iter_obj->regnum >= gdbarch_num_cooked_regs (gdbarch))
317 {
318 PyErr_SetString (PyExc_StopIteration, _("No more registers"));
319 return NULL;
320 }
321
322 const char *name = nullptr;
323 int regnum = iter_obj->regnum;
324 if (gdbarch_register_reggroup_p (gdbarch, regnum,
325 iter_obj->reggroup))
326 name = gdbarch_register_name (gdbarch, regnum);
327 iter_obj->regnum++;
328
329 if (name != nullptr && *name != '\0')
f7306dac 330 return gdbpy_get_register_descriptor (gdbarch, regnum).release ();
0f767f94
AB
331 }
332 while (true);
333}
334
14fa8fb3
AB
335/* Implement:
336
337 gdb.RegisterDescriptorIterator.find (self, name) -> gdb.RegisterDescriptor
338
339 Look up a descriptor for register with NAME. If no matching register is
340 found then return None. */
341
342static PyObject *
343register_descriptor_iter_find (PyObject *self, PyObject *args, PyObject *kw)
344{
345 static const char *keywords[] = { "name", NULL };
346 const char *register_name = NULL;
347
348 register_descriptor_iterator_object *iter_obj
349 = (register_descriptor_iterator_object *) self;
350 struct gdbarch *gdbarch = iter_obj->gdbarch;
351
352 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s", keywords,
353 &register_name))
354 return NULL;
355
356 if (register_name != NULL && *register_name != '\0')
357 {
358 int regnum = user_reg_map_name_to_regnum (gdbarch, register_name,
359 strlen (register_name));
360 if (regnum >= 0)
361 return gdbpy_get_register_descriptor (gdbarch, regnum).release ();
362 }
363
364 Py_RETURN_NONE;
365}
366
43d5901d
AB
367/* See python-internal.h. */
368
369bool
370gdbpy_parse_register_id (struct gdbarch *gdbarch, PyObject *pyo_reg_id,
371 int *reg_num)
372{
373 gdb_assert (pyo_reg_id != NULL);
374
375 /* The register could be a string, its name. */
376 if (gdbpy_is_string (pyo_reg_id))
377 {
378 gdb::unique_xmalloc_ptr<char> reg_name (gdbpy_obj_to_string (pyo_reg_id));
379
380 if (reg_name != NULL)
381 {
382 *reg_num = user_reg_map_name_to_regnum (gdbarch, reg_name.get (),
383 strlen (reg_name.get ()));
bdc8cfc1
TT
384 if (*reg_num >= 0)
385 return true;
386 PyErr_SetString (PyExc_ValueError, "Bad register");
43d5901d
AB
387 }
388 }
389 /* The register could be its internal GDB register number. */
5aee4587 390 else if (PyLong_Check (pyo_reg_id))
43d5901d
AB
391 {
392 long value;
bdc8cfc1 393 if (gdb_py_int_as_long (pyo_reg_id, &value) == 0)
dda83cd7 394 {
bdc8cfc1 395 /* Nothing -- error. */
dda83cd7 396 }
bdc8cfc1
TT
397 else if ((int) value == value
398 && user_reg_map_regnum_to_name (gdbarch, value) != NULL)
399 {
400 *reg_num = (int) value;
401 return true;
402 }
403 else
404 PyErr_SetString (PyExc_ValueError, "Bad register");
43d5901d
AB
405 }
406 /* The register could be a gdb.RegisterDescriptor object. */
407 else if (PyObject_IsInstance (pyo_reg_id,
408 (PyObject *) &register_descriptor_object_type))
409 {
410 register_descriptor_object *reg
411 = (register_descriptor_object *) pyo_reg_id;
412 if (reg->gdbarch == gdbarch)
413 {
414 *reg_num = reg->regnum;
415 return true;
416 }
417 else
418 PyErr_SetString (PyExc_ValueError,
419 _("Invalid Architecture in RegisterDescriptor"));
420 }
bdc8cfc1
TT
421 else
422 PyErr_SetString (PyExc_TypeError, _("Invalid type for register"));
43d5901d
AB
423
424 gdb_assert (PyErr_Occurred ());
425 return false;
426}
427
0f767f94
AB
428/* Initializes the new Python classes from this file in the gdb module. */
429
3965bff5 430static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
0f767f94
AB
431gdbpy_initialize_registers ()
432{
433 register_descriptor_object_type.tp_new = PyType_GenericNew;
434 if (PyType_Ready (&register_descriptor_object_type) < 0)
435 return -1;
436 if (gdb_pymodule_addobject
437 (gdb_module, "RegisterDescriptor",
438 (PyObject *) &register_descriptor_object_type) < 0)
439 return -1;
440
64cb3757
AB
441 reggroup_iterator_object_type.tp_new = PyType_GenericNew;
442 if (PyType_Ready (&reggroup_iterator_object_type) < 0)
443 return -1;
444 if (gdb_pymodule_addobject
445 (gdb_module, "RegisterGroupsIterator",
446 (PyObject *) &reggroup_iterator_object_type) < 0)
447 return -1;
448
449 reggroup_object_type.tp_new = PyType_GenericNew;
450 if (PyType_Ready (&reggroup_object_type) < 0)
451 return -1;
452 if (gdb_pymodule_addobject
453 (gdb_module, "RegisterGroup",
454 (PyObject *) &reggroup_object_type) < 0)
455 return -1;
456
0f767f94
AB
457 register_descriptor_iterator_object_type.tp_new = PyType_GenericNew;
458 if (PyType_Ready (&register_descriptor_iterator_object_type) < 0)
459 return -1;
460 return (gdb_pymodule_addobject
461 (gdb_module, "RegisterDescriptorIterator",
462 (PyObject *) &register_descriptor_iterator_object_type));
463}
464
3965bff5
AB
465GDBPY_INITIALIZE_FILE (gdbpy_initialize_registers);
466
467\f
468
14fa8fb3
AB
469static PyMethodDef register_descriptor_iterator_object_methods [] = {
470 { "find", (PyCFunction) register_descriptor_iter_find,
471 METH_VARARGS | METH_KEYWORDS,
472 "registers (name) -> gdb.RegisterDescriptor.\n\
473Return a register descriptor for the register NAME, or None if no register\n\
474with that name exists in this iterator." },
475 {NULL} /* Sentinel */
476};
477
0f767f94
AB
478PyTypeObject register_descriptor_iterator_object_type = {
479 PyVarObject_HEAD_INIT (NULL, 0)
480 "gdb.RegisterDescriptorIterator", /*tp_name*/
481 sizeof (register_descriptor_iterator_object), /*tp_basicsize*/
482 0, /*tp_itemsize*/
483 0, /*tp_dealloc*/
484 0, /*tp_print*/
485 0, /*tp_getattr*/
486 0, /*tp_setattr*/
487 0, /*tp_compare*/
488 0, /*tp_repr*/
489 0, /*tp_as_number*/
490 0, /*tp_as_sequence*/
491 0, /*tp_as_mapping*/
492 0, /*tp_hash */
493 0, /*tp_call*/
494 0, /*tp_str*/
495 0, /*tp_getattro*/
496 0, /*tp_setattro*/
497 0, /*tp_as_buffer*/
0b233e34 498 Py_TPFLAGS_DEFAULT, /*tp_flags*/
0f767f94
AB
499 "GDB architecture register descriptor iterator object", /*tp_doc */
500 0, /*tp_traverse */
501 0, /*tp_clear */
502 0, /*tp_richcompare */
503 0, /*tp_weaklistoffset */
504 gdbpy_register_descriptor_iter, /*tp_iter */
505 gdbpy_register_descriptor_iter_next, /*tp_iternext */
14fa8fb3 506 register_descriptor_iterator_object_methods /*tp_methods */
0f767f94
AB
507};
508
509static gdb_PyGetSetDef gdbpy_register_descriptor_getset[] = {
510 { "name", gdbpy_register_descriptor_name, NULL,
511 "The name of this register.", NULL },
512 { NULL } /* Sentinel */
513};
514
515PyTypeObject register_descriptor_object_type = {
516 PyVarObject_HEAD_INIT (NULL, 0)
517 "gdb.RegisterDescriptor", /*tp_name*/
518 sizeof (register_descriptor_object), /*tp_basicsize*/
519 0, /*tp_itemsize*/
520 0, /*tp_dealloc*/
521 0, /*tp_print*/
522 0, /*tp_getattr*/
523 0, /*tp_setattr*/
524 0, /*tp_compare*/
525 0, /*tp_repr*/
526 0, /*tp_as_number*/
527 0, /*tp_as_sequence*/
528 0, /*tp_as_mapping*/
529 0, /*tp_hash */
530 0, /*tp_call*/
531 gdbpy_register_descriptor_to_string, /*tp_str*/
532 0, /*tp_getattro*/
533 0, /*tp_setattro*/
534 0, /*tp_as_buffer*/
535 Py_TPFLAGS_DEFAULT, /*tp_flags*/
536 "GDB architecture register descriptor object", /*tp_doc */
537 0, /*tp_traverse */
538 0, /*tp_clear */
539 0, /*tp_richcompare */
540 0, /*tp_weaklistoffset */
541 0, /*tp_iter */
542 0, /*tp_iternext */
543 0, /*tp_methods */
544 0, /*tp_members */
545 gdbpy_register_descriptor_getset /*tp_getset */
546};
64cb3757
AB
547
548PyTypeObject reggroup_iterator_object_type = {
549 PyVarObject_HEAD_INIT (NULL, 0)
550 "gdb.RegisterGroupsIterator", /*tp_name*/
551 sizeof (reggroup_iterator_object), /*tp_basicsize*/
552 0, /*tp_itemsize*/
553 0, /*tp_dealloc*/
554 0, /*tp_print*/
555 0, /*tp_getattr*/
556 0, /*tp_setattr*/
557 0, /*tp_compare*/
558 0, /*tp_repr*/
559 0, /*tp_as_number*/
560 0, /*tp_as_sequence*/
561 0, /*tp_as_mapping*/
562 0, /*tp_hash */
563 0, /*tp_call*/
564 0, /*tp_str*/
565 0, /*tp_getattro*/
566 0, /*tp_setattro*/
567 0, /*tp_as_buffer*/
0b233e34 568 Py_TPFLAGS_DEFAULT, /*tp_flags*/
64cb3757
AB
569 "GDB register groups iterator object", /*tp_doc */
570 0, /*tp_traverse */
571 0, /*tp_clear */
572 0, /*tp_richcompare */
573 0, /*tp_weaklistoffset */
574 gdbpy_reggroup_iter, /*tp_iter */
575 gdbpy_reggroup_iter_next, /*tp_iternext */
576 0 /*tp_methods */
577};
578
579static gdb_PyGetSetDef gdbpy_reggroup_getset[] = {
580 { "name", gdbpy_reggroup_name, NULL,
581 "The name of this register group.", NULL },
582 { NULL } /* Sentinel */
583};
584
585PyTypeObject reggroup_object_type = {
586 PyVarObject_HEAD_INIT (NULL, 0)
587 "gdb.RegisterGroup", /*tp_name*/
588 sizeof (reggroup_object), /*tp_basicsize*/
589 0, /*tp_itemsize*/
590 0, /*tp_dealloc*/
591 0, /*tp_print*/
592 0, /*tp_getattr*/
593 0, /*tp_setattr*/
594 0, /*tp_compare*/
595 0, /*tp_repr*/
596 0, /*tp_as_number*/
597 0, /*tp_as_sequence*/
598 0, /*tp_as_mapping*/
599 0, /*tp_hash */
600 0, /*tp_call*/
601 gdbpy_reggroup_to_string, /*tp_str*/
602 0, /*tp_getattro*/
603 0, /*tp_setattro*/
604 0, /*tp_as_buffer*/
605 Py_TPFLAGS_DEFAULT, /*tp_flags*/
606 "GDB register group object", /*tp_doc */
607 0, /*tp_traverse */
608 0, /*tp_clear */
609 0, /*tp_richcompare */
610 0, /*tp_weaklistoffset */
611 0, /*tp_iter */
612 0, /*tp_iternext */
613 0, /*tp_methods */
614 0, /*tp_members */
615 gdbpy_reggroup_getset /*tp_getset */
616};