System notice: In light of the Debian OpenSSL security issue we've regenerated the server keys. See this thread for instructions and the new key fingerprints.

Commit 5628b0ae93f8d169ec0439723ed92e2a97137fd2

Expose symtab to Python.

Commit diff

gdb/Makefile.in

 
267267 python-cmd.o \
268268 python-frame.o \
269269 python-hooks.o \
270 python-symtab.o \
270271 python-symbol.o \
271272 python-value.o
272273SUBDIR_PYTHON_SRCS = \
277277 python/cmd.c \
278278 python/frame.c \
279279 python/hooks.c \
280 python/symtab.c \
280281 python/symbol.c \
281282 python/value.c
282283SUBDIR_PYTHON_DEPS =
34543454 $(python_internal_h)
34553455 $(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) \
34563456 $(srcdir)/python/symbol.c -o python-symbol.o
3457python-symtab.o: $(srcdir)/python/symtab.c $(defs_h) $(charset_h) $(source_h) \
3458 $(symtab_h) $(python_h) $(python_internal_h)
3459 $(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) \
3460 $(srcdir)/python/symtab.c -o python-symtab.o
34573461python-value.o: $(srcdir)/python/value.c $(defs_h) $(exceptions_h) \
34583462 $(python_internal_h) $(value_h)
34593463 $(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) \
toggle raw diff

gdb/python/frame.c

 
5656static PyObject *frapy_get_address_in_block (PyObject *self, PyObject *args);
5757static PyObject *frapy_get_prev (PyObject *self, PyObject *args);
5858static PyObject *frapy_get_next (PyObject *self, PyObject *args);
59static PyObject *frapy_find_sal (PyObject *self, PyObject *args);
60static PyObject *frapy_read_var_value (PyObject *self, PyObject *args);
5961
6062#define FRAPY_REQUIRE_VALID(frame_obj, frame) \
6163 do { \
8686 { "get_prev", frapy_get_prev, METH_NOARGS,
8787 "Return the previous (outer) frame." },
8888 { "get_next", frapy_get_next, METH_NOARGS, "Return the next (inner) frame." },
89 { "find_sal", frapy_find_sal, METH_NOARGS,
90 "Return the frame's symtab and line." },
91 { "read_var_value", frapy_read_var_value, METH_VARARGS,
92 "Return the value of the variable in this frame." },
8993 {NULL} /* Sentinel */
9094};
9195
409409 return next_obj;
410410}
411411
412static PyObject *
413frapy_find_sal (PyObject *self, PyObject *args)
414{
415 struct frame_info *frame;
416 struct symtab_and_line sal;
417 volatile struct gdb_exception except;
418 PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */
419
420 TRY_CATCH (except, RETURN_MASK_ALL)
421 {
422 FRAPY_REQUIRE_VALID ((frame_object *) self, frame);
423
424 find_frame_sal (frame, &sal);
425 sal_obj = symtab_and_line_to_sal_object (sal);
426 }
427 GDB_PY_HANDLE_EXCEPTION (except);
428
429 return sal_obj;
430}
431
432static PyObject *
433frapy_read_var_value (PyObject *self, PyObject *args)
434{
435 struct frame_info *frame;
436 PyObject *sym_obj;
437 struct symbol *var;
438 struct value *val = NULL;
439 volatile struct gdb_exception except;
440
441 if (!PyArg_ParseTuple (args, "O!", &symbol_object_type, &sym_obj))
442 return NULL;
443
444 var = symbol_object_to_symbol (sym_obj);
445
446 TRY_CATCH (except, RETURN_MASK_ALL)
447 {
448 FRAPY_REQUIRE_VALID ((frame_object *) self, frame);
449
450 val = read_var_value (var, frame);
451 }
452 GDB_PY_HANDLE_EXCEPTION (except);
453
454 if (val)
455 return value_to_value_object (val);
456
457 Py_RETURN_NONE;
458}
459
412460PyObject *
413461gdbpy_get_frames (PyObject *self, PyObject *args)
414462{
toggle raw diff

gdb/python/python-internal.h

 
3737PyObject *gdbpy_get_frames (PyObject *, PyObject *);
3838PyObject *gdbpy_get_current_frame (PyObject *, PyObject *);
3939PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
40PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args);
4041PyObject *gdbpy_get_selected_frame (PyObject *self, PyObject *args);
4142
4243PyObject *variable_to_python (struct cmd_list_element *);
44PyObject *symtab_and_line_to_sal_object (struct symtab_and_line sal);
45PyObject *symtab_to_symtab_object (struct symtab *symtab);
4346PyObject *symbol_to_symbol_object (struct symbol *sym);
4447PyObject *block_to_block_object (struct block *block);
4548PyObject *value_to_value_object (struct value *v);
5858void gdbpy_initialize_hooks (void);
5959void gdbpy_initialize_breakpoints (void);
6060void gdbpy_initialize_frames (void);
61void gdbpy_initialize_symtabs (void);
6162void gdbpy_initialize_commands (void);
6263void gdbpy_initialize_symbols (void);
6364void gdbpy_initialize_blocks (void);
toggle raw diff

gdb/python/python.c

 
2727#include "solib.h"
2828#include "exceptions.h"
2929#include "python-internal.h"
30#include "linespec.h"
31#include "symtab.h"
32#include "source.h"
3033#include "version.h"
3134
3235#include <ctype.h>
3939static PyObject *get_show_variable (PyObject *, PyObject *);
4040static PyObject *execute_gdb_command (PyObject *, PyObject *);
4141static PyObject *gdbpy_solib_address (PyObject *, PyObject *);
42static PyObject *gdbpy_decode_line (PyObject *, PyObject *);
4243static PyObject *gdbpy_find_pc_function (PyObject *, PyObject *);
4344
4445
7272 { "frame_stop_reason_string", gdbpy_frame_stop_reason_string,
7373 METH_VARARGS, "Return a string explaining unwind stop reason" },
7474
75 { "lookup_symbol", gdbpy_lookup_symbol, METH_VARARGS,
76 "Return the symbol corresponding to the given name, or None." },
7577 { "solib_address", gdbpy_solib_address, METH_VARARGS,
7678 "Return shared library holding a given address, or None." },
7779
7880 { "find_pc_function", gdbpy_find_pc_function, METH_VARARGS,
7981 "Return the function containing the given pc value, or None." },
8082
83 { "decode_line", gdbpy_decode_line, METH_VARARGS,
84 "Decode a string argument the way that 'break' or 'edit' does.\n\
85Return a tuple holding the file name (or None) and line number (or None).\n\
86Note: may later change to return an object." },
87
8188 {NULL, NULL, 0, NULL}
8289 };
8390
100100 gdbpy_initialize_values ();
101101 gdbpy_initialize_breakpoints ();
102102 gdbpy_initialize_frames ();
103 gdbpy_initialize_symtabs ();
103104 gdbpy_initialize_commands ();
104105 gdbpy_initialize_symbols ();
105106 gdbpy_initialize_blocks ();
400400 Py_RETURN_NONE;
401401}
402402
403PyObject *
404gdbpy_decode_line (PyObject *self, PyObject *args)
405{
406 struct symtabs_and_lines sals = { NULL, 0 }; /* Initialize to appease gcc. */
407 struct symtab_and_line sal;
408 char *arg = NULL;
409 int free_sals = 0, i;
410 PyObject *result = NULL;
411 volatile struct gdb_exception except;
412
413 if (! PyArg_ParseTuple (args, "|s", &arg))
414 return NULL;
415
416 TRY_CATCH (except, RETURN_MASK_ALL)
417 {
418 if (arg)
419 {
420 char *copy;
421
422 arg = strdup (arg);
423 copy = arg;
424
425 sals = decode_line_1 (&copy, 0, 0, 0, 0, 0);
426 free_sals = 1;
427 }
428 else
429 {
430 set_default_source_symtab_and_line ();
431 sal = get_current_source_symtab_and_line ();
432 sals.sals = &sal;
433 sals.nelts = 1;
434 }
435 }
436 if (arg)
437 xfree (arg);
438
439 if (except.reason < 0)
440 {
441 if (free_sals)
442 xfree (sals.sals);
443 /* We know this will always throw. */
444 GDB_PY_HANDLE_EXCEPTION (except);
445 }
446
447 if (sals.nelts)
448 {
449 result = PyTuple_New (sals.nelts);
450 for (i = 0; i < sals.nelts; ++i)
451 {
452 PyObject *obj;
453 char *str;
454
455 obj = symtab_and_line_to_sal_object (sals.sals[i]);
456 if (! obj)
457 {
458 Py_DECREF (result);
459 result = NULL;
460 break;
461 }
462
463 PyTuple_SetItem (result, i, obj);
464 }
465 }
466
467 if (free_sals)
468 xfree (sals.sals);
469
470 if (result)
471 return result;
472 Py_RETURN_NONE;
473}
474
403475
404476
405477void
toggle raw diff

gdb/python/symbol.c

 
2828
2929static PyObject *sympy_str (PyObject *self);
3030static PyObject *sympy_get_value (PyObject *self, PyObject *args);
31static PyObject *sympy_get_symtab (PyObject *self, PyObject *args);
3132static PyObject *sympy_get_natural_name (PyObject *self, PyObject *args);
3233static PyObject *sympy_get_linkage_name (PyObject *self, PyObject *args);
3334static PyObject *sympy_get_print_name (PyObject *self, PyObject *args);
3737static PyMethodDef symbol_object_methods[] = {
3838 { "get_value", sympy_get_value, METH_NOARGS,
3939 "Return the value of the symbol." },
40 { "get_symtab", sympy_get_symtab, METH_NOARGS,
41 "Return the value of the symbol." },
4042 { "get_natural_name", sympy_get_natural_name, METH_NOARGS,
4143 "Return the \"natural\" name of the symbol." },
4244 { "get_linkage_name", sympy_get_linkage_name, METH_NOARGS,
118118}
119119
120120static PyObject *
121sympy_get_symtab (PyObject *self, PyObject *args)
122{
123 symbol_object *self_sym = (symbol_object *) self;
124
125 return symtab_to_symtab_object (SYMBOL_SYMTAB (self_sym->symbol));
126}
127
128static PyObject *
121129sympy_get_natural_name (PyObject *self, PyObject *args)
122130{
123131 symbol_object *self_sym = (symbol_object *) self;
180180 return ((symbol_object *) obj)->symbol;
181181}
182182
183/* This function has less arguments than its C counterpart, to simplify the
184 Python interface: name, block and domain. The other two arguments are always
185 assumed to be set, and a tuple with 3 elements is always returned. The first
186 is the symbol object or None, the second is a boolean with the value of
187 is_a_field_of_this, and the third is the symbol object or None. */
188PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args)
189{
190 int domain, is_a_field_of_this = 0;
191 const char *name;
192 struct symbol *symbol;
193 struct symtab *symtab;
194 PyObject *block_obj, *ret_tuple, *sym_obj, *symtab_obj, *bool_obj;
195
196 PyArg_ParseTuple (args, "sO!i", &name, &block_object_type, &block_obj,
197 &domain);
198
199 symbol = lookup_symbol (name, block_object_to_block (block_obj), domain,
200 &is_a_field_of_this, &symtab);
201
202 ret_tuple = PyTuple_New (3);
203 if (!ret_tuple)
204 {
205 PyErr_SetString (PyExc_MemoryError, "Could not allocate tuple object.");
206 return NULL;
207 }
208
209 if (symbol)
210 {
211 sym_obj = symbol_to_symbol_object (symbol);
212 if (!sym_obj)
213 {
214 Py_DECREF (ret_tuple);
215 return NULL;
216 }
217 }
218 else
219 {
220 sym_obj = Py_None;
221 Py_INCREF (Py_None);
222 }
223 PyTuple_SET_ITEM (ret_tuple, 0, sym_obj);
224
225 bool_obj = is_a_field_of_this? Py_True : Py_False;
226 Py_INCREF (bool_obj);
227 PyTuple_SET_ITEM (ret_tuple, 1, bool_obj);
228
229 if (symtab)
230 {
231 symtab_obj = symtab_to_symtab_object (symtab);
232 if (!symtab_obj)
233 {
234 /* I *think* this will take care of decref'ing sym_obj and
235 bool_obj. */
236 Py_DECREF (ret_tuple);
237 return NULL;
238 }
239 }
240 else
241 {
242 symtab_obj = Py_None;
243 Py_INCREF (Py_None);
244 }
245 PyTuple_SET_ITEM (ret_tuple, 2, symtab_obj);
246
247 return ret_tuple;
248}
249
183250void
184251gdbpy_initialize_symbols (void)
185252{
toggle raw diff

gdb/python/symtab.c

 
1/* Python interface to symbol tables.
2
3 Copyright (C) 2008 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21#include "charset.h"
22#include "symtab.h"
23#include "source.h"
24#include "python-internal.h"
25
26typedef struct {
27 PyObject_HEAD
28 struct symtab *symtab;
29} symtab_object;
30
31static PyObject *stpy_str (PyObject *self);
32static PyObject *stpy_filename (PyObject *self, PyObject *args);
33static PyObject *stpy_to_fullname (PyObject *self, PyObject *args);
34
35static PyMethodDef symtab_object_methods[] = {
36 { "get_filename", stpy_filename, METH_NOARGS,
37 "Return the symtab's source filename." },
38 { "to_fullname", stpy_to_fullname, METH_NOARGS,
39 "Return the symtab's full source filename." },
40 {NULL} /* Sentinel */
41};
42
43static PyTypeObject symtab_object_type = {
44 PyObject_HEAD_INIT (NULL)
45 0, /*ob_size*/
46 "gdb.Symtab", /*tp_name*/
47 sizeof (symtab_object), /*tp_basicsize*/
48 0, /*tp_itemsize*/
49 0, /*tp_dealloc*/
50 0, /*tp_print*/
51 0, /*tp_getattr*/
52 0, /*tp_setattr*/
53 0, /*tp_compare*/
54 0, /*tp_repr*/
55 0, /*tp_as_number*/
56 0, /*tp_as_sequence*/
57 0, /*tp_as_mapping*/
58 0, /*tp_hash */
59 0, /*tp_call*/
60 stpy_str, /*tp_str*/
61 0, /*tp_getattro*/
62 0, /*tp_setattro*/
63 0, /*tp_as_buffer*/
64 Py_TPFLAGS_DEFAULT, /*tp_flags*/
65 "GDB symtab object", /* tp_doc */
66 0, /* tp_traverse */
67 0, /* tp_clear */
68 0, /* tp_richcompare */
69 0, /* tp_weaklistoffset */
70 0, /* tp_iter */
71 0, /* tp_iternext */
72 symtab_object_methods /* tp_methods */
73};
74
75typedef struct {
76 PyObject_HEAD
77 symtab_object *symtab;
78 struct symtab_and_line *sal;
79} sal_object;
80
81static void salpy_dealloc (PyObject *self);
82static int salpy_setsymtab (PyObject *self, PyObject *value, void *closure);
83static PyObject *salpy_str (PyObject *self);
84static PyObject *salpy_getsymtab (PyObject *self, void *closure);
85static PyObject *salpy_pc (PyObject *self, PyObject *args);
86static PyObject *salpy_line (PyObject *self, PyObject *args);
87
88static PyGetSetDef sal_object_getseters[] = {
89 { "symtab", salpy_getsymtab, salpy_setsymtab, "Symtab object.", NULL },
90 {NULL} /* Sentinel */
91};
92
93static PyMethodDef sal_object_methods[] = {
94 { "get_pc", salpy_pc, METH_NOARGS,
95 "Return the symtab_and_line's pc." },
96 { "get_line", salpy_line, METH_NOARGS,
97 "Return the symtab_and_line's line." },
98 {NULL} /* Sentinel */
99};
100
101static PyTypeObject sal_object_type = {
102 PyObject_HEAD_INIT (NULL)
103 0, /*ob_size*/
104 "gdb.Symtab_and_line", /*tp_name*/
105 sizeof (sal_object), /*tp_basicsize*/
106 0, /*tp_itemsize*/
107 salpy_dealloc, /*tp_dealloc*/
108 0, /*tp_print*/
109 0, /*tp_getattr*/
110 0, /*tp_setattr*/
111 0, /*tp_compare*/
112 0, /*tp_repr*/
113 0, /*tp_as_number*/
114 0, /*tp_as_sequence*/
115 0, /*tp_as_mapping*/
116 0, /*tp_hash */
117 0, /*tp_call*/
118 salpy_str, /*tp_str*/
119 0, /*tp_getattro*/
120 0, /*tp_setattro*/
121 0, /*tp_as_buffer*/
122 Py_TPFLAGS_DEFAULT, /*tp_flags*/
123 "GDB symtab_and_line object", /* tp_doc */
124 0, /* tp_traverse */
125 0, /* tp_clear */
126 0, /* tp_richcompare */
127 0, /* tp_weaklistoffset */
128 0, /* tp_iter */
129 0, /* tp_iternext */
130 sal_object_methods, /* tp_methods */
131 0, /* tp_members */
132 sal_object_getseters /* tp_getset */
133};
134
135
136static PyObject *
137stpy_str (PyObject *self)
138{
139 int ret;
140 char *s;
141 PyObject *result;
142
143 ret = asprintf (&s, "symbol table for %s",
144 ((symtab_object *) self)->symtab->filename);
145 if (ret < 0)
146 Py_RETURN_NONE;
147
148 result = PyString_FromString (s);
149 xfree (s);
150
151 return result;
152}
153
154/* FIXME: maybe this should be an attribute instead of a method? */
155static PyObject *
156stpy_filename (PyObject *self, PyObject *args)
157{
158 symtab_object *self_symtab = (symtab_object *) self;
159 PyObject *str_obj;
160
161 /* FIXME: Can symtab->filename really be NULL? */
162 if (self_symtab->symtab->filename)
163 str_obj = PyString_Decode (self_symtab->symtab->filename,
164 strlen (self_symtab->symtab->filename),
165 host_charset (), NULL /* FIXME */);
166 else
167 {
168 str_obj = Py_None;
169 Py_INCREF (Py_None);
170 }
171
172 return str_obj;
173}
174
175static PyObject *
176stpy_to_fullname (PyObject *self, PyObject *args)
177{
178 char *fullname;
179
180 fullname = symtab_to_fullname (((symtab_object *) self)->symtab);
181 if (fullname)
182 return PyString_Decode (fullname, strlen (fullname), host_charset (),
183 NULL /* FIXME */);
184
185 Py_RETURN_NONE;
186}
187
188static PyObject *
189salpy_str (PyObject *self)
190{
191 int ret;
192 char *s, *filename;
193 sal_object *sal_obj;
194 PyObject *result;
195
196 sal_obj = (sal_object *) self;
197 filename = (sal_obj->symtab == (symtab_object *) Py_None)? "<unknown>" :
198 sal_obj->symtab->symtab->filename;
199 ret = asprintf (&s, "symbol and line for %s, line %d", filename,
200 sal_obj->sal->line);
201 if (ret < 0)
202 Py_RETURN_NONE;
203
204 result = PyString_FromString (s);
205 xfree (s);
206
207 return result;
208}
209
210static PyObject *
211salpy_pc (PyObject *self, PyObject *args)
212{
213 return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->pc);
214}
215
216static PyObject *
217salpy_line (PyObject *self, PyObject *args)
218{
219 return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->line);
220}
221
222static PyObject *
223salpy_getsymtab (PyObject *self, void *closure)
224{
225 sal_object *self_sal = (sal_object *) self;
226
227 Py_INCREF (self_sal->symtab);
228
229 return (PyObject *) self_sal->symtab;
230}
231
232static int
233salpy_setsymtab (PyObject *self, PyObject *value, void *closure)
234{
235 PyErr_SetString (PyExc_TypeError, "The symtab attribute can't be modified.");
236
237 return -1;
238}
239
240static void
241salpy_dealloc (PyObject *self)
242{
243 sal_object *self_sal = (sal_object *) self;
244
245 Py_DECREF (self_sal->symtab);
246 xfree (self_sal->sal);
247 self_sal->ob_type->tp_free (self);
248}
249
250PyObject *
251symtab_and_line_to_sal_object (struct symtab_and_line sal)
252{
253 sal_object *sal_obj;
254 symtab_object *symtab_obj;
255
256 sal_obj = PyObject_New (sal_object, &sal_object_type);
257 if (sal_obj == NULL)
258 {
259 PyErr_SetString (PyExc_MemoryError,
260 "Could not allocate Symtab_and_line object.");
261 return NULL;
262 }
263
264 if (sal.symtab)
265 {
266 symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab);
267 if (symtab_obj == NULL)
268 {
269 Py_DECREF (sal_obj);
270 return NULL;
271 }
272
273 symtab_obj->symtab = sal.symtab;
274 }
275 else
276 {
277 symtab_obj = (symtab_object *) Py_None;
278 Py_INCREF (Py_None);
279 }
280
281 sal_obj->sal = (struct symtab_and_line *)
282 xmalloc (sizeof (struct symtab_and_line));
283 *(sal_obj->sal) = sal;
284 sal_obj->symtab = symtab_obj;
285
286 return (PyObject *) sal_obj;
287}
288
289PyObject *
290symtab_to_symtab_object (struct symtab *symtab)
291{
292 symtab_object *symtab_obj;
293
294 symtab_obj = PyObject_New (symtab_object, &symtab_object_type);
295 if (symtab_obj == NULL)
296 {
297 PyErr_SetString (PyExc_MemoryError,
298 "Could not allocate Symtab object.");
299
300 return NULL;
301 }
302
303 symtab_obj->symtab = symtab;
304
305 return (PyObject *) symtab_obj;
306}
307
308void
309gdbpy_initialize_symtabs (void)
310{
311 symtab_object_type.tp_new = PyType_GenericNew;
312 if (PyType_Ready (&symtab_object_type) < 0)
313 return;
314
315 sal_object_type.tp_new = PyType_GenericNew;
316 if (PyType_Ready (&sal_object_type) < 0)
317 return;
318
319 Py_INCREF (&symtab_object_type);
320 PyModule_AddObject (gdb_module, "Symtab", (PyObject *) &symtab_object_type);
321
322 Py_INCREF (&sal_object_type);
323 PyModule_AddObject (gdb_module, "Symtab_and_line",
324 (PyObject *) &sal_object_type);
325}
toggle raw diff