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