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