MIPS: Fix microMIPS instruction size determination
[deliverable/binutils-gdb.git] / gdb / python / py-unwind.c
CommitLineData
d11916aa
SS
1/* Python frame unwinder interface.
2
618f726f 3 Copyright (C) 2015-2016 Free Software Foundation, Inc.
d11916aa
SS
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 "arch-utils.h"
22#include "frame-unwind.h"
23#include "gdb_obstack.h"
24#include "gdbcmd.h"
25#include "language.h"
26#include "observer.h"
27#include "python-internal.h"
28#include "regcache.h"
29#include "valprint.h"
30#include "user-regs.h"
31
32#define TRACE_PY_UNWIND(level, args...) if (pyuw_debug >= level) \
33 { fprintf_unfiltered (gdb_stdlog, args); }
34
35typedef struct
36{
37 PyObject_HEAD
38
39 /* Frame we are unwinding. */
40 struct frame_info *frame_info;
41
42 /* Its architecture, passed by the sniffer caller. */
43 struct gdbarch *gdbarch;
44} pending_frame_object;
45
46/* Saved registers array item. */
47
48typedef struct
49{
50 int number;
51 PyObject *value;
52} saved_reg;
53DEF_VEC_O (saved_reg);
54
55/* The data we keep for the PyUnwindInfo: pending_frame, saved registers
56 and frame ID. */
57
58typedef struct
59{
60 PyObject_HEAD
61
62 /* gdb.PendingFrame for the frame we are unwinding. */
63 PyObject *pending_frame;
64
65 /* Its ID. */
66 struct frame_id frame_id;
67
68 /* Saved registers array. */
69 VEC (saved_reg) *saved_regs;
70} unwind_info_object;
71
72/* The data we keep for a frame we can unwind: frame ID and an array of
73 (register_number, register_value) pairs. */
74
13fa0398
YZ
75struct reg_info
76{
77 /* Register number. */
78 int number;
79
80 /* Register data bytes pointer. */
81 gdb_byte data[MAX_REGISTER_SIZE];
82};
83
d11916aa
SS
84typedef struct
85{
86 /* Frame ID. */
87 struct frame_id frame_id;
88
89 /* GDB Architecture. */
90 struct gdbarch *gdbarch;
91
92 /* Length of the `reg' array below. */
93 int reg_count;
94
13fa0398 95 struct reg_info reg[];
d11916aa
SS
96} cached_frame_info;
97
13fa0398 98extern PyTypeObject pending_frame_object_type
d11916aa
SS
99 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("pending_frame_object");
100
13fa0398 101extern PyTypeObject unwind_info_object_type
d11916aa
SS
102 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("unwind_info_object");
103
104static unsigned int pyuw_debug = 0;
105
106static struct gdbarch_data *pyuw_gdbarch_data;
107
108/* Parses register id, which can be either a number or a name.
109 Returns 1 on success, 0 otherwise. */
110
111static int
112pyuw_parse_register_id (struct gdbarch *gdbarch, PyObject *pyo_reg_id,
113 int *reg_num)
114{
115 if (pyo_reg_id == NULL)
116 return 0;
117 if (gdbpy_is_string (pyo_reg_id))
118 {
119 const char *reg_name = gdbpy_obj_to_string (pyo_reg_id);
120
121 if (reg_name == NULL)
122 return 0;
123 *reg_num = user_reg_map_name_to_regnum (gdbarch, reg_name,
124 strlen (reg_name));
125 return *reg_num >= 0;
126 }
127 else if (PyInt_Check (pyo_reg_id))
128 {
129 long value;
130 if (gdb_py_int_as_long (pyo_reg_id, &value) && (int) value == value)
131 {
132 *reg_num = (int) value;
133 return user_reg_map_regnum_to_name (gdbarch, *reg_num) != NULL;
134 }
135 }
136 return 0;
137}
138
139/* Convert gdb.Value instance to inferior's pointer. Return 1 on success,
140 0 on failure. */
141
142static int
143pyuw_value_obj_to_pointer (PyObject *pyo_value, CORE_ADDR *addr)
144{
145 int rc = 0;
146 struct value *value;
147
148 TRY
149 {
150 if ((value = value_object_to_value (pyo_value)) != NULL)
151 {
152 *addr = unpack_pointer (value_type (value),
153 value_contents (value));
154 rc = 1;
155 }
156 }
157 CATCH (except, RETURN_MASK_ALL)
158 {
159 gdbpy_convert_exception (except);
160 }
161 END_CATCH
162 return rc;
163}
164
165/* Get attribute from an object and convert it to the inferior's
166 pointer value. Return 1 if attribute exists and its value can be
167 converted. Otherwise, if attribute does not exist or its value is
168 None, return 0. In all other cases set Python error and return
169 0. */
170
171static int
172pyuw_object_attribute_to_pointer (PyObject *pyo, const char *attr_name,
173 CORE_ADDR *addr)
174{
175 int rc = 0;
176
177 if (PyObject_HasAttrString (pyo, attr_name))
178 {
179 PyObject *pyo_value = PyObject_GetAttrString (pyo, attr_name);
180 struct value *value;
181
182 if (pyo_value != NULL && pyo_value != Py_None)
183 {
184 rc = pyuw_value_obj_to_pointer (pyo_value, addr);
185 if (!rc)
186 PyErr_Format (
187 PyExc_ValueError,
188 _("The value of the '%s' attribute is not a pointer."),
189 attr_name);
190 }
191 Py_XDECREF (pyo_value);
192 }
193 return rc;
194}
195
196/* Called by the Python interpreter to obtain string representation
197 of the UnwindInfo object. */
198
199static PyObject *
200unwind_infopy_str (PyObject *self)
201{
202 struct ui_file *strfile = mem_fileopen ();
203 unwind_info_object *unwind_info = (unwind_info_object *) self;
204 pending_frame_object *pending_frame
205 = (pending_frame_object *) (unwind_info->pending_frame);
206 PyObject *result;
207
208 fprintf_unfiltered (strfile, "Frame ID: ");
209 fprint_frame_id (strfile, unwind_info->frame_id);
210 {
211 char *sep = "";
212 int i;
213 struct value_print_options opts;
214 saved_reg *reg;
215
216 get_user_print_options (&opts);
217 fprintf_unfiltered (strfile, "\nSaved registers: (");
218 for (i = 0;
219 i < VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg);
220 i++)
221 {
222 struct value *value = value_object_to_value (reg->value);
223
224 fprintf_unfiltered (strfile, "%s(%d, ", sep, reg->number);
225 if (value != NULL)
226 {
227 TRY
228 {
229 value_print (value, strfile, &opts);
230 fprintf_unfiltered (strfile, ")");
231 }
232 CATCH (except, RETURN_MASK_ALL)
233 {
234 GDB_PY_HANDLE_EXCEPTION (except);
235 }
236 END_CATCH
237 }
238 else
239 fprintf_unfiltered (strfile, "<BAD>)");
240 sep = ", ";
241 }
242 fprintf_unfiltered (strfile, ")");
243 }
244 {
245 char *s = ui_file_xstrdup (strfile, NULL);
246
247 result = PyString_FromString (s);
248 xfree (s);
249 }
250 ui_file_delete (strfile);
251 return result;
252}
253
254/* Create UnwindInfo instance for given PendingFrame and frame ID.
255 Sets Python error and returns NULL on error. */
256
257static PyObject *
258pyuw_create_unwind_info (PyObject *pyo_pending_frame,
259 struct frame_id frame_id)
260{
261 unwind_info_object *unwind_info
262 = PyObject_New (unwind_info_object, &unwind_info_object_type);
263
264 if (((pending_frame_object *) pyo_pending_frame)->frame_info == NULL)
265 {
266 PyErr_SetString (PyExc_ValueError,
267 "Attempting to use stale PendingFrame");
268 return NULL;
269 }
270 unwind_info->frame_id = frame_id;
271 Py_INCREF (pyo_pending_frame);
272 unwind_info->pending_frame = pyo_pending_frame;
273 unwind_info->saved_regs = VEC_alloc (saved_reg, 4);
274 return (PyObject *) unwind_info;
275}
276
277/* The implementation of
278 gdb.UnwindInfo.add_saved_register (REG, VALUE) -> None. */
279
280static PyObject *
281unwind_infopy_add_saved_register (PyObject *self, PyObject *args)
282{
283 unwind_info_object *unwind_info = (unwind_info_object *) self;
284 pending_frame_object *pending_frame
285 = (pending_frame_object *) (unwind_info->pending_frame);
286 PyObject *pyo_reg_id;
287 PyObject *pyo_reg_value;
288 int regnum;
289
290 if (pending_frame->frame_info == NULL)
291 {
292 PyErr_SetString (PyExc_ValueError,
293 "UnwindInfo instance refers to a stale PendingFrame");
294 return NULL;
295 }
296 if (!PyArg_UnpackTuple (args, "previous_frame_register", 2, 2,
297 &pyo_reg_id, &pyo_reg_value))
298 return NULL;
299 if (!pyuw_parse_register_id (pending_frame->gdbarch, pyo_reg_id, &regnum))
300 {
301 PyErr_SetString (PyExc_ValueError, "Bad register");
302 return NULL;
303 }
304 {
305 struct value *value;
306 size_t data_size;
307
308 if (pyo_reg_value == NULL
309 || (value = value_object_to_value (pyo_reg_value)) == NULL)
310 {
311 PyErr_SetString (PyExc_ValueError, "Bad register value");
312 return NULL;
313 }
314 data_size = register_size (pending_frame->gdbarch, regnum);
315 if (data_size != TYPE_LENGTH (value_type (value)))
316 {
317 PyErr_Format (
318 PyExc_ValueError,
319 "The value of the register returned by the Python "
320 "sniffer has unexpected size: %u instead of %u.",
321 (unsigned) TYPE_LENGTH (value_type (value)),
322 (unsigned) data_size);
323 return NULL;
324 }
325 }
326 {
327 int i;
328 saved_reg *reg;
329
330 for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++)
331 {
332 if (regnum == reg->number)
333 {
334 Py_DECREF (reg->value);
335 break;
336 }
337 }
338 if (reg == NULL)
339 {
340 reg = VEC_safe_push (saved_reg, unwind_info->saved_regs, NULL);
341 reg->number = regnum;
342 }
343 Py_INCREF (pyo_reg_value);
344 reg->value = pyo_reg_value;
345 }
346 Py_RETURN_NONE;
347}
348
349/* UnwindInfo cleanup. */
350
351static void
352unwind_infopy_dealloc (PyObject *self)
353{
354 unwind_info_object *unwind_info = (unwind_info_object *) self;
355 int i;
356 saved_reg *reg;
357
358 Py_XDECREF (unwind_info->pending_frame);
359 for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++)
360 Py_DECREF (reg->value);
361 VEC_free (saved_reg, unwind_info->saved_regs);
362 Py_TYPE (self)->tp_free (self);
363}
364
365/* Called by the Python interpreter to obtain string representation
366 of the PendingFrame object. */
367
368static PyObject *
369pending_framepy_str (PyObject *self)
370{
371 struct frame_info *frame = ((pending_frame_object *) self)->frame_info;
372 const char *sp_str = NULL;
373 const char *pc_str = NULL;
374
375 if (frame == NULL)
376 return PyString_FromString ("Stale PendingFrame instance");
377 TRY
378 {
379 sp_str = core_addr_to_string_nz (get_frame_sp (frame));
380 pc_str = core_addr_to_string_nz (get_frame_pc (frame));
381 }
382 CATCH (except, RETURN_MASK_ALL)
383 {
384 GDB_PY_HANDLE_EXCEPTION (except);
385 }
386 END_CATCH
387
388 return PyString_FromFormat ("SP=%s,PC=%s", sp_str, pc_str);
389}
390
391/* Implementation of gdb.PendingFrame.read_register (self, reg) -> gdb.Value.
392 Returns the value of register REG as gdb.Value instance. */
393
394static PyObject *
395pending_framepy_read_register (PyObject *self, PyObject *args)
396{
397 pending_frame_object *pending_frame = (pending_frame_object *) self;
398 struct value *val = NULL;
399 int regnum;
400 PyObject *pyo_reg_id;
401
402 if (pending_frame->frame_info == NULL)
403 {
404 PyErr_SetString (PyExc_ValueError,
405 "Attempting to read register from stale PendingFrame");
406 return NULL;
407 }
408 if (!PyArg_UnpackTuple (args, "read_register", 1, 1, &pyo_reg_id))
409 return NULL;
410 if (!pyuw_parse_register_id (pending_frame->gdbarch, pyo_reg_id, &regnum))
411 {
412 PyErr_SetString (PyExc_ValueError, "Bad register");
413 return NULL;
414 }
415
416 TRY
417 {
418 val = get_frame_register_value (pending_frame->frame_info, regnum);
419 if (val == NULL)
420 PyErr_Format (PyExc_ValueError,
421 "Cannot read register %d from frame.",
422 regnum);
423 }
424 CATCH (except, RETURN_MASK_ALL)
425 {
426 GDB_PY_HANDLE_EXCEPTION (except);
427 }
428 END_CATCH
429
430 return val == NULL ? NULL : value_to_value_object (val);
431}
432
433/* Implementation of
434 PendingFrame.create_unwind_info (self, frameId) -> UnwindInfo. */
435
436static PyObject *
437pending_framepy_create_unwind_info (PyObject *self, PyObject *args)
438{
439 PyObject *pyo_frame_id;
440 CORE_ADDR sp;
441 CORE_ADDR pc;
442 CORE_ADDR special;
443
444 if (!PyArg_ParseTuple (args, "O:create_unwind_info", &pyo_frame_id))
445 return NULL;
446 if (!pyuw_object_attribute_to_pointer (pyo_frame_id, "sp", &sp))
447 {
448 PyErr_SetString (PyExc_ValueError,
449 _("frame_id should have 'sp' attribute."));
450 return NULL;
451 }
452
453 /* The logic of building frame_id depending on the attributes of
454 the frame_id object:
455 Has Has Has Function to call
456 'sp'? 'pc'? 'special'?
457 ------|------|--------------|-------------------------
458 Y N * frame_id_build_wild (sp)
459 Y Y N frame_id_build (sp, pc)
460 Y Y Y frame_id_build_special (sp, pc, special)
461 */
462 if (!pyuw_object_attribute_to_pointer (pyo_frame_id, "pc", &pc))
463 return pyuw_create_unwind_info (self, frame_id_build_wild (sp));
464 if (!pyuw_object_attribute_to_pointer (pyo_frame_id, "special", &special))
465 return pyuw_create_unwind_info (self, frame_id_build (sp, pc));
466 else
467 return pyuw_create_unwind_info (self,
468 frame_id_build_special (sp, pc, special));
469}
470
471/* Invalidate PendingFrame instance. */
472
473static void
474pending_frame_invalidate (void *pyo_pending_frame)
475{
476 if (pyo_pending_frame != NULL)
477 ((pending_frame_object *) pyo_pending_frame)->frame_info = NULL;
478}
479
480/* frame_unwind.this_id method. */
481
482static void
483pyuw_this_id (struct frame_info *this_frame, void **cache_ptr,
484 struct frame_id *this_id)
485{
486 *this_id = ((cached_frame_info *) *cache_ptr)->frame_id;
487 if (pyuw_debug >= 1)
488 {
489 fprintf_unfiltered (gdb_stdlog, "%s: frame_id: ", __FUNCTION__);
490 fprint_frame_id (gdb_stdlog, *this_id);
491 fprintf_unfiltered (gdb_stdlog, "\n");
492 }
493}
494
495/* frame_unwind.prev_register. */
496
497static struct value *
498pyuw_prev_register (struct frame_info *this_frame, void **cache_ptr,
499 int regnum)
500{
19ba03f4 501 cached_frame_info *cached_frame = (cached_frame_info *) *cache_ptr;
d11916aa
SS
502 struct reg_info *reg_info = cached_frame->reg;
503 struct reg_info *reg_info_end = reg_info + cached_frame->reg_count;
504
505 TRACE_PY_UNWIND (1, "%s (frame=%p,...,reg=%d)\n", __FUNCTION__, this_frame,
506 regnum);
507 for (; reg_info < reg_info_end; ++reg_info)
508 {
509 if (regnum == reg_info->number)
510 return frame_unwind_got_bytes (this_frame, regnum, reg_info->data);
511 }
512
513 return frame_unwind_got_optimized (this_frame, regnum);
514}
515
516/* Frame sniffer dispatch. */
517
518static int
519pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame,
520 void **cache_ptr)
521{
522 struct gdbarch *gdbarch = (struct gdbarch *) (self->unwind_data);
523 struct cleanup *cleanups = ensure_python_env (gdbarch, current_language);
524 PyObject *pyo_execute;
525 PyObject *pyo_pending_frame;
526 PyObject *pyo_unwind_info;
527 cached_frame_info *cached_frame;
528
529 TRACE_PY_UNWIND (3, "%s (SP=%s, PC=%s)\n", __FUNCTION__,
530 paddress (gdbarch, get_frame_sp (this_frame)),
531 paddress (gdbarch, get_frame_pc (this_frame)));
532
533 /* Create PendingFrame instance to pass to sniffers. */
534 pyo_pending_frame = (PyObject *) PyObject_New (pending_frame_object,
535 &pending_frame_object_type);
536 if (pyo_pending_frame == NULL)
537 goto error;
538 ((pending_frame_object *) pyo_pending_frame)->gdbarch = gdbarch;
539 ((pending_frame_object *) pyo_pending_frame)->frame_info = this_frame;
d11916aa 540 make_cleanup_py_decref (pyo_pending_frame);
3207396b 541 make_cleanup (pending_frame_invalidate, (void *) pyo_pending_frame);
d11916aa
SS
542
543 /* Run unwinders. */
544 if (gdb_python_module == NULL
545 || ! PyObject_HasAttrString (gdb_python_module, "execute_unwinders"))
546 {
547 PyErr_SetString (PyExc_NameError,
548 "Installation error: gdb.execute_unwinders function "
549 "is missing");
550 goto error;
551 }
552 pyo_execute = PyObject_GetAttrString (gdb_python_module, "execute_unwinders");
553 if (pyo_execute == NULL)
554 goto error;
555 make_cleanup_py_decref (pyo_execute);
556 pyo_unwind_info
557 = PyObject_CallFunctionObjArgs (pyo_execute, pyo_pending_frame, NULL);
558 if (pyo_unwind_info == NULL)
559 goto error;
560 make_cleanup_py_decref (pyo_unwind_info);
561 if (pyo_unwind_info == Py_None)
562 goto cannot_unwind;
563
564 /* Received UnwindInfo, cache data. */
565 if (PyObject_IsInstance (pyo_unwind_info,
566 (PyObject *) &unwind_info_object_type) <= 0)
567 error (_("A Unwinder should return gdb.UnwindInfo instance."));
568
569 {
570 unwind_info_object *unwind_info = (unwind_info_object *) pyo_unwind_info;
571 int reg_count = VEC_length (saved_reg, unwind_info->saved_regs);
572 saved_reg *reg;
573 int i;
574
224c3ddb
SM
575 cached_frame
576 = ((cached_frame_info *)
577 xmalloc (sizeof (*cached_frame)
578 + reg_count * sizeof (cached_frame->reg[0])));
d11916aa
SS
579 cached_frame->gdbarch = gdbarch;
580 cached_frame->frame_id = unwind_info->frame_id;
581 cached_frame->reg_count = reg_count;
582
583 /* Populate registers array. */
584 for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++)
585 {
586 struct value *value = value_object_to_value (reg->value);
587 size_t data_size = register_size (gdbarch, reg->number);
588
589 cached_frame->reg[i].number = reg->number;
590
591 /* `value' validation was done before, just assert. */
592 gdb_assert (value != NULL);
593 gdb_assert (data_size == TYPE_LENGTH (value_type (value)));
594 gdb_assert (data_size <= MAX_REGISTER_SIZE);
595
596 memcpy (cached_frame->reg[i].data, value_contents (value), data_size);
597 }
598 }
599
600 *cache_ptr = cached_frame;
601 do_cleanups (cleanups);
602 return 1;
603
604 error:
605 gdbpy_print_stack ();
606 /* Fallthrough. */
607 cannot_unwind:
608 do_cleanups (cleanups);
609 return 0;
610}
611
612/* Frame cache release shim. */
613
614static void
615pyuw_dealloc_cache (struct frame_info *this_frame, void *cache)
616{
617 TRACE_PY_UNWIND (3, "%s: enter", __FUNCTION__);
618 xfree (cache);
619}
620
621struct pyuw_gdbarch_data_type
622{
623 /* Has the unwinder shim been prepended? */
624 int unwinder_registered;
625};
626
627static void *
628pyuw_gdbarch_data_init (struct gdbarch *gdbarch)
629{
630 return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct pyuw_gdbarch_data_type);
631}
632
633/* New inferior architecture callback: register the Python unwinders
634 intermediary. */
635
636static void
637pyuw_on_new_gdbarch (struct gdbarch *newarch)
638{
19ba03f4
SM
639 struct pyuw_gdbarch_data_type *data
640 = (struct pyuw_gdbarch_data_type *) gdbarch_data (newarch,
641 pyuw_gdbarch_data);
d11916aa
SS
642
643 if (!data->unwinder_registered)
644 {
645 struct frame_unwind *unwinder
646 = GDBARCH_OBSTACK_ZALLOC (newarch, struct frame_unwind);
647
648 unwinder->type = NORMAL_FRAME;
649 unwinder->stop_reason = default_frame_unwind_stop_reason;
650 unwinder->this_id = pyuw_this_id;
651 unwinder->prev_register = pyuw_prev_register;
19ba03f4 652 unwinder->unwind_data = (const struct frame_data *) newarch;
d11916aa
SS
653 unwinder->sniffer = pyuw_sniffer;
654 unwinder->dealloc_cache = pyuw_dealloc_cache;
655 frame_unwind_prepend_unwinder (newarch, unwinder);
656 data->unwinder_registered = 1;
657 }
658}
659
660/* Initialize unwind machinery. */
661
662int
663gdbpy_initialize_unwind (void)
664{
665 int rc;
666 add_setshow_zuinteger_cmd
667 ("py-unwind", class_maintenance, &pyuw_debug,
668 _("Set Python unwinder debugging."),
669 _("Show Python unwinder debugging."),
670 _("When non-zero, Python unwinder debugging is enabled."),
671 NULL,
672 NULL,
673 &setdebuglist, &showdebuglist);
674 pyuw_gdbarch_data
675 = gdbarch_data_register_post_init (pyuw_gdbarch_data_init);
676 observer_attach_architecture_changed (pyuw_on_new_gdbarch);
677
678 if (PyType_Ready (&pending_frame_object_type) < 0)
679 return -1;
680 rc = gdb_pymodule_addobject (gdb_module, "PendingFrame",
681 (PyObject *) &pending_frame_object_type);
682 if (rc)
683 return rc;
684
685 if (PyType_Ready (&unwind_info_object_type) < 0)
686 return -1;
687 return gdb_pymodule_addobject (gdb_module, "UnwindInfo",
688 (PyObject *) &unwind_info_object_type);
689}
690
691static PyMethodDef pending_frame_object_methods[] =
692{
693 { "read_register", pending_framepy_read_register, METH_VARARGS,
694 "read_register (REG) -> gdb.Value\n"
695 "Return the value of the REG in the frame." },
696 { "create_unwind_info",
697 pending_framepy_create_unwind_info, METH_VARARGS,
698 "create_unwind_info (FRAME_ID) -> gdb.UnwindInfo\n"
699 "Construct UnwindInfo for this PendingFrame, using FRAME_ID\n"
700 "to identify it." },
701 {NULL} /* Sentinel */
702};
703
13fa0398 704PyTypeObject pending_frame_object_type =
d11916aa
SS
705{
706 PyVarObject_HEAD_INIT (NULL, 0)
707 "gdb.PendingFrame", /* tp_name */
708 sizeof (pending_frame_object), /* tp_basicsize */
709 0, /* tp_itemsize */
710 0, /* tp_dealloc */
711 0, /* tp_print */
712 0, /* tp_getattr */
713 0, /* tp_setattr */
714 0, /* tp_compare */
715 0, /* tp_repr */
716 0, /* tp_as_number */
717 0, /* tp_as_sequence */
718 0, /* tp_as_mapping */
719 0, /* tp_hash */
720 0, /* tp_call */
721 pending_framepy_str, /* tp_str */
722 0, /* tp_getattro */
723 0, /* tp_setattro */
724 0, /* tp_as_buffer */
725 Py_TPFLAGS_DEFAULT, /* tp_flags */
726 "GDB PendingFrame object", /* tp_doc */
727 0, /* tp_traverse */
728 0, /* tp_clear */
729 0, /* tp_richcompare */
730 0, /* tp_weaklistoffset */
731 0, /* tp_iter */
732 0, /* tp_iternext */
733 pending_frame_object_methods, /* tp_methods */
734 0, /* tp_members */
735 0, /* tp_getset */
736 0, /* tp_base */
737 0, /* tp_dict */
738 0, /* tp_descr_get */
739 0, /* tp_descr_set */
740 0, /* tp_dictoffset */
741 0, /* tp_init */
742 0, /* tp_alloc */
743};
744
745static PyMethodDef unwind_info_object_methods[] =
746{
747 { "add_saved_register",
748 unwind_infopy_add_saved_register, METH_VARARGS,
749 "add_saved_register (REG, VALUE) -> None\n"
750 "Set the value of the REG in the previous frame to VALUE." },
751 { NULL } /* Sentinel */
752};
753
13fa0398 754PyTypeObject unwind_info_object_type =
d11916aa
SS
755{
756 PyVarObject_HEAD_INIT (NULL, 0)
757 "gdb.UnwindInfo", /* tp_name */
758 sizeof (unwind_info_object), /* tp_basicsize */
759 0, /* tp_itemsize */
760 unwind_infopy_dealloc, /* tp_dealloc */
761 0, /* tp_print */
762 0, /* tp_getattr */
763 0, /* tp_setattr */
764 0, /* tp_compare */
765 0, /* tp_repr */
766 0, /* tp_as_number */
767 0, /* tp_as_sequence */
768 0, /* tp_as_mapping */
769 0, /* tp_hash */
770 0, /* tp_call */
771 unwind_infopy_str, /* tp_str */
772 0, /* tp_getattro */
773 0, /* tp_setattro */
774 0, /* tp_as_buffer */
775 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
776 "GDB UnwindInfo object", /* tp_doc */
777 0, /* tp_traverse */
778 0, /* tp_clear */
779 0, /* tp_richcompare */
780 0, /* tp_weaklistoffset */
781 0, /* tp_iter */
782 0, /* tp_iternext */
783 unwind_info_object_methods, /* tp_methods */
784 0, /* tp_members */
785 0, /* tp_getset */
786 0, /* tp_base */
787 0, /* tp_dict */
788 0, /* tp_descr_get */
789 0, /* tp_descr_set */
790 0, /* tp_dictoffset */
791 0, /* tp_init */
792 0, /* tp_alloc */
793};
This page took 0.128405 seconds and 4 git commands to generate.