* gdbarch.sh (target_gdbarch): Remove macro.
[deliverable/binutils-gdb.git] / gdb / python / py-symtab.c
CommitLineData
f3e9a817
PM
1/* Python interface to symbol tables.
2
0b302171 3 Copyright (C) 2008-2012 Free Software Foundation, Inc.
f3e9a817
PM
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"
a20ee7a4 26#include "block.h"
f3e9a817
PM
27
28typedef 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
40static PyTypeObject symtab_object_type;
41static const struct objfile_data *stpy_objfile_data_key;
42
43/* Require a valid symbol table. All access to symtab_object->symtab
44 should be gated by this call. */
45#define STPY_REQUIRE_VALID(symtab_obj, symtab) \
46 do { \
47 symtab = symtab_object_to_symtab (symtab_obj); \
48 if (symtab == NULL) \
49 { \
50 PyErr_SetString (PyExc_RuntimeError, \
51 _("Symbol Table is invalid.")); \
52 return NULL; \
53 } \
54 } while (0)
55
56typedef struct salpy_sal_object {
57 PyObject_HEAD
58 /* The GDB Symbol table structure. */
59 symtab_object *symtab;
60 /* The GDB Symbol table and line structure. */
61 struct symtab_and_line *sal;
62 /* A Symtab and line object is associated with an objfile, so keep
63 track with a doubly-linked list, rooted in the objfile. This
64 allows invalidation of the underlying struct symtab_and_line
65 when the objfile is deleted. */
66 struct salpy_sal_object *prev;
67 struct salpy_sal_object *next;
68} sal_object;
69
70static PyTypeObject sal_object_type;
71static const struct objfile_data *salpy_objfile_data_key;
72
73/* Require a valid symbol table and line object. All access to
74 sal_object->sal should be gated by this call. */
75#define SALPY_REQUIRE_VALID(sal_obj, sal) \
76 do { \
77 sal = sal_object_to_symtab_and_line (sal_obj); \
78 if (sal == NULL) \
79 { \
80 PyErr_SetString (PyExc_RuntimeError, \
81 _("Symbol Table and Line is invalid.")); \
82 return NULL; \
83 } \
84 } while (0)
85
86static PyObject *
87stpy_str (PyObject *self)
88{
89 PyObject *result;
90 struct symtab *symtab = NULL;
91
92 STPY_REQUIRE_VALID (self, symtab);
93
94 result = PyString_FromString (symtab->filename);
95
96 return result;
97}
98
99static PyObject *
100stpy_get_filename (PyObject *self, void *closure)
101{
102 PyObject *str_obj;
103 struct symtab *symtab = NULL;
104
105 STPY_REQUIRE_VALID (self, symtab);
106
107 str_obj = PyString_Decode (symtab->filename,
108 strlen (symtab->filename),
109 host_charset (), NULL);
110 return str_obj;
111}
112
113static PyObject *
114stpy_get_objfile (PyObject *self, void *closure)
115{
116 struct symtab *symtab = NULL;
117 PyObject *result;
118
119 STPY_REQUIRE_VALID (self, symtab);
120
121 result = objfile_to_objfile_object (symtab->objfile);
122 Py_XINCREF (result);
123 return result;
124}
125
126static PyObject *
127stpy_fullname (PyObject *self, PyObject *args)
128{
0b0865da 129 const char *fullname;
f3e9a817
PM
130 struct symtab *symtab = NULL;
131
132 STPY_REQUIRE_VALID (self, symtab);
133
134 fullname = symtab_to_fullname (symtab);
135 if (fullname)
136 return PyString_Decode (fullname, strlen (fullname),
137 host_charset (), NULL);
138
139 Py_RETURN_NONE;
140}
141
29703da4
PM
142/* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
143 Returns True if this Symbol table still exists in GDB. */
144
145static PyObject *
146stpy_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
a20ee7a4
SCR
157/* Return the GLOBAL_BLOCK of the underlying symtab. */
158
159static PyObject *
160stpy_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
175static PyObject *
176stpy_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
f3e9a817
PM
189static PyObject *
190salpy_str (PyObject *self)
191{
192 char *s, *filename;
193 sal_object *sal_obj;
194 PyObject *result;
195 struct symtab_and_line *sal = NULL;
196
197 SALPY_REQUIRE_VALID (self, sal);
198
199 sal_obj = (sal_object *) self;
200 filename = (sal_obj->symtab == (symtab_object *) Py_None)
201 ? "<unknown>" : sal_obj->symtab->symtab->filename;
202
203 s = xstrprintf ("symbol and line for %s, line %d", filename,
204 sal->line);
205
206 result = PyString_FromString (s);
207 xfree (s);
208
209 return result;
210}
211
212static void
213stpy_dealloc (PyObject *obj)
214{
215 symtab_object *symtab = (symtab_object *) obj;
216
217 if (symtab->prev)
218 symtab->prev->next = symtab->next;
219 else if (symtab->symtab)
220 {
221 set_objfile_data (symtab->symtab->objfile,
222 stpy_objfile_data_key, symtab->next);
223 }
224 if (symtab->next)
225 symtab->next->prev = symtab->prev;
226 symtab->symtab = NULL;
227}
228
229
230static PyObject *
231salpy_get_pc (PyObject *self, void *closure)
232{
233 struct symtab_and_line *sal = NULL;
234
235 SALPY_REQUIRE_VALID (self, sal);
236
74aedc46 237 return gdb_py_long_from_ulongest (sal->pc);
f3e9a817
PM
238}
239
ee0bf529
SCR
240/* Implementation of the get method for the 'last' attribute of
241 gdb.Symtab_and_line. */
242
243static PyObject *
244salpy_get_last (PyObject *self, void *closure)
245{
246 struct symtab_and_line *sal = NULL;
247
248 SALPY_REQUIRE_VALID (self, sal);
249
250 if (sal->end > 0)
251 return gdb_py_long_from_ulongest (sal->end - 1);
252 else
253 Py_RETURN_NONE;
254}
255
f3e9a817
PM
256static PyObject *
257salpy_get_line (PyObject *self, void *closure)
258{
259 struct symtab_and_line *sal = NULL;
260
261 SALPY_REQUIRE_VALID (self, sal);
262
74aedc46 263 return PyInt_FromLong (sal->line);
f3e9a817
PM
264}
265
266static PyObject *
267salpy_get_symtab (PyObject *self, void *closure)
268{
269 struct symtab_and_line *sal;
270 sal_object *self_sal = (sal_object *) self;
271
272 SALPY_REQUIRE_VALID (self, sal);
273
274 Py_INCREF (self_sal->symtab);
275
276 return (PyObject *) self_sal->symtab;
277}
278
29703da4
PM
279/* Implementation of gdb.Symtab_and_line.is_valid (self) -> Boolean.
280 Returns True if this Symbol table and line object still exists GDB. */
281
282static PyObject *
283salpy_is_valid (PyObject *self, PyObject *args)
284{
285 struct symtab_and_line *sal;
286
287 sal = sal_object_to_symtab_and_line (self);
288 if (sal == NULL)
289 Py_RETURN_FALSE;
290
291 Py_RETURN_TRUE;
292}
293
f3e9a817
PM
294static void
295salpy_dealloc (PyObject *self)
296{
297 sal_object *self_sal = (sal_object *) self;
298
299 if (self_sal->prev)
300 self_sal->prev->next = self_sal->next;
301 else if (self_sal->symtab != (symtab_object * ) Py_None)
302 set_objfile_data (self_sal->symtab->symtab->objfile,
303 salpy_objfile_data_key, self_sal->next);
304
305 if (self_sal->next)
306 self_sal->next->prev = self_sal->prev;
307
308 Py_DECREF (self_sal->symtab);
309 xfree (self_sal->sal);
310 self_sal->ob_type->tp_free (self);
311}
312
b021a221
MS
313/* Given a sal, and a sal_object that has previously been allocated
314 and initialized, populate the sal_object with the struct sal data.
315 Also, register the sal_object life-cycle with the life-cycle of the
316 object file associated with this sal, if needed. If a failure
317 occurs during the sal population, this function will return
318 NULL. */
f3e9a817
PM
319static int
320set_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 0;
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 1;
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
b021a221 364 with the life-cycle of the object file associated with this
f3e9a817
PM
365 symtab, if needed. */
366static void
367set_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. */
384PyObject *
385symtab_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. */
398PyObject *
399symtab_and_line_to_sal_object (struct symtab_and_line sal)
400
401{
402 sal_object *sal_obj;
f3e9a817 403 int success = 0;
f3e9a817 404
d59b6f6c 405 sal_obj = PyObject_New (sal_object, &sal_object_type);
f3e9a817
PM
406 if (sal_obj)
407 {
408 success = set_sal (sal_obj, sal);
409 if (!success)
410 {
411 Py_DECREF (sal_obj);
412 return NULL;
413 }
414 }
415
416 return (PyObject *) sal_obj;
417}
418
419/* Return struct symtab_and_line reference that is wrapped by this
420 object. */
421struct symtab_and_line *
422sal_object_to_symtab_and_line (PyObject *obj)
423{
424 if (! PyObject_TypeCheck (obj, &sal_object_type))
425 return NULL;
426 return ((sal_object *) obj)->sal;
427}
428
429/* Return struct symtab reference that is wrapped by this object. */
430struct symtab *
431symtab_object_to_symtab (PyObject *obj)
432{
433 if (! PyObject_TypeCheck (obj, &symtab_object_type))
434 return NULL;
435 return ((symtab_object *) obj)->symtab;
436}
437
438/* This function is called when an objfile is about to be freed.
439 Invalidate the symbol table as further actions on the symbol table
440 would result in bad data. All access to obj->symtab should be
441 gated by STPY_REQUIRE_VALID which will raise an exception on
442 invalid symbol tables. */
443static void
444del_objfile_symtab (struct objfile *objfile, void *datum)
445{
446 symtab_object *obj = datum;
d59b6f6c 447
f3e9a817
PM
448 while (obj)
449 {
450 symtab_object *next = obj->next;
451
452 obj->symtab = NULL;
453 obj->next = NULL;
454 obj->prev = NULL;
455 obj = next;
456 }
457}
458
459/* This function is called when an objfile is about to be freed.
460 Invalidate the sal object as further actions on the sal
461 would result in bad data. All access to obj->sal should be
462 gated by SALPY_REQUIRE_VALID which will raise an exception on
463 invalid symbol table and line objects. */
464static void
465del_objfile_sal (struct objfile *objfile, void *datum)
466{
467 sal_object *obj = datum;
d59b6f6c 468
f3e9a817
PM
469 while (obj)
470 {
471 sal_object *next = obj->next;
472
801e4185
TT
473 Py_DECREF (obj->symtab);
474 obj->symtab = (symtab_object *) Py_None;
475 Py_INCREF (Py_None);
476
f3e9a817
PM
477 obj->next = NULL;
478 obj->prev = NULL;
479 xfree (obj->sal);
480 obj->sal = NULL;
481
482 obj = next;
483 }
484}
485
486void
487gdbpy_initialize_symtabs (void)
488{
489 symtab_object_type.tp_new = PyType_GenericNew;
490 if (PyType_Ready (&symtab_object_type) < 0)
491 return;
492
493 sal_object_type.tp_new = PyType_GenericNew;
494 if (PyType_Ready (&sal_object_type) < 0)
495 return;
496
497 /* Register an objfile "free" callback so we can properly
498 invalidate symbol tables, and symbol table and line data
499 structures when an object file that is about to be
500 deleted. */
501 stpy_objfile_data_key
502 = register_objfile_data_with_cleanup (NULL, del_objfile_symtab);
503 salpy_objfile_data_key
504 = register_objfile_data_with_cleanup (NULL, del_objfile_sal);
505
506 Py_INCREF (&symtab_object_type);
507 PyModule_AddObject (gdb_module, "Symtab",
508 (PyObject *) &symtab_object_type);
509
510 Py_INCREF (&sal_object_type);
511 PyModule_AddObject (gdb_module, "Symtab_and_line",
512 (PyObject *) &sal_object_type);
513}
514
515\f
516
517static PyGetSetDef symtab_object_getset[] = {
518 { "filename", stpy_get_filename, NULL,
519 "The symbol table's source filename.", NULL },
520 { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.",
521 NULL },
522 {NULL} /* Sentinel */
523};
524
525static PyMethodDef symtab_object_methods[] = {
29703da4
PM
526 { "is_valid", stpy_is_valid, METH_NOARGS,
527 "is_valid () -> Boolean.\n\
528Return true if this symbol table is valid, false if not." },
f3e9a817
PM
529 { "fullname", stpy_fullname, METH_NOARGS,
530 "fullname () -> String.\n\
531Return the symtab's full source filename." },
a20ee7a4
SCR
532 { "global_block", stpy_global_block, METH_NOARGS,
533 "global_block () -> gdb.Block.\n\
534Return the global block of the symbol table." },
535 { "static_block", stpy_static_block, METH_NOARGS,
536 "static_block () -> gdb.Block.\n\
537Return the static block of the symbol table." },
f3e9a817
PM
538 {NULL} /* Sentinel */
539};
540
541static PyTypeObject symtab_object_type = {
542 PyObject_HEAD_INIT (NULL)
543 0, /*ob_size*/
544 "gdb.Symtab", /*tp_name*/
545 sizeof (symtab_object), /*tp_basicsize*/
546 0, /*tp_itemsize*/
547 stpy_dealloc, /*tp_dealloc*/
548 0, /*tp_print*/
549 0, /*tp_getattr*/
550 0, /*tp_setattr*/
551 0, /*tp_compare*/
552 0, /*tp_repr*/
553 0, /*tp_as_number*/
554 0, /*tp_as_sequence*/
555 0, /*tp_as_mapping*/
556 0, /*tp_hash */
557 0, /*tp_call*/
558 stpy_str, /*tp_str*/
559 0, /*tp_getattro*/
560 0, /*tp_setattro*/
561 0, /*tp_as_buffer*/
562 Py_TPFLAGS_DEFAULT, /*tp_flags*/
563 "GDB symtab object", /*tp_doc */
564 0, /*tp_traverse */
565 0, /*tp_clear */
566 0, /*tp_richcompare */
567 0, /*tp_weaklistoffset */
568 0, /*tp_iter */
569 0, /*tp_iternext */
570 symtab_object_methods, /*tp_methods */
571 0, /*tp_members */
572 symtab_object_getset /*tp_getset */
573};
574
575static PyGetSetDef sal_object_getset[] = {
576 { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL },
577 { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL },
ee0bf529
SCR
578 { "last", salpy_get_last, NULL,
579 "Return the symtab_and_line's last address.", NULL },
f3e9a817
PM
580 { "line", salpy_get_line, NULL,
581 "Return the symtab_and_line's line.", NULL },
582 {NULL} /* Sentinel */
583};
584
29703da4
PM
585static PyMethodDef sal_object_methods[] = {
586 { "is_valid", salpy_is_valid, METH_NOARGS,
587 "is_valid () -> Boolean.\n\
588Return true if this symbol table and line is valid, false if not." },
589 {NULL} /* Sentinel */
590};
591
f3e9a817
PM
592static PyTypeObject sal_object_type = {
593 PyObject_HEAD_INIT (NULL)
594 0, /*ob_size*/
595 "gdb.Symtab_and_line", /*tp_name*/
596 sizeof (sal_object), /*tp_basicsize*/
597 0, /*tp_itemsize*/
598 salpy_dealloc, /*tp_dealloc*/
599 0, /*tp_print*/
600 0, /*tp_getattr*/
601 0, /*tp_setattr*/
602 0, /*tp_compare*/
603 0, /*tp_repr*/
604 0, /*tp_as_number*/
605 0, /*tp_as_sequence*/
606 0, /*tp_as_mapping*/
607 0, /*tp_hash */
608 0, /*tp_call*/
609 salpy_str, /*tp_str*/
610 0, /*tp_getattro*/
611 0, /*tp_setattro*/
612 0, /*tp_as_buffer*/
613 Py_TPFLAGS_DEFAULT, /*tp_flags*/
614 "GDB symtab_and_line object", /*tp_doc */
615 0, /*tp_traverse */
616 0, /*tp_clear */
617 0, /*tp_richcompare */
618 0, /*tp_weaklistoffset */
619 0, /*tp_iter */
620 0, /*tp_iternext */
29703da4 621 sal_object_methods, /*tp_methods */
f3e9a817
PM
622 0, /*tp_members */
623 sal_object_getset /*tp_getset */
624};
This page took 0.335736 seconds and 4 git commands to generate.