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