Home | History | Annotate | Line # | Download | only in python
      1 /* Python interface to register, and register group information.
      2 
      3    Copyright (C) 2020-2024 Free Software Foundation, Inc.
      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 "gdbarch.h"
     21 #include "arch-utils.h"
     22 #include "reggroups.h"
     23 #include "python-internal.h"
     24 #include "user-regs.h"
     25 #include <unordered_map>
     26 
     27 /* Per-gdbarch data type.  */
     28 typedef std::vector<gdbpy_ref<>> gdbpy_register_type;
     29 
     30 /* Token to access per-gdbarch data related to register descriptors.  */
     31 static const registry<gdbarch>::key<gdbpy_register_type>
     32      gdbpy_register_object_data;
     33 
     34 /* Structure for iterator over register descriptors.  */
     35 struct register_descriptor_iterator_object {
     36   PyObject_HEAD
     37 
     38   /* The register group that the user is iterating over.  This will never
     39      be NULL.  */
     40   const struct reggroup *reggroup;
     41 
     42   /* The next register number to lookup.  Starts at 0 and counts up.  */
     43   int regnum;
     44 
     45   /* Pointer back to the architecture we're finding registers for.  */
     46   struct gdbarch *gdbarch;
     47 };
     48 
     49 extern PyTypeObject register_descriptor_iterator_object_type
     50     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_iterator_object");
     51 
     52 /* A register descriptor.  */
     53 struct register_descriptor_object {
     54   PyObject_HEAD
     55 
     56   /* The register this is a descriptor for.  */
     57   int regnum;
     58 
     59   /* The architecture this is a register for.  */
     60   struct gdbarch *gdbarch;
     61 };
     62 
     63 extern PyTypeObject register_descriptor_object_type
     64     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("register_descriptor_object");
     65 
     66 /* Structure for iterator over register groups.  */
     67 struct reggroup_iterator_object {
     68   PyObject_HEAD
     69 
     70   /* The index into GROUPS for the next group to return.  */
     71   std::vector<const reggroup *>::size_type index;
     72 
     73   /* Pointer back to the architecture we're finding registers for.  */
     74   struct gdbarch *gdbarch;
     75 };
     76 
     77 extern PyTypeObject reggroup_iterator_object_type
     78     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_iterator_object");
     79 
     80 /* A register group object.  */
     81 struct reggroup_object {
     82   PyObject_HEAD
     83 
     84   /* The register group being described.  */
     85   const struct reggroup *reggroup;
     86 };
     87 
     88 extern PyTypeObject reggroup_object_type
     89     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("reggroup_object");
     90 
     91 /* Return a gdb.RegisterGroup object wrapping REGGROUP.  The register
     92    group objects are cached, and the same Python object will always be
     93    returned for the same REGGROUP pointer.  */
     94 
     95 static gdbpy_ref<>
     96 gdbpy_get_reggroup (const reggroup *reggroup)
     97 {
     98   /* Map from GDB's internal reggroup objects to the Python representation.
     99      GDB's reggroups are global, and are never deleted, so using a map like
    100      this is safe.  */
    101   static std::unordered_map<const struct reggroup *,gdbpy_ref<>>
    102     gdbpy_reggroup_object_map;
    103 
    104   /* If there is not already a suitable Python object in the map then
    105      create a new one, and add it to the map.  */
    106   if (gdbpy_reggroup_object_map[reggroup] == nullptr)
    107     {
    108       /* Create a new object and fill in its details.  */
    109       gdbpy_ref<reggroup_object> group
    110 	(PyObject_New (reggroup_object, &reggroup_object_type));
    111       if (group == NULL)
    112 	return NULL;
    113       group->reggroup = reggroup;
    114       gdbpy_reggroup_object_map[reggroup]
    115 	= gdbpy_ref<> ((PyObject *) group.release ());
    116     }
    117 
    118   /* Fetch the Python object wrapping REGGROUP from the map, increasing
    119      the reference count is handled by the gdbpy_ref class.  */
    120   return gdbpy_reggroup_object_map[reggroup];
    121 }
    122 
    123 /* Convert a gdb.RegisterGroup to a string, it just returns the name of
    124    the register group.  */
    125 
    126 static PyObject *
    127 gdbpy_reggroup_to_string (PyObject *self)
    128 {
    129   reggroup_object *group = (reggroup_object *) self;
    130   const reggroup *reggroup = group->reggroup;
    131 
    132   return PyUnicode_FromString (reggroup->name ());
    133 }
    134 
    135 /* Implement gdb.RegisterGroup.name (self) -> String.
    136    Return a string that is the name of this register group.  */
    137 
    138 static PyObject *
    139 gdbpy_reggroup_name (PyObject *self, void *closure)
    140 {
    141   return gdbpy_reggroup_to_string (self);
    142 }
    143 
    144 /* Return a gdb.RegisterDescriptor object for REGNUM from GDBARCH.  For
    145    each REGNUM (in GDBARCH) only one descriptor is ever created, which is
    146    then cached on the GDBARCH.  */
    147 
    148 static gdbpy_ref<>
    149 gdbpy_get_register_descriptor (struct gdbarch *gdbarch,
    150 			       int regnum)
    151 {
    152   gdbpy_register_type *vecp = gdbpy_register_object_data.get (gdbarch);
    153   if (vecp == nullptr)
    154     vecp = gdbpy_register_object_data.emplace (gdbarch);
    155   gdbpy_register_type &vec = *vecp;
    156 
    157   /* Ensure that we have enough entries in the vector.  */
    158   if (vec.size () <= regnum)
    159     vec.resize ((regnum + 1), nullptr);
    160 
    161   /* If we don't already have a descriptor for REGNUM in GDBARCH then
    162      create one now.  */
    163   if (vec[regnum] == nullptr)
    164     {
    165       gdbpy_ref <register_descriptor_object> reg
    166 	(PyObject_New (register_descriptor_object,
    167 		       &register_descriptor_object_type));
    168       if (reg == NULL)
    169 	return NULL;
    170       reg->regnum = regnum;
    171       reg->gdbarch = gdbarch;
    172       vec[regnum] = gdbpy_ref<> ((PyObject *) reg.release ());
    173     }
    174 
    175   /* Grab the register descriptor from the vector, the reference count is
    176      automatically incremented thanks to gdbpy_ref.  */
    177   return vec[regnum];
    178 }
    179 
    180 /* Convert the register descriptor to a string.  */
    181 
    182 static PyObject *
    183 gdbpy_register_descriptor_to_string (PyObject *self)
    184 {
    185   register_descriptor_object *reg
    186     = (register_descriptor_object *) self;
    187   struct gdbarch *gdbarch = reg->gdbarch;
    188   int regnum = reg->regnum;
    189 
    190   const char *name = gdbarch_register_name (gdbarch, regnum);
    191   return PyUnicode_FromString (name);
    192 }
    193 
    194 /* Implement gdb.RegisterDescriptor.name attribute get function.  Return a
    195    string that is the name of this register.  Due to checking when register
    196    descriptors are created the name will never by the empty string.  */
    197 
    198 static PyObject *
    199 gdbpy_register_descriptor_name (PyObject *self, void *closure)
    200 {
    201   return gdbpy_register_descriptor_to_string (self);
    202 }
    203 
    204 /* Return a reference to the gdb.RegisterGroupsIterator object.  */
    205 
    206 static PyObject *
    207 gdbpy_reggroup_iter (PyObject *self)
    208 {
    209   Py_INCREF (self);
    210   return self;
    211 }
    212 
    213 /* Return the next gdb.RegisterGroup object from the iterator.  */
    214 
    215 static PyObject *
    216 gdbpy_reggroup_iter_next (PyObject *self)
    217 {
    218   reggroup_iterator_object *iter_obj
    219     = (reggroup_iterator_object *) self;
    220 
    221   const std::vector<const reggroup *> &groups
    222     = gdbarch_reggroups (iter_obj->gdbarch);
    223   if (iter_obj->index >= groups.size ())
    224     {
    225       PyErr_SetString (PyExc_StopIteration, _("No more groups"));
    226       return NULL;
    227     }
    228 
    229   const reggroup *group = groups[iter_obj->index];
    230   iter_obj->index++;
    231   return gdbpy_get_reggroup (group).release ();
    232 }
    233 
    234 /* Return a new gdb.RegisterGroupsIterator over all the register groups in
    235    GDBARCH.  */
    236 
    237 PyObject *
    238 gdbpy_new_reggroup_iterator (struct gdbarch *gdbarch)
    239 {
    240   gdb_assert (gdbarch != nullptr);
    241 
    242   /* Create a new object and fill in its internal state.  */
    243   reggroup_iterator_object *iter
    244     = PyObject_New (reggroup_iterator_object,
    245 		    &reggroup_iterator_object_type);
    246   if (iter == NULL)
    247     return NULL;
    248   iter->index = 0;
    249   iter->gdbarch = gdbarch;
    250   return (PyObject *) iter;
    251 }
    252 
    253 /* Create and return a new gdb.RegisterDescriptorIterator object which
    254    will iterate over all registers in GROUP_NAME for GDBARCH.  If
    255    GROUP_NAME is either NULL or the empty string then the ALL_REGGROUP is
    256    used, otherwise lookup the register group matching GROUP_NAME and use
    257    that.
    258 
    259    This function can return NULL if GROUP_NAME isn't found.  */
    260 
    261 PyObject *
    262 gdbpy_new_register_descriptor_iterator (struct gdbarch *gdbarch,
    263 					const char *group_name)
    264 {
    265   const reggroup *grp = NULL;
    266 
    267   /* Lookup the requested register group, or find the default.  */
    268   if (group_name == NULL || *group_name == '\0')
    269     grp = all_reggroup;
    270   else
    271     {
    272       grp = reggroup_find (gdbarch, group_name);
    273       if (grp == NULL)
    274 	{
    275 	  PyErr_SetString (PyExc_ValueError,
    276 			   _("Unknown register group name."));
    277 	  return NULL;
    278 	}
    279     }
    280   /* Create a new iterator object initialised for this architecture and
    281      fill in all of the details.  */
    282   register_descriptor_iterator_object *iter
    283     = PyObject_New (register_descriptor_iterator_object,
    284 		    &register_descriptor_iterator_object_type);
    285   if (iter == NULL)
    286     return NULL;
    287   iter->regnum = 0;
    288   iter->gdbarch = gdbarch;
    289   gdb_assert (grp != NULL);
    290   iter->reggroup = grp;
    291 
    292   return (PyObject *) iter;
    293 }
    294 
    295 /* Return a reference to the gdb.RegisterDescriptorIterator object.  */
    296 
    297 static PyObject *
    298 gdbpy_register_descriptor_iter (PyObject *self)
    299 {
    300   Py_INCREF (self);
    301   return self;
    302 }
    303 
    304 /* Return the next register name.  */
    305 
    306 static PyObject *
    307 gdbpy_register_descriptor_iter_next (PyObject *self)
    308 {
    309   register_descriptor_iterator_object *iter_obj
    310     = (register_descriptor_iterator_object *) self;
    311   struct gdbarch *gdbarch = iter_obj->gdbarch;
    312 
    313   do
    314     {
    315       if (iter_obj->regnum >= gdbarch_num_cooked_regs (gdbarch))
    316 	{
    317 	  PyErr_SetString (PyExc_StopIteration, _("No more registers"));
    318 	  return NULL;
    319 	}
    320 
    321       const char *name = nullptr;
    322       int regnum = iter_obj->regnum;
    323       if (gdbarch_register_reggroup_p (gdbarch, regnum,
    324 				       iter_obj->reggroup))
    325 	name = gdbarch_register_name (gdbarch, regnum);
    326       iter_obj->regnum++;
    327 
    328       if (name != nullptr && *name != '\0')
    329 	return gdbpy_get_register_descriptor (gdbarch, regnum).release ();
    330     }
    331   while (true);
    332 }
    333 
    334 /* Implement:
    335 
    336    gdb.RegisterDescriptorIterator.find (self, name) -> gdb.RegisterDescriptor
    337 
    338    Look up a descriptor for register with NAME.  If no matching register is
    339    found then return None.  */
    340 
    341 static PyObject *
    342 register_descriptor_iter_find (PyObject *self, PyObject *args, PyObject *kw)
    343 {
    344   static const char *keywords[] = { "name", NULL };
    345   const char *register_name = NULL;
    346 
    347   register_descriptor_iterator_object *iter_obj
    348     = (register_descriptor_iterator_object *) self;
    349   struct gdbarch *gdbarch = iter_obj->gdbarch;
    350 
    351   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s", keywords,
    352 					&register_name))
    353     return NULL;
    354 
    355   if (register_name != NULL && *register_name != '\0')
    356     {
    357       int regnum = user_reg_map_name_to_regnum (gdbarch, register_name,
    358 						strlen (register_name));
    359       if (regnum >= 0)
    360 	return gdbpy_get_register_descriptor (gdbarch, regnum).release ();
    361     }
    362 
    363   Py_RETURN_NONE;
    364 }
    365 
    366 /* See python-internal.h.  */
    367 
    368 bool
    369 gdbpy_parse_register_id (struct gdbarch *gdbarch, PyObject *pyo_reg_id,
    370 			 int *reg_num)
    371 {
    372   gdb_assert (pyo_reg_id != NULL);
    373 
    374   /* The register could be a string, its name.  */
    375   if (gdbpy_is_string (pyo_reg_id))
    376     {
    377       gdb::unique_xmalloc_ptr<char> reg_name (gdbpy_obj_to_string (pyo_reg_id));
    378 
    379       if (reg_name != NULL)
    380 	{
    381 	  *reg_num = user_reg_map_name_to_regnum (gdbarch, reg_name.get (),
    382 						  strlen (reg_name.get ()));
    383 	  if (*reg_num >= 0)
    384 	    return true;
    385 	  PyErr_SetString (PyExc_ValueError, "Bad register");
    386 	}
    387     }
    388   /* The register could be its internal GDB register number.  */
    389   else if (PyLong_Check (pyo_reg_id))
    390     {
    391       long value;
    392       if (gdb_py_int_as_long (pyo_reg_id, &value) == 0)
    393 	{
    394 	  /* Nothing -- error.  */
    395 	}
    396       else if ((int) value == value
    397 	       && user_reg_map_regnum_to_name (gdbarch, value) != NULL)
    398 	{
    399 	  *reg_num = (int) value;
    400 	  return true;
    401 	}
    402       else
    403 	PyErr_SetString (PyExc_ValueError, "Bad register");
    404     }
    405   /* The register could be a gdb.RegisterDescriptor object.  */
    406   else if (PyObject_IsInstance (pyo_reg_id,
    407 			   (PyObject *) &register_descriptor_object_type))
    408     {
    409       register_descriptor_object *reg
    410 	= (register_descriptor_object *) pyo_reg_id;
    411       if (reg->gdbarch == gdbarch)
    412 	{
    413 	  *reg_num = reg->regnum;
    414 	  return true;
    415 	}
    416       else
    417 	PyErr_SetString (PyExc_ValueError,
    418 			 _("Invalid Architecture in RegisterDescriptor"));
    419     }
    420   else
    421     PyErr_SetString (PyExc_TypeError, _("Invalid type for register"));
    422 
    423   gdb_assert (PyErr_Occurred ());
    424   return false;
    425 }
    426 
    427 /* Initializes the new Python classes from this file in the gdb module.  */
    428 
    429 static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
    430 gdbpy_initialize_registers ()
    431 {
    432   register_descriptor_object_type.tp_new = PyType_GenericNew;
    433   if (PyType_Ready (&register_descriptor_object_type) < 0)
    434     return -1;
    435   if (gdb_pymodule_addobject
    436       (gdb_module, "RegisterDescriptor",
    437        (PyObject *) &register_descriptor_object_type) < 0)
    438     return -1;
    439 
    440   reggroup_iterator_object_type.tp_new = PyType_GenericNew;
    441   if (PyType_Ready (&reggroup_iterator_object_type) < 0)
    442     return -1;
    443   if (gdb_pymodule_addobject
    444       (gdb_module, "RegisterGroupsIterator",
    445        (PyObject *) &reggroup_iterator_object_type) < 0)
    446     return -1;
    447 
    448   reggroup_object_type.tp_new = PyType_GenericNew;
    449   if (PyType_Ready (&reggroup_object_type) < 0)
    450     return -1;
    451   if (gdb_pymodule_addobject
    452       (gdb_module, "RegisterGroup",
    453        (PyObject *) &reggroup_object_type) < 0)
    454     return -1;
    455 
    456   register_descriptor_iterator_object_type.tp_new = PyType_GenericNew;
    457   if (PyType_Ready (&register_descriptor_iterator_object_type) < 0)
    458     return -1;
    459   return (gdb_pymodule_addobject
    460 	  (gdb_module, "RegisterDescriptorIterator",
    461 	   (PyObject *) &register_descriptor_iterator_object_type));
    462 }
    463 
    464 GDBPY_INITIALIZE_FILE (gdbpy_initialize_registers);
    465 
    466 
    467 
    469 static PyMethodDef register_descriptor_iterator_object_methods [] = {
    470   { "find", (PyCFunction) register_descriptor_iter_find,
    471     METH_VARARGS | METH_KEYWORDS,
    472     "registers (name) -> gdb.RegisterDescriptor.\n\
    473 Return a register descriptor for the register NAME, or None if no register\n\
    474 with that name exists in this iterator." },
    475   {NULL}  /* Sentinel */
    476 };
    477 
    478 PyTypeObject 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*/
    498   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
    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 */
    506   register_descriptor_iterator_object_methods		/*tp_methods */
    507 };
    508 
    509 static 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 
    515 PyTypeObject 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 };
    547 
    548 PyTypeObject 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*/
    568   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
    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 
    579 static gdb_PyGetSetDef gdbpy_reggroup_getset[] = {
    580   { "name", gdbpy_reggroup_name, NULL,
    581     "The name of this register group.", NULL },
    582   { NULL }  /* Sentinel */
    583 };
    584 
    585 PyTypeObject 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 };
    617