* python/python.c (finish_python_initialization): Decref
[deliverable/binutils-gdb.git] / gdb / python / py-symtab.c
1 /* Python interface to symbol tables.
2
3 Copyright (C) 2008-2013 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 "defs.h"
21 #include "charset.h"
22 #include "symtab.h"
23 #include "source.h"
24 #include "python-internal.h"
25 #include "objfiles.h"
26 #include "block.h"
27
28 typedef struct stpy_symtab_object {
29 PyObject_HEAD
30 /* The GDB Symbol table structure. */
31 struct symtab *symtab;
32 /* A symtab object is associated with an objfile, so keep track with
33 a doubly-linked list, rooted in the objfile. This allows
34 invalidation of the underlying struct symtab when the objfile is
35 deleted. */
36 struct stpy_symtab_object *prev;
37 struct stpy_symtab_object *next;
38 } symtab_object;
39
40 static PyTypeObject symtab_object_type
41 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symtab_object");
42 static const struct objfile_data *stpy_objfile_data_key;
43
44 /* Require a valid symbol table. All access to symtab_object->symtab
45 should be gated by this call. */
46 #define STPY_REQUIRE_VALID(symtab_obj, symtab) \
47 do { \
48 symtab = symtab_object_to_symtab (symtab_obj); \
49 if (symtab == NULL) \
50 { \
51 PyErr_SetString (PyExc_RuntimeError, \
52 _("Symbol Table is invalid.")); \
53 return NULL; \
54 } \
55 } while (0)
56
57 typedef struct salpy_sal_object {
58 PyObject_HEAD
59 /* The GDB Symbol table structure. */
60 symtab_object *symtab;
61 /* The GDB Symbol table and line structure. */
62 struct symtab_and_line *sal;
63 /* A Symtab and line object is associated with an objfile, so keep
64 track with a doubly-linked list, rooted in the objfile. This
65 allows invalidation of the underlying struct symtab_and_line
66 when the objfile is deleted. */
67 struct salpy_sal_object *prev;
68 struct salpy_sal_object *next;
69 } sal_object;
70
71 static PyTypeObject sal_object_type
72 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object");
73 static const struct objfile_data *salpy_objfile_data_key;
74
75 /* Require a valid symbol table and line object. All access to
76 sal_object->sal should be gated by this call. */
77 #define SALPY_REQUIRE_VALID(sal_obj, sal) \
78 do { \
79 sal = sal_object_to_symtab_and_line (sal_obj); \
80 if (sal == NULL) \
81 { \
82 PyErr_SetString (PyExc_RuntimeError, \
83 _("Symbol Table and Line is invalid.")); \
84 return NULL; \
85 } \
86 } while (0)
87
88 static PyObject *
89 stpy_str (PyObject *self)
90 {
91 PyObject *result;
92 struct symtab *symtab = NULL;
93
94 STPY_REQUIRE_VALID (self, symtab);
95
96 result = PyString_FromString (symtab_to_filename_for_display (symtab));
97
98 return result;
99 }
100
101 static PyObject *
102 stpy_get_filename (PyObject *self, void *closure)
103 {
104 PyObject *str_obj;
105 struct symtab *symtab = NULL;
106 const char *filename;
107
108 STPY_REQUIRE_VALID (self, symtab);
109 filename = symtab_to_filename_for_display (symtab);
110
111 str_obj = PyString_Decode (filename, strlen (filename),
112 host_charset (), NULL);
113 return str_obj;
114 }
115
116 static PyObject *
117 stpy_get_objfile (PyObject *self, void *closure)
118 {
119 struct symtab *symtab = NULL;
120 PyObject *result;
121
122 STPY_REQUIRE_VALID (self, symtab);
123
124 result = objfile_to_objfile_object (symtab->objfile);
125 Py_XINCREF (result);
126 return result;
127 }
128
129 static PyObject *
130 stpy_fullname (PyObject *self, PyObject *args)
131 {
132 const char *fullname;
133 struct symtab *symtab = NULL;
134
135 STPY_REQUIRE_VALID (self, symtab);
136
137 fullname = symtab_to_fullname (symtab);
138
139 return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL);
140 }
141
142 /* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
143 Returns True if this Symbol table still exists in GDB. */
144
145 static PyObject *
146 stpy_is_valid (PyObject *self, PyObject *args)
147 {
148 struct symtab *symtab = NULL;
149
150 symtab = symtab_object_to_symtab (self);
151 if (symtab == NULL)
152 Py_RETURN_FALSE;
153
154 Py_RETURN_TRUE;
155 }
156
157 /* Return the GLOBAL_BLOCK of the underlying symtab. */
158
159 static PyObject *
160 stpy_global_block (PyObject *self, PyObject *args)
161 {
162 struct symtab *symtab = NULL;
163 struct block *block = NULL;
164 struct blockvector *blockvector;
165
166 STPY_REQUIRE_VALID (self, symtab);
167
168 blockvector = BLOCKVECTOR (symtab);
169 block = BLOCKVECTOR_BLOCK (blockvector, GLOBAL_BLOCK);
170 return block_to_block_object (block, symtab->objfile);
171 }
172
173 /* Return the STATIC_BLOCK of the underlying symtab. */
174
175 static PyObject *
176 stpy_static_block (PyObject *self, PyObject *args)
177 {
178 struct symtab *symtab = NULL;
179 struct block *block = NULL;
180 struct blockvector *blockvector;
181
182 STPY_REQUIRE_VALID (self, symtab);
183
184 blockvector = BLOCKVECTOR (symtab);
185 block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK);
186 return block_to_block_object (block, symtab->objfile);
187 }
188
189 static PyObject *
190 salpy_str (PyObject *self)
191 {
192 char *s;
193 const char *filename;
194 sal_object *sal_obj;
195 PyObject *result;
196 struct symtab_and_line *sal = NULL;
197
198 SALPY_REQUIRE_VALID (self, sal);
199
200 sal_obj = (sal_object *) self;
201 filename = (sal_obj->symtab == (symtab_object *) Py_None)
202 ? "<unknown>" : symtab_to_filename_for_display (sal_obj->symtab->symtab);
203
204 s = xstrprintf ("symbol and line for %s, line %d", filename,
205 sal->line);
206
207 result = PyString_FromString (s);
208 xfree (s);
209
210 return result;
211 }
212
213 static void
214 stpy_dealloc (PyObject *obj)
215 {
216 symtab_object *symtab = (symtab_object *) obj;
217
218 if (symtab->prev)
219 symtab->prev->next = symtab->next;
220 else if (symtab->symtab)
221 {
222 set_objfile_data (symtab->symtab->objfile,
223 stpy_objfile_data_key, symtab->next);
224 }
225 if (symtab->next)
226 symtab->next->prev = symtab->prev;
227 symtab->symtab = NULL;
228 }
229
230
231 static PyObject *
232 salpy_get_pc (PyObject *self, void *closure)
233 {
234 struct symtab_and_line *sal = NULL;
235
236 SALPY_REQUIRE_VALID (self, sal);
237
238 return gdb_py_long_from_ulongest (sal->pc);
239 }
240
241 /* Implementation of the get method for the 'last' attribute of
242 gdb.Symtab_and_line. */
243
244 static PyObject *
245 salpy_get_last (PyObject *self, void *closure)
246 {
247 struct symtab_and_line *sal = NULL;
248
249 SALPY_REQUIRE_VALID (self, sal);
250
251 if (sal->end > 0)
252 return gdb_py_long_from_ulongest (sal->end - 1);
253 else
254 Py_RETURN_NONE;
255 }
256
257 static PyObject *
258 salpy_get_line (PyObject *self, void *closure)
259 {
260 struct symtab_and_line *sal = NULL;
261
262 SALPY_REQUIRE_VALID (self, sal);
263
264 return PyInt_FromLong (sal->line);
265 }
266
267 static PyObject *
268 salpy_get_symtab (PyObject *self, void *closure)
269 {
270 struct symtab_and_line *sal;
271 sal_object *self_sal = (sal_object *) self;
272
273 SALPY_REQUIRE_VALID (self, sal);
274
275 Py_INCREF (self_sal->symtab);
276
277 return (PyObject *) self_sal->symtab;
278 }
279
280 /* Implementation of gdb.Symtab_and_line.is_valid (self) -> Boolean.
281 Returns True if this Symbol table and line object still exists GDB. */
282
283 static PyObject *
284 salpy_is_valid (PyObject *self, PyObject *args)
285 {
286 struct symtab_and_line *sal;
287
288 sal = sal_object_to_symtab_and_line (self);
289 if (sal == NULL)
290 Py_RETURN_FALSE;
291
292 Py_RETURN_TRUE;
293 }
294
295 static void
296 salpy_dealloc (PyObject *self)
297 {
298 sal_object *self_sal = (sal_object *) self;
299
300 if (self_sal->prev)
301 self_sal->prev->next = self_sal->next;
302 else if (self_sal->symtab != (symtab_object * ) Py_None)
303 set_objfile_data (self_sal->symtab->symtab->objfile,
304 salpy_objfile_data_key, self_sal->next);
305
306 if (self_sal->next)
307 self_sal->next->prev = self_sal->prev;
308
309 Py_DECREF (self_sal->symtab);
310 xfree (self_sal->sal);
311 Py_TYPE (self)->tp_free (self);
312 }
313
314 /* Given a sal, and a sal_object that has previously been allocated
315 and initialized, populate the sal_object with the struct sal data.
316 Also, register the sal_object life-cycle with the life-cycle of the
317 object file associated with this sal, if needed. If a failure
318 occurs during the sal population, this function will return -1. */
319 static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
320 set_sal (sal_object *sal_obj, struct symtab_and_line sal)
321 {
322 symtab_object *symtab_obj;
323
324 if (sal.symtab)
325 {
326 symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab);
327 /* If a symtab existed in the sal, but it cannot be duplicated,
328 we exit. */
329 if (symtab_obj == NULL)
330 return -1;
331 }
332 else
333 {
334 symtab_obj = (symtab_object *) Py_None;
335 Py_INCREF (Py_None);
336 }
337
338 sal_obj->sal = xmemdup (&sal, sizeof (struct symtab_and_line),
339 sizeof (struct symtab_and_line));
340 sal_obj->symtab = symtab_obj;
341 sal_obj->prev = NULL;
342
343 /* If the SAL does not have a symtab, we do not add it to the
344 objfile cleanup observer linked list. */
345 if (sal_obj->symtab != (symtab_object *)Py_None)
346 {
347 sal_obj->next = objfile_data (sal_obj->symtab->symtab->objfile,
348 salpy_objfile_data_key);
349 if (sal_obj->next)
350 sal_obj->next->prev = sal_obj;
351
352 set_objfile_data (sal_obj->symtab->symtab->objfile,
353 salpy_objfile_data_key, sal_obj);
354 }
355 else
356 sal_obj->next = NULL;
357
358 return 0;
359 }
360
361 /* Given a symtab, and a symtab_object that has previously been
362 allocated and initialized, populate the symtab_object with the
363 struct symtab data. Also, register the symtab_object life-cycle
364 with the life-cycle of the object file associated with this
365 symtab, if needed. */
366 static void
367 set_symtab (symtab_object *obj, struct symtab *symtab)
368 {
369 obj->symtab = symtab;
370 obj->prev = NULL;
371 if (symtab)
372 {
373 obj->next = objfile_data (symtab->objfile, stpy_objfile_data_key);
374 if (obj->next)
375 obj->next->prev = obj;
376 set_objfile_data (symtab->objfile, stpy_objfile_data_key, obj);
377 }
378 else
379 obj->next = NULL;
380 }
381
382 /* Create a new symbol table (gdb.Symtab) object that encapsulates the
383 symtab structure from GDB. */
384 PyObject *
385 symtab_to_symtab_object (struct symtab *symtab)
386 {
387 symtab_object *symtab_obj;
388
389 symtab_obj = PyObject_New (symtab_object, &symtab_object_type);
390 if (symtab_obj)
391 set_symtab (symtab_obj, symtab);
392
393 return (PyObject *) symtab_obj;
394 }
395
396 /* Create a new symtab and line (gdb.Symtab_and_line) object
397 that encapsulates the symtab_and_line structure from GDB. */
398 PyObject *
399 symtab_and_line_to_sal_object (struct symtab_and_line sal)
400 {
401 sal_object *sal_obj;
402 int success = 0;
403
404 sal_obj = PyObject_New (sal_object, &sal_object_type);
405 if (sal_obj)
406 {
407 if (set_sal (sal_obj, sal) < 0)
408 {
409 Py_DECREF (sal_obj);
410 return NULL;
411 }
412 }
413
414 return (PyObject *) sal_obj;
415 }
416
417 /* Return struct symtab_and_line reference that is wrapped by this
418 object. */
419 struct symtab_and_line *
420 sal_object_to_symtab_and_line (PyObject *obj)
421 {
422 if (! PyObject_TypeCheck (obj, &sal_object_type))
423 return NULL;
424 return ((sal_object *) obj)->sal;
425 }
426
427 /* Return struct symtab reference that is wrapped by this object. */
428 struct symtab *
429 symtab_object_to_symtab (PyObject *obj)
430 {
431 if (! PyObject_TypeCheck (obj, &symtab_object_type))
432 return NULL;
433 return ((symtab_object *) obj)->symtab;
434 }
435
436 /* This function is called when an objfile is about to be freed.
437 Invalidate the symbol table as further actions on the symbol table
438 would result in bad data. All access to obj->symtab should be
439 gated by STPY_REQUIRE_VALID which will raise an exception on
440 invalid symbol tables. */
441 static void
442 del_objfile_symtab (struct objfile *objfile, void *datum)
443 {
444 symtab_object *obj = datum;
445
446 while (obj)
447 {
448 symtab_object *next = obj->next;
449
450 obj->symtab = NULL;
451 obj->next = NULL;
452 obj->prev = NULL;
453 obj = next;
454 }
455 }
456
457 /* This function is called when an objfile is about to be freed.
458 Invalidate the sal object as further actions on the sal
459 would result in bad data. All access to obj->sal should be
460 gated by SALPY_REQUIRE_VALID which will raise an exception on
461 invalid symbol table and line objects. */
462 static void
463 del_objfile_sal (struct objfile *objfile, void *datum)
464 {
465 sal_object *obj = datum;
466
467 while (obj)
468 {
469 sal_object *next = obj->next;
470
471 Py_DECREF (obj->symtab);
472 obj->symtab = (symtab_object *) Py_None;
473 Py_INCREF (Py_None);
474
475 obj->next = NULL;
476 obj->prev = NULL;
477 xfree (obj->sal);
478 obj->sal = NULL;
479
480 obj = next;
481 }
482 }
483
484 int
485 gdbpy_initialize_symtabs (void)
486 {
487 symtab_object_type.tp_new = PyType_GenericNew;
488 if (PyType_Ready (&symtab_object_type) < 0)
489 return -1;
490
491 sal_object_type.tp_new = PyType_GenericNew;
492 if (PyType_Ready (&sal_object_type) < 0)
493 return -1;
494
495 /* Register an objfile "free" callback so we can properly
496 invalidate symbol tables, and symbol table and line data
497 structures when an object file that is about to be
498 deleted. */
499 stpy_objfile_data_key
500 = register_objfile_data_with_cleanup (NULL, del_objfile_symtab);
501 salpy_objfile_data_key
502 = register_objfile_data_with_cleanup (NULL, del_objfile_sal);
503
504 if (gdb_pymodule_addobject (gdb_module, "Symtab",
505 (PyObject *) &symtab_object_type) < 0)
506 return -1;
507
508 return gdb_pymodule_addobject (gdb_module, "Symtab_and_line",
509 (PyObject *) &sal_object_type);
510 }
511
512 \f
513
514 static PyGetSetDef symtab_object_getset[] = {
515 { "filename", stpy_get_filename, NULL,
516 "The symbol table's source filename.", NULL },
517 { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.",
518 NULL },
519 {NULL} /* Sentinel */
520 };
521
522 static PyMethodDef symtab_object_methods[] = {
523 { "is_valid", stpy_is_valid, METH_NOARGS,
524 "is_valid () -> Boolean.\n\
525 Return true if this symbol table is valid, false if not." },
526 { "fullname", stpy_fullname, METH_NOARGS,
527 "fullname () -> String.\n\
528 Return the symtab's full source filename." },
529 { "global_block", stpy_global_block, METH_NOARGS,
530 "global_block () -> gdb.Block.\n\
531 Return the global block of the symbol table." },
532 { "static_block", stpy_static_block, METH_NOARGS,
533 "static_block () -> gdb.Block.\n\
534 Return the static block of the symbol table." },
535 {NULL} /* Sentinel */
536 };
537
538 static PyTypeObject symtab_object_type = {
539 PyVarObject_HEAD_INIT (NULL, 0)
540 "gdb.Symtab", /*tp_name*/
541 sizeof (symtab_object), /*tp_basicsize*/
542 0, /*tp_itemsize*/
543 stpy_dealloc, /*tp_dealloc*/
544 0, /*tp_print*/
545 0, /*tp_getattr*/
546 0, /*tp_setattr*/
547 0, /*tp_compare*/
548 0, /*tp_repr*/
549 0, /*tp_as_number*/
550 0, /*tp_as_sequence*/
551 0, /*tp_as_mapping*/
552 0, /*tp_hash */
553 0, /*tp_call*/
554 stpy_str, /*tp_str*/
555 0, /*tp_getattro*/
556 0, /*tp_setattro*/
557 0, /*tp_as_buffer*/
558 Py_TPFLAGS_DEFAULT, /*tp_flags*/
559 "GDB symtab object", /*tp_doc */
560 0, /*tp_traverse */
561 0, /*tp_clear */
562 0, /*tp_richcompare */
563 0, /*tp_weaklistoffset */
564 0, /*tp_iter */
565 0, /*tp_iternext */
566 symtab_object_methods, /*tp_methods */
567 0, /*tp_members */
568 symtab_object_getset /*tp_getset */
569 };
570
571 static PyGetSetDef sal_object_getset[] = {
572 { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL },
573 { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL },
574 { "last", salpy_get_last, NULL,
575 "Return the symtab_and_line's last address.", NULL },
576 { "line", salpy_get_line, NULL,
577 "Return the symtab_and_line's line.", NULL },
578 {NULL} /* Sentinel */
579 };
580
581 static PyMethodDef sal_object_methods[] = {
582 { "is_valid", salpy_is_valid, METH_NOARGS,
583 "is_valid () -> Boolean.\n\
584 Return true if this symbol table and line is valid, false if not." },
585 {NULL} /* Sentinel */
586 };
587
588 static PyTypeObject sal_object_type = {
589 PyVarObject_HEAD_INIT (NULL, 0)
590 "gdb.Symtab_and_line", /*tp_name*/
591 sizeof (sal_object), /*tp_basicsize*/
592 0, /*tp_itemsize*/
593 salpy_dealloc, /*tp_dealloc*/
594 0, /*tp_print*/
595 0, /*tp_getattr*/
596 0, /*tp_setattr*/
597 0, /*tp_compare*/
598 0, /*tp_repr*/
599 0, /*tp_as_number*/
600 0, /*tp_as_sequence*/
601 0, /*tp_as_mapping*/
602 0, /*tp_hash */
603 0, /*tp_call*/
604 salpy_str, /*tp_str*/
605 0, /*tp_getattro*/
606 0, /*tp_setattro*/
607 0, /*tp_as_buffer*/
608 Py_TPFLAGS_DEFAULT, /*tp_flags*/
609 "GDB symtab_and_line object", /*tp_doc */
610 0, /*tp_traverse */
611 0, /*tp_clear */
612 0, /*tp_richcompare */
613 0, /*tp_weaklistoffset */
614 0, /*tp_iter */
615 0, /*tp_iternext */
616 sal_object_methods, /*tp_methods */
617 0, /*tp_members */
618 sal_object_getset /*tp_getset */
619 };
This page took 0.069326 seconds and 4 git commands to generate.