1c50c785cSJohn Marino /* Python interface to symbols.
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 "block.h"
22c50c785cSJohn Marino #include "exceptions.h"
23c50c785cSJohn Marino #include "frame.h"
24c50c785cSJohn Marino #include "symtab.h"
25c50c785cSJohn Marino #include "python-internal.h"
26c50c785cSJohn Marino #include "objfiles.h"
27c50c785cSJohn Marino
28c50c785cSJohn Marino typedef struct sympy_symbol_object {
29c50c785cSJohn Marino PyObject_HEAD
30c50c785cSJohn Marino /* The GDB symbol structure this object is wrapping. */
31c50c785cSJohn Marino struct symbol *symbol;
32c50c785cSJohn Marino /* A symbol object is associated with an objfile, so keep track with
33c50c785cSJohn Marino doubly-linked list, rooted in the objfile. This lets us
34c50c785cSJohn Marino invalidate the underlying struct symbol when the objfile is
35c50c785cSJohn Marino deleted. */
36c50c785cSJohn Marino struct sympy_symbol_object *prev;
37c50c785cSJohn Marino struct sympy_symbol_object *next;
38c50c785cSJohn Marino } symbol_object;
39c50c785cSJohn Marino
40c50c785cSJohn Marino /* Require a valid symbol. All access to symbol_object->symbol should be
41c50c785cSJohn Marino gated by this call. */
42c50c785cSJohn Marino #define SYMPY_REQUIRE_VALID(symbol_obj, symbol) \
43c50c785cSJohn Marino do { \
44c50c785cSJohn Marino symbol = symbol_object_to_symbol (symbol_obj); \
45c50c785cSJohn Marino if (symbol == NULL) \
46c50c785cSJohn Marino { \
47c50c785cSJohn Marino PyErr_SetString (PyExc_RuntimeError, \
48c50c785cSJohn Marino _("Symbol is invalid.")); \
49c50c785cSJohn Marino return NULL; \
50c50c785cSJohn Marino } \
51c50c785cSJohn Marino } while (0)
52c50c785cSJohn Marino
53c50c785cSJohn Marino static const struct objfile_data *sympy_objfile_data_key;
54c50c785cSJohn Marino
55c50c785cSJohn Marino static PyObject *
sympy_str(PyObject * self)56c50c785cSJohn Marino sympy_str (PyObject *self)
57c50c785cSJohn Marino {
58c50c785cSJohn Marino PyObject *result;
59c50c785cSJohn Marino struct symbol *symbol = NULL;
60c50c785cSJohn Marino
61c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
62c50c785cSJohn Marino
63c50c785cSJohn Marino result = PyString_FromString (SYMBOL_PRINT_NAME (symbol));
64c50c785cSJohn Marino
65c50c785cSJohn Marino return result;
66c50c785cSJohn Marino }
67c50c785cSJohn Marino
68c50c785cSJohn Marino static PyObject *
sympy_get_type(PyObject * self,void * closure)69a45ae5f8SJohn Marino sympy_get_type (PyObject *self, void *closure)
70a45ae5f8SJohn Marino {
71a45ae5f8SJohn Marino struct symbol *symbol = NULL;
72a45ae5f8SJohn Marino
73a45ae5f8SJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
74a45ae5f8SJohn Marino
75a45ae5f8SJohn Marino if (SYMBOL_TYPE (symbol) == NULL)
76a45ae5f8SJohn Marino {
77a45ae5f8SJohn Marino Py_INCREF (Py_None);
78a45ae5f8SJohn Marino return Py_None;
79a45ae5f8SJohn Marino }
80a45ae5f8SJohn Marino
81a45ae5f8SJohn Marino return type_to_type_object (SYMBOL_TYPE (symbol));
82a45ae5f8SJohn Marino }
83a45ae5f8SJohn Marino
84a45ae5f8SJohn Marino static PyObject *
sympy_get_symtab(PyObject * self,void * closure)85c50c785cSJohn Marino sympy_get_symtab (PyObject *self, void *closure)
86c50c785cSJohn Marino {
87c50c785cSJohn Marino struct symbol *symbol = NULL;
88c50c785cSJohn Marino
89c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
90c50c785cSJohn Marino
91c50c785cSJohn Marino return symtab_to_symtab_object (SYMBOL_SYMTAB (symbol));
92c50c785cSJohn Marino }
93c50c785cSJohn Marino
94c50c785cSJohn Marino static PyObject *
sympy_get_name(PyObject * self,void * closure)95c50c785cSJohn Marino sympy_get_name (PyObject *self, void *closure)
96c50c785cSJohn Marino {
97c50c785cSJohn Marino struct symbol *symbol = NULL;
98c50c785cSJohn Marino
99c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
100c50c785cSJohn Marino
101c50c785cSJohn Marino return PyString_FromString (SYMBOL_NATURAL_NAME (symbol));
102c50c785cSJohn Marino }
103c50c785cSJohn Marino
104c50c785cSJohn Marino static PyObject *
sympy_get_linkage_name(PyObject * self,void * closure)105c50c785cSJohn Marino sympy_get_linkage_name (PyObject *self, void *closure)
106c50c785cSJohn Marino {
107c50c785cSJohn Marino struct symbol *symbol = NULL;
108c50c785cSJohn Marino
109c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
110c50c785cSJohn Marino
111c50c785cSJohn Marino return PyString_FromString (SYMBOL_LINKAGE_NAME (symbol));
112c50c785cSJohn Marino }
113c50c785cSJohn Marino
114c50c785cSJohn Marino static PyObject *
sympy_get_print_name(PyObject * self,void * closure)115c50c785cSJohn Marino sympy_get_print_name (PyObject *self, void *closure)
116c50c785cSJohn Marino {
117c50c785cSJohn Marino struct symbol *symbol = NULL;
118c50c785cSJohn Marino
119c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
120c50c785cSJohn Marino
121c50c785cSJohn Marino return sympy_str (self);
122c50c785cSJohn Marino }
123c50c785cSJohn Marino
124c50c785cSJohn Marino static PyObject *
sympy_get_addr_class(PyObject * self,void * closure)125c50c785cSJohn Marino sympy_get_addr_class (PyObject *self, void *closure)
126c50c785cSJohn Marino {
127c50c785cSJohn Marino struct symbol *symbol = NULL;
128c50c785cSJohn Marino
129c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
130c50c785cSJohn Marino
131c50c785cSJohn Marino return PyInt_FromLong (SYMBOL_CLASS (symbol));
132c50c785cSJohn Marino }
133c50c785cSJohn Marino
134c50c785cSJohn Marino static PyObject *
sympy_is_argument(PyObject * self,void * closure)135c50c785cSJohn Marino sympy_is_argument (PyObject *self, void *closure)
136c50c785cSJohn Marino {
137c50c785cSJohn Marino struct symbol *symbol = NULL;
138c50c785cSJohn Marino
139c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
140c50c785cSJohn Marino
141c50c785cSJohn Marino return PyBool_FromLong (SYMBOL_IS_ARGUMENT (symbol));
142c50c785cSJohn Marino }
143c50c785cSJohn Marino
144c50c785cSJohn Marino static PyObject *
sympy_is_constant(PyObject * self,void * closure)145c50c785cSJohn Marino sympy_is_constant (PyObject *self, void *closure)
146c50c785cSJohn Marino {
147c50c785cSJohn Marino struct symbol *symbol = NULL;
148c50c785cSJohn Marino enum address_class class;
149c50c785cSJohn Marino
150c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
151c50c785cSJohn Marino
152c50c785cSJohn Marino class = SYMBOL_CLASS (symbol);
153c50c785cSJohn Marino
154c50c785cSJohn Marino return PyBool_FromLong (class == LOC_CONST || class == LOC_CONST_BYTES);
155c50c785cSJohn Marino }
156c50c785cSJohn Marino
157c50c785cSJohn Marino static PyObject *
sympy_is_function(PyObject * self,void * closure)158c50c785cSJohn Marino sympy_is_function (PyObject *self, void *closure)
159c50c785cSJohn Marino {
160c50c785cSJohn Marino struct symbol *symbol = NULL;
161c50c785cSJohn Marino enum address_class class;
162c50c785cSJohn Marino
163c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
164c50c785cSJohn Marino
165c50c785cSJohn Marino class = SYMBOL_CLASS (symbol);
166c50c785cSJohn Marino
167c50c785cSJohn Marino return PyBool_FromLong (class == LOC_BLOCK);
168c50c785cSJohn Marino }
169c50c785cSJohn Marino
170c50c785cSJohn Marino static PyObject *
sympy_is_variable(PyObject * self,void * closure)171c50c785cSJohn Marino sympy_is_variable (PyObject *self, void *closure)
172c50c785cSJohn Marino {
173c50c785cSJohn Marino struct symbol *symbol = NULL;
174c50c785cSJohn Marino enum address_class class;
175c50c785cSJohn Marino
176c50c785cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
177c50c785cSJohn Marino
178c50c785cSJohn Marino class = SYMBOL_CLASS (symbol);
179c50c785cSJohn Marino
180c50c785cSJohn Marino return PyBool_FromLong (!SYMBOL_IS_ARGUMENT (symbol)
181c50c785cSJohn Marino && (class == LOC_LOCAL || class == LOC_REGISTER
182c50c785cSJohn Marino || class == LOC_STATIC || class == LOC_COMPUTED
183c50c785cSJohn Marino || class == LOC_OPTIMIZED_OUT));
184c50c785cSJohn Marino }
185c50c785cSJohn Marino
186*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.needs_frame -> Boolean.
187*ef5ccd6cSJohn Marino Returns true iff the symbol needs a frame for evaluation. */
188*ef5ccd6cSJohn Marino
189*ef5ccd6cSJohn Marino static PyObject *
sympy_needs_frame(PyObject * self,void * closure)190*ef5ccd6cSJohn Marino sympy_needs_frame (PyObject *self, void *closure)
191*ef5ccd6cSJohn Marino {
192*ef5ccd6cSJohn Marino struct symbol *symbol = NULL;
193*ef5ccd6cSJohn Marino volatile struct gdb_exception except;
194*ef5ccd6cSJohn Marino int result = 0;
195*ef5ccd6cSJohn Marino
196*ef5ccd6cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
197*ef5ccd6cSJohn Marino
198*ef5ccd6cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
199*ef5ccd6cSJohn Marino {
200*ef5ccd6cSJohn Marino result = symbol_read_needs_frame (symbol);
201*ef5ccd6cSJohn Marino }
202*ef5ccd6cSJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
203*ef5ccd6cSJohn Marino
204*ef5ccd6cSJohn Marino if (result)
205*ef5ccd6cSJohn Marino Py_RETURN_TRUE;
206*ef5ccd6cSJohn Marino Py_RETURN_FALSE;
207*ef5ccd6cSJohn Marino }
208*ef5ccd6cSJohn Marino
209*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.line -> int.
210*ef5ccd6cSJohn Marino Returns the line number at which the symbol was defined. */
211*ef5ccd6cSJohn Marino
212*ef5ccd6cSJohn Marino static PyObject *
sympy_line(PyObject * self,void * closure)213*ef5ccd6cSJohn Marino sympy_line (PyObject *self, void *closure)
214*ef5ccd6cSJohn Marino {
215*ef5ccd6cSJohn Marino struct symbol *symbol = NULL;
216*ef5ccd6cSJohn Marino
217*ef5ccd6cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
218*ef5ccd6cSJohn Marino
219*ef5ccd6cSJohn Marino return PyInt_FromLong (SYMBOL_LINE (symbol));
220*ef5ccd6cSJohn Marino }
221*ef5ccd6cSJohn Marino
222c50c785cSJohn Marino /* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
223c50c785cSJohn Marino Returns True if this Symbol still exists in GDB. */
224c50c785cSJohn Marino
225c50c785cSJohn Marino static PyObject *
sympy_is_valid(PyObject * self,PyObject * args)226c50c785cSJohn Marino sympy_is_valid (PyObject *self, PyObject *args)
227c50c785cSJohn Marino {
228c50c785cSJohn Marino struct symbol *symbol = NULL;
229c50c785cSJohn Marino
230c50c785cSJohn Marino symbol = symbol_object_to_symbol (self);
231c50c785cSJohn Marino if (symbol == NULL)
232c50c785cSJohn Marino Py_RETURN_FALSE;
233c50c785cSJohn Marino
234c50c785cSJohn Marino Py_RETURN_TRUE;
235c50c785cSJohn Marino }
236c50c785cSJohn Marino
237*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.value (self[, frame]) -> gdb.Value. Returns
238*ef5ccd6cSJohn Marino the value of the symbol, or an error in various circumstances. */
239*ef5ccd6cSJohn Marino
240*ef5ccd6cSJohn Marino static PyObject *
sympy_value(PyObject * self,PyObject * args)241*ef5ccd6cSJohn Marino sympy_value (PyObject *self, PyObject *args)
242*ef5ccd6cSJohn Marino {
243*ef5ccd6cSJohn Marino struct symbol *symbol = NULL;
244*ef5ccd6cSJohn Marino struct frame_info *frame_info = NULL;
245*ef5ccd6cSJohn Marino PyObject *frame_obj = NULL;
246*ef5ccd6cSJohn Marino struct value *value = NULL;
247*ef5ccd6cSJohn Marino volatile struct gdb_exception except;
248*ef5ccd6cSJohn Marino
249*ef5ccd6cSJohn Marino if (!PyArg_ParseTuple (args, "|O", &frame_obj))
250*ef5ccd6cSJohn Marino return NULL;
251*ef5ccd6cSJohn Marino
252*ef5ccd6cSJohn Marino if (frame_obj != NULL && !PyObject_TypeCheck (frame_obj, &frame_object_type))
253*ef5ccd6cSJohn Marino {
254*ef5ccd6cSJohn Marino PyErr_SetString (PyExc_TypeError, "argument is not a frame");
255*ef5ccd6cSJohn Marino return NULL;
256*ef5ccd6cSJohn Marino }
257*ef5ccd6cSJohn Marino
258*ef5ccd6cSJohn Marino SYMPY_REQUIRE_VALID (self, symbol);
259*ef5ccd6cSJohn Marino if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
260*ef5ccd6cSJohn Marino {
261*ef5ccd6cSJohn Marino PyErr_SetString (PyExc_TypeError, "cannot get the value of a typedef");
262*ef5ccd6cSJohn Marino return NULL;
263*ef5ccd6cSJohn Marino }
264*ef5ccd6cSJohn Marino
265*ef5ccd6cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
266*ef5ccd6cSJohn Marino {
267*ef5ccd6cSJohn Marino if (frame_obj != NULL)
268*ef5ccd6cSJohn Marino {
269*ef5ccd6cSJohn Marino frame_info = frame_object_to_frame_info (frame_obj);
270*ef5ccd6cSJohn Marino if (frame_info == NULL)
271*ef5ccd6cSJohn Marino error (_("invalid frame"));
272*ef5ccd6cSJohn Marino }
273*ef5ccd6cSJohn Marino
274*ef5ccd6cSJohn Marino if (symbol_read_needs_frame (symbol) && frame_info == NULL)
275*ef5ccd6cSJohn Marino error (_("symbol requires a frame to compute its value"));
276*ef5ccd6cSJohn Marino
277*ef5ccd6cSJohn Marino value = read_var_value (symbol, frame_info);
278*ef5ccd6cSJohn Marino }
279*ef5ccd6cSJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
280*ef5ccd6cSJohn Marino
281*ef5ccd6cSJohn Marino return value_to_value_object (value);
282*ef5ccd6cSJohn Marino }
283*ef5ccd6cSJohn Marino
284c50c785cSJohn Marino /* Given a symbol, and a symbol_object that has previously been
285c50c785cSJohn Marino allocated and initialized, populate the symbol_object with the
286c50c785cSJohn Marino struct symbol data. Also, register the symbol_object life-cycle
287c50c785cSJohn Marino with the life-cycle of the object file associated with this
288c50c785cSJohn Marino symbol, if needed. */
289c50c785cSJohn Marino static void
set_symbol(symbol_object * obj,struct symbol * symbol)290c50c785cSJohn Marino set_symbol (symbol_object *obj, struct symbol *symbol)
291c50c785cSJohn Marino {
292c50c785cSJohn Marino obj->symbol = symbol;
293c50c785cSJohn Marino obj->prev = NULL;
294c50c785cSJohn Marino if (SYMBOL_SYMTAB (symbol))
295c50c785cSJohn Marino {
296c50c785cSJohn Marino obj->next = objfile_data (SYMBOL_SYMTAB (symbol)->objfile,
297c50c785cSJohn Marino sympy_objfile_data_key);
298c50c785cSJohn Marino
299c50c785cSJohn Marino if (obj->next)
300c50c785cSJohn Marino obj->next->prev = obj;
301c50c785cSJohn Marino set_objfile_data (SYMBOL_SYMTAB (symbol)->objfile,
302c50c785cSJohn Marino sympy_objfile_data_key, obj);
303c50c785cSJohn Marino }
304c50c785cSJohn Marino else
305c50c785cSJohn Marino obj->next = NULL;
306c50c785cSJohn Marino }
307c50c785cSJohn Marino
308c50c785cSJohn Marino /* Create a new symbol object (gdb.Symbol) that encapsulates the struct
309c50c785cSJohn Marino symbol object from GDB. */
310c50c785cSJohn Marino PyObject *
symbol_to_symbol_object(struct symbol * sym)311c50c785cSJohn Marino symbol_to_symbol_object (struct symbol *sym)
312c50c785cSJohn Marino {
313c50c785cSJohn Marino symbol_object *sym_obj;
314c50c785cSJohn Marino
315c50c785cSJohn Marino sym_obj = PyObject_New (symbol_object, &symbol_object_type);
316c50c785cSJohn Marino if (sym_obj)
317c50c785cSJohn Marino set_symbol (sym_obj, sym);
318c50c785cSJohn Marino
319c50c785cSJohn Marino return (PyObject *) sym_obj;
320c50c785cSJohn Marino }
321c50c785cSJohn Marino
322c50c785cSJohn Marino /* Return the symbol that is wrapped by this symbol object. */
323c50c785cSJohn Marino struct symbol *
symbol_object_to_symbol(PyObject * obj)324c50c785cSJohn Marino symbol_object_to_symbol (PyObject *obj)
325c50c785cSJohn Marino {
326c50c785cSJohn Marino if (! PyObject_TypeCheck (obj, &symbol_object_type))
327c50c785cSJohn Marino return NULL;
328c50c785cSJohn Marino return ((symbol_object *) obj)->symbol;
329c50c785cSJohn Marino }
330c50c785cSJohn Marino
331c50c785cSJohn Marino static void
sympy_dealloc(PyObject * obj)332c50c785cSJohn Marino sympy_dealloc (PyObject *obj)
333c50c785cSJohn Marino {
334c50c785cSJohn Marino symbol_object *sym_obj = (symbol_object *) obj;
335c50c785cSJohn Marino
336c50c785cSJohn Marino if (sym_obj->prev)
337c50c785cSJohn Marino sym_obj->prev->next = sym_obj->next;
338*ef5ccd6cSJohn Marino else if (sym_obj->symbol && SYMBOL_SYMTAB (sym_obj->symbol))
339c50c785cSJohn Marino {
340c50c785cSJohn Marino set_objfile_data (SYMBOL_SYMTAB (sym_obj->symbol)->objfile,
341c50c785cSJohn Marino sympy_objfile_data_key, sym_obj->next);
342c50c785cSJohn Marino }
343c50c785cSJohn Marino if (sym_obj->next)
344c50c785cSJohn Marino sym_obj->next->prev = sym_obj->prev;
345c50c785cSJohn Marino sym_obj->symbol = NULL;
346c50c785cSJohn Marino }
347c50c785cSJohn Marino
348c50c785cSJohn Marino /* Implementation of
349c50c785cSJohn Marino gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)
350c50c785cSJohn Marino A tuple with 2 elements is always returned. The first is the symbol
351c50c785cSJohn Marino object or None, the second is a boolean with the value of
352c50c785cSJohn Marino is_a_field_of_this (see comment in lookup_symbol_in_language). */
353c50c785cSJohn Marino
354c50c785cSJohn Marino PyObject *
gdbpy_lookup_symbol(PyObject * self,PyObject * args,PyObject * kw)355c50c785cSJohn Marino gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
356c50c785cSJohn Marino {
357*ef5ccd6cSJohn Marino int domain = VAR_DOMAIN;
358*ef5ccd6cSJohn Marino struct field_of_this_result is_a_field_of_this;
359c50c785cSJohn Marino const char *name;
360c50c785cSJohn Marino static char *keywords[] = { "name", "block", "domain", NULL };
361a45ae5f8SJohn Marino struct symbol *symbol = NULL;
362c50c785cSJohn Marino PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj;
363a45ae5f8SJohn Marino const struct block *block = NULL;
364a45ae5f8SJohn Marino volatile struct gdb_exception except;
365c50c785cSJohn Marino
366c50c785cSJohn Marino if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
367c50c785cSJohn Marino &block_object_type, &block_obj, &domain))
368c50c785cSJohn Marino return NULL;
369c50c785cSJohn Marino
370c50c785cSJohn Marino if (block_obj)
371c50c785cSJohn Marino block = block_object_to_block (block_obj);
372c50c785cSJohn Marino else
373c50c785cSJohn Marino {
374c50c785cSJohn Marino struct frame_info *selected_frame;
375c50c785cSJohn Marino volatile struct gdb_exception except;
376c50c785cSJohn Marino
377c50c785cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
378c50c785cSJohn Marino {
379c50c785cSJohn Marino selected_frame = get_selected_frame (_("No frame selected."));
380c50c785cSJohn Marino block = get_frame_block (selected_frame, NULL);
381c50c785cSJohn Marino }
382c50c785cSJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
383c50c785cSJohn Marino }
384c50c785cSJohn Marino
385a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
386a45ae5f8SJohn Marino {
387c50c785cSJohn Marino symbol = lookup_symbol (name, block, domain, &is_a_field_of_this);
388a45ae5f8SJohn Marino }
389a45ae5f8SJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
390c50c785cSJohn Marino
391c50c785cSJohn Marino ret_tuple = PyTuple_New (2);
392c50c785cSJohn Marino if (!ret_tuple)
393c50c785cSJohn Marino return NULL;
394c50c785cSJohn Marino
395c50c785cSJohn Marino if (symbol)
396c50c785cSJohn Marino {
397c50c785cSJohn Marino sym_obj = symbol_to_symbol_object (symbol);
398c50c785cSJohn Marino if (!sym_obj)
399c50c785cSJohn Marino {
400c50c785cSJohn Marino Py_DECREF (ret_tuple);
401c50c785cSJohn Marino return NULL;
402c50c785cSJohn Marino }
403c50c785cSJohn Marino }
404c50c785cSJohn Marino else
405c50c785cSJohn Marino {
406c50c785cSJohn Marino sym_obj = Py_None;
407c50c785cSJohn Marino Py_INCREF (Py_None);
408c50c785cSJohn Marino }
409c50c785cSJohn Marino PyTuple_SET_ITEM (ret_tuple, 0, sym_obj);
410c50c785cSJohn Marino
411*ef5ccd6cSJohn Marino bool_obj = (is_a_field_of_this.type != NULL) ? Py_True : Py_False;
412c50c785cSJohn Marino Py_INCREF (bool_obj);
413c50c785cSJohn Marino PyTuple_SET_ITEM (ret_tuple, 1, bool_obj);
414c50c785cSJohn Marino
415c50c785cSJohn Marino return ret_tuple;
416c50c785cSJohn Marino }
417c50c785cSJohn Marino
418c50c785cSJohn Marino /* Implementation of
419c50c785cSJohn Marino gdb.lookup_global_symbol (name [, domain]) -> symbol or None. */
420c50c785cSJohn Marino
421c50c785cSJohn Marino PyObject *
gdbpy_lookup_global_symbol(PyObject * self,PyObject * args,PyObject * kw)422c50c785cSJohn Marino gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
423c50c785cSJohn Marino {
424c50c785cSJohn Marino int domain = VAR_DOMAIN;
425c50c785cSJohn Marino const char *name;
426c50c785cSJohn Marino static char *keywords[] = { "name", "domain", NULL };
427a45ae5f8SJohn Marino struct symbol *symbol = NULL;
428c50c785cSJohn Marino PyObject *sym_obj;
429a45ae5f8SJohn Marino volatile struct gdb_exception except;
430c50c785cSJohn Marino
431c50c785cSJohn Marino if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
432c50c785cSJohn Marino &domain))
433c50c785cSJohn Marino return NULL;
434c50c785cSJohn Marino
435a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
436a45ae5f8SJohn Marino {
437c50c785cSJohn Marino symbol = lookup_symbol_global (name, NULL, domain);
438a45ae5f8SJohn Marino }
439a45ae5f8SJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
440c50c785cSJohn Marino
441c50c785cSJohn Marino if (symbol)
442c50c785cSJohn Marino {
443c50c785cSJohn Marino sym_obj = symbol_to_symbol_object (symbol);
444c50c785cSJohn Marino if (!sym_obj)
445c50c785cSJohn Marino return NULL;
446c50c785cSJohn Marino }
447c50c785cSJohn Marino else
448c50c785cSJohn Marino {
449c50c785cSJohn Marino sym_obj = Py_None;
450c50c785cSJohn Marino Py_INCREF (Py_None);
451c50c785cSJohn Marino }
452c50c785cSJohn Marino
453c50c785cSJohn Marino return sym_obj;
454c50c785cSJohn Marino }
455c50c785cSJohn Marino
456c50c785cSJohn Marino /* This function is called when an objfile is about to be freed.
457c50c785cSJohn Marino Invalidate the symbol as further actions on the symbol would result
458c50c785cSJohn Marino in bad data. All access to obj->symbol should be gated by
459c50c785cSJohn Marino SYMPY_REQUIRE_VALID which will raise an exception on invalid
460c50c785cSJohn Marino symbols. */
461c50c785cSJohn Marino static void
del_objfile_symbols(struct objfile * objfile,void * datum)462c50c785cSJohn Marino del_objfile_symbols (struct objfile *objfile, void *datum)
463c50c785cSJohn Marino {
464c50c785cSJohn Marino symbol_object *obj = datum;
465c50c785cSJohn Marino while (obj)
466c50c785cSJohn Marino {
467c50c785cSJohn Marino symbol_object *next = obj->next;
468c50c785cSJohn Marino
469c50c785cSJohn Marino obj->symbol = NULL;
470c50c785cSJohn Marino obj->next = NULL;
471c50c785cSJohn Marino obj->prev = NULL;
472c50c785cSJohn Marino
473c50c785cSJohn Marino obj = next;
474c50c785cSJohn Marino }
475c50c785cSJohn Marino }
476c50c785cSJohn Marino
477c50c785cSJohn Marino void
gdbpy_initialize_symbols(void)478c50c785cSJohn Marino gdbpy_initialize_symbols (void)
479c50c785cSJohn Marino {
480c50c785cSJohn Marino if (PyType_Ready (&symbol_object_type) < 0)
481c50c785cSJohn Marino return;
482c50c785cSJohn Marino
483c50c785cSJohn Marino /* Register an objfile "free" callback so we can properly
484c50c785cSJohn Marino invalidate symbol when an object file that is about to be
485c50c785cSJohn Marino deleted. */
486c50c785cSJohn Marino sympy_objfile_data_key
487c50c785cSJohn Marino = register_objfile_data_with_cleanup (NULL, del_objfile_symbols);
488c50c785cSJohn Marino
489c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF);
490c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST", LOC_CONST);
491c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC", LOC_STATIC);
492c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER", LOC_REGISTER);
493c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG", LOC_ARG);
494c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG", LOC_REF_ARG);
495c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL", LOC_LOCAL);
496c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF", LOC_TYPEDEF);
497c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL", LOC_LABEL);
498c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK", LOC_BLOCK);
499c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES",
500c50c785cSJohn Marino LOC_CONST_BYTES);
501c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED",
502c50c785cSJohn Marino LOC_UNRESOLVED);
503c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT",
504c50c785cSJohn Marino LOC_OPTIMIZED_OUT);
505c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED", LOC_COMPUTED);
506c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR",
507c50c785cSJohn Marino LOC_REGPARM_ADDR);
508c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN", UNDEF_DOMAIN);
509c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN", VAR_DOMAIN);
510c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN", STRUCT_DOMAIN);
511c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN", LABEL_DOMAIN);
512c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN",
513c50c785cSJohn Marino VARIABLES_DOMAIN);
514c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN",
515c50c785cSJohn Marino FUNCTIONS_DOMAIN);
516c50c785cSJohn Marino PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN", TYPES_DOMAIN);
517c50c785cSJohn Marino
518c50c785cSJohn Marino Py_INCREF (&symbol_object_type);
519c50c785cSJohn Marino PyModule_AddObject (gdb_module, "Symbol", (PyObject *) &symbol_object_type);
520c50c785cSJohn Marino }
521c50c785cSJohn Marino
522c50c785cSJohn Marino
523c50c785cSJohn Marino
524c50c785cSJohn Marino static PyGetSetDef symbol_object_getset[] = {
525a45ae5f8SJohn Marino { "type", sympy_get_type, NULL,
526a45ae5f8SJohn Marino "Type of the symbol.", NULL },
527c50c785cSJohn Marino { "symtab", sympy_get_symtab, NULL,
528c50c785cSJohn Marino "Symbol table in which the symbol appears.", NULL },
529c50c785cSJohn Marino { "name", sympy_get_name, NULL,
530c50c785cSJohn Marino "Name of the symbol, as it appears in the source code.", NULL },
531c50c785cSJohn Marino { "linkage_name", sympy_get_linkage_name, NULL,
532c50c785cSJohn Marino "Name of the symbol, as used by the linker (i.e., may be mangled).",
533c50c785cSJohn Marino NULL },
534c50c785cSJohn Marino { "print_name", sympy_get_print_name, NULL,
535c50c785cSJohn Marino "Name of the symbol in a form suitable for output.\n\
536c50c785cSJohn Marino This is either name or linkage_name, depending on whether the user asked GDB\n\
537c50c785cSJohn Marino to display demangled or mangled names.", NULL },
538c50c785cSJohn Marino { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." },
539c50c785cSJohn Marino { "is_argument", sympy_is_argument, NULL,
540c50c785cSJohn Marino "True if the symbol is an argument of a function." },
541c50c785cSJohn Marino { "is_constant", sympy_is_constant, NULL,
542c50c785cSJohn Marino "True if the symbol is a constant." },
543c50c785cSJohn Marino { "is_function", sympy_is_function, NULL,
544c50c785cSJohn Marino "True if the symbol is a function or method." },
545c50c785cSJohn Marino { "is_variable", sympy_is_variable, NULL,
546c50c785cSJohn Marino "True if the symbol is a variable." },
547*ef5ccd6cSJohn Marino { "needs_frame", sympy_needs_frame, NULL,
548*ef5ccd6cSJohn Marino "True if the symbol requires a frame for evaluation." },
549*ef5ccd6cSJohn Marino { "line", sympy_line, NULL,
550*ef5ccd6cSJohn Marino "The source line number at which the symbol was defined." },
551c50c785cSJohn Marino { NULL } /* Sentinel */
552c50c785cSJohn Marino };
553c50c785cSJohn Marino
554c50c785cSJohn Marino static PyMethodDef symbol_object_methods[] = {
555c50c785cSJohn Marino { "is_valid", sympy_is_valid, METH_NOARGS,
556c50c785cSJohn Marino "is_valid () -> Boolean.\n\
557c50c785cSJohn Marino Return true if this symbol is valid, false if not." },
558*ef5ccd6cSJohn Marino { "value", sympy_value, METH_VARARGS,
559*ef5ccd6cSJohn Marino "value ([frame]) -> gdb.Value\n\
560*ef5ccd6cSJohn Marino Return the value of the symbol." },
561c50c785cSJohn Marino {NULL} /* Sentinel */
562c50c785cSJohn Marino };
563c50c785cSJohn Marino
564c50c785cSJohn Marino PyTypeObject symbol_object_type = {
565*ef5ccd6cSJohn Marino PyVarObject_HEAD_INIT (NULL, 0)
566c50c785cSJohn Marino "gdb.Symbol", /*tp_name*/
567c50c785cSJohn Marino sizeof (symbol_object), /*tp_basicsize*/
568c50c785cSJohn Marino 0, /*tp_itemsize*/
569c50c785cSJohn Marino sympy_dealloc, /*tp_dealloc*/
570c50c785cSJohn Marino 0, /*tp_print*/
571c50c785cSJohn Marino 0, /*tp_getattr*/
572c50c785cSJohn Marino 0, /*tp_setattr*/
573c50c785cSJohn Marino 0, /*tp_compare*/
574c50c785cSJohn Marino 0, /*tp_repr*/
575c50c785cSJohn Marino 0, /*tp_as_number*/
576c50c785cSJohn Marino 0, /*tp_as_sequence*/
577c50c785cSJohn Marino 0, /*tp_as_mapping*/
578c50c785cSJohn Marino 0, /*tp_hash */
579c50c785cSJohn Marino 0, /*tp_call*/
580c50c785cSJohn Marino sympy_str, /*tp_str*/
581c50c785cSJohn Marino 0, /*tp_getattro*/
582c50c785cSJohn Marino 0, /*tp_setattro*/
583c50c785cSJohn Marino 0, /*tp_as_buffer*/
584c50c785cSJohn Marino Py_TPFLAGS_DEFAULT, /*tp_flags*/
585c50c785cSJohn Marino "GDB symbol object", /*tp_doc */
586c50c785cSJohn Marino 0, /*tp_traverse */
587c50c785cSJohn Marino 0, /*tp_clear */
588c50c785cSJohn Marino 0, /*tp_richcompare */
589c50c785cSJohn Marino 0, /*tp_weaklistoffset */
590c50c785cSJohn Marino 0, /*tp_iter */
591c50c785cSJohn Marino 0, /*tp_iternext */
592c50c785cSJohn Marino symbol_object_methods, /*tp_methods */
593c50c785cSJohn Marino 0, /*tp_members */
594c50c785cSJohn Marino symbol_object_getset /*tp_getset */
595c50c785cSJohn Marino };
596