Index: python/py-objfile.c =================================================================== RCS file: /cvs/src/src/gdb/python/py-objfile.c,v retrieving revision 1.11 diff -c -p -r1.11 py-objfile.c *** python/py-objfile.c 4 Jan 2012 08:17:25 -0000 1.11 --- python/py-objfile.c 2 Apr 2012 06:09:17 -0000 *************** *** 22,27 **** --- 22,28 ---- #include "charset.h" #include "objfiles.h" #include "language.h" + #include "psympriv.h" typedef struct { *************** typedef struct *** 32,45 **** --- 33,172 ---- /* The pretty-printer list of functions. */ PyObject *printers; + + /* The iterator object to iterate over the list of symtabs associated + with the corresponding objfile. */ + PyObject *symtab_iterator; } objfile_object; + typedef struct stpy_node_i + { + PyObject *symtab_object; + struct stpy_node_i *next; + } stpy_node; + + /* The iterator object to iterate over the list of symtabs associated + with an Objfile. */ + + typedef struct + { + PyObject_HEAD + + stpy_node *symtab_list; + stpy_node *current_node; + } stpy_iterator_object; + static PyTypeObject objfile_object_type; + static PyTypeObject stpy_iterator_object_type; static const struct objfile_data *objfpy_objfile_data_key; + /* Free the symtab list in ITER_OBJECT. Decrement the references to + the individual Symtab objects in the list. */ + + static void + stpy_iterator_free_symtab_list (stpy_iterator_object *iter_object) + { + stpy_node *node; + + if (! iter_object || ! iter_object->symtab_list) + return; + + node = iter_object->symtab_list; + while (node) + { + stpy_node *temp = node; + + Py_XDECREF (node->symtab_object); + node = node->next; + + xfree (temp); + } + + iter_object->symtab_list = NULL; + iter_object->current_node = NULL; + } + + /* Return a new stpy_iterator_object given an OBJFILE. The caller holds + the reference to the new object. */ + + static stpy_iterator_object * + new_stpy_iterator (struct objfile *objfile) + { + stpy_iterator_object *iter_object; + struct symtab *symtab; + struct partial_symtab *psymtab; + stpy_node *last_node = NULL; + int first = 1; + int invalid = 0; + + iter_object = PyObject_New (stpy_iterator_object, + &stpy_iterator_object_type); + + if (! iter_object) + return NULL; + + iter_object->symtab_list = NULL; + if (! objfile) + { + /* If the objfile is NULL, return an iter with no elements. */ + iter_object->current_node = NULL; + return iter_object; + } + + /* If the symtabs are not yet read, then read them. */ + ALL_OBJFILE_PSYMTABS (objfile, psymtab) + { + if (psymtab->readin) + continue; + + if (psymtab->read_symtab) + psymtab->read_symtab (psymtab); + } + + ALL_OBJFILE_SYMTABS (objfile, symtab) + { + PyObject *symtab_object; + + symtab_object = symtab_to_symtab_object (symtab); + if (symtab_object) + { + stpy_node *new_node; + + new_node = (stpy_node *) xmalloc (sizeof (stpy_node)); + new_node->symtab_object = symtab_object; + new_node->next = NULL; + if (first) + { + iter_object->symtab_list = new_node; + first = 0; + } + else + { + last_node->next = new_node; + } + + last_node = new_node; + } + else + { + /* Give up if it is not possible to get the symtab_object + for a symtab. */ + invalid = 1; + break; + } + } + + iter_object->current_node = iter_object->symtab_list; + + if (invalid) + stpy_iterator_free_symtab_list (iter_object); + + return iter_object; + } + /* An Objfile method which returns the objfile's file name, or None. */ static PyObject * objfpy_get_filename (PyObject *self, void *closure) *************** objfpy_dealloc (PyObject *o) *** 58,63 **** --- 185,191 ---- objfile_object *self = (objfile_object *) o; Py_XDECREF (self->printers); + Py_XDECREF (self->symtab_iterator); self->ob_type->tp_free ((PyObject *) self); } *************** objfpy_new (PyTypeObject *type, PyObject *** 69,74 **** --- 197,203 ---- if (self) { self->objfile = NULL; + self->symtab_iterator = NULL; self->printers = PyList_New (0); if (!self->printers) *************** objfpy_set_printers (PyObject *o, PyObje *** 118,123 **** --- 247,281 ---- return 0; } + /* Return a sequence of symtab objects associated with the corresponding + objfile. Each element in the sequence is a gdb.Symtab object. */ + + static PyObject * + objfpy_symtabs (PyObject *self, PyObject *args) + { + objfile_object *obj = (objfile_object *) self; + stpy_iterator_object *iter; + + if (! obj->objfile) + return NULL; + + if (obj->symtab_iterator) + { + iter = (stpy_iterator_object *) obj->symtab_iterator; + iter->current_node = iter->symtab_list; + } + else + { + iter = new_stpy_iterator (obj->objfile); + if (! iter) + return NULL; + + obj->symtab_iterator = (PyObject *) iter; + } + + return PySequence_List ((PyObject *) iter); + } + /* Implementation of gdb.Objfile.is_valid (self) -> Boolean. Returns True if this object file still exists in GDB. */ *************** objfile_to_objfile_object (struct objfil *** 164,169 **** --- 322,328 ---- if (object) { object->objfile = objfile; + object->symtab_iterator = NULL; object->printers = PyList_New (0); if (!object->printers) *************** objfile_to_objfile_object (struct objfil *** 179,184 **** --- 338,380 ---- return (PyObject *) object; } + /* 'tp_dealloc' function for stpy_iterator_object_type. */ + + static void + stpy_iterator_dealloc (PyObject *o) + { + stpy_iterator_free_symtab_list ((stpy_iterator_object *) o); + } + + /* 'tp_iter' function for stpy_iterator_object_type. */ + + static PyObject * + stpy_iterator_iter (PyObject *self) + { + Py_INCREF (self); + return self; + } + + /* 'tp_iternext' function for stpy_iterator_object_type. */ + + static PyObject * + stpy_iterator_iternext (PyObject *self) + { + stpy_iterator_object *iter = (stpy_iterator_object *) self; + stpy_node *node; + PyObject *elem; + + if (! iter || ! iter->current_node) + return NULL; + + node = iter->current_node; + iter->current_node = node->next; + + elem = node->symtab_object; + Py_INCREF ((PyObject *) elem); + return elem; + } + void gdbpy_initialize_objfile (void) { *************** gdbpy_initialize_objfile (void) *** 188,196 **** --- 384,399 ---- if (PyType_Ready (&objfile_object_type) < 0) return; + if (PyType_Ready (&stpy_iterator_object_type) < 0) + return; + Py_INCREF (&objfile_object_type); PyModule_AddObject (gdb_module, "Objfile", (PyObject *) &objfile_object_type); + + Py_INCREF (&stpy_iterator_object_type); + PyModule_AddObject (gdb_module, "SymtabIterator", + (PyObject *) &stpy_iterator_object_type); } *************** static PyMethodDef objfile_object_method *** 200,205 **** --- 403,412 ---- { "is_valid", objfpy_is_valid, METH_NOARGS, "is_valid () -> Boolean.\n\ Return true if this object file is valid, false if not." }, + { "symtabs", objfpy_symtabs, METH_NOARGS, + "symtabs () -> list.\n\ + Return the list of gdb.Symtab objects associated with the underlying\n\ + object file."}, { NULL } }; *************** static PyTypeObject objfile_object_type *** 255,257 **** --- 462,496 ---- 0, /* tp_alloc */ objfpy_new, /* tp_new */ }; + + static PyTypeObject stpy_iterator_object_type = + { + PyObject_HEAD_INIT (NULL) + 0, /*ob_size*/ + "gdb.SymtabIterator", /*tp_name*/ + sizeof (stpy_iterator_object), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + stpy_iterator_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ + "GDB symtab iterator object", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + stpy_iterator_iter, /* tp_iter */ + stpy_iterator_iternext, /* tp_iternext */ + }; Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.939 diff -c -p -r1.939 gdb.texinfo *** doc/gdb.texinfo 28 Mar 2012 21:31:46 -0000 1.939 --- doc/gdb.texinfo 2 Apr 2012 06:09:24 -0000 *************** longer. All other @code{gdb.Objfile} me *** 23812,23817 **** --- 23812,23823 ---- if it is invalid at the time the method is called. @end defun + @defun Objfile.symtabs () + Returns the list of @code{gdb.Symtab} objects associated with the + underlying object file referred by the @code{gdb.Objfile} object. + @xref{Symbol Tables In Python}. + @end defun + @node Frames In Python @subsubsection Accessing inferior stack frames from Python. Index: testsuite/gdb.python/py-objfile.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/py-objfile.exp,v retrieving revision 1.3 diff -c -p -r1.3 py-objfile.exp *** testsuite/gdb.python/py-objfile.exp 16 Jan 2012 16:21:52 -0000 1.3 --- testsuite/gdb.python/py-objfile.exp 2 Apr 2012 06:09:24 -0000 *************** *** 19,25 **** load_lib gdb-python.exp set testfile "py-objfile" ! set srcfile ${testfile}.c if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { return -1 --- 19,26 ---- load_lib gdb-python.exp set testfile "py-objfile" ! set srcfile "${testfile}.c ${testfile}1.c ${testfile}2.c ${testfile}3.c" ! set fnameprefix "${srcdir}/${subdir}/" if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { return -1 *************** gdb_py_test_silent_cmd "python sym = gdb *** 37,47 **** --- 38,67 ---- "Find a symbol in objfile" 1 gdb_py_test_silent_cmd "python objfile = sym\[0\].symtab.objfile" \ "Get backing object file" 1 + gdb_py_test_silent_cmd "python symtabs = objfile.symtabs()" \ + "Get the symtabs associated with the objfile" 1 + gdb_py_test_silent_cmd "python filenames = \['${fnameprefix}${testfile}.c', \ + '${fnameprefix}${testfile}1.c', \ + '${fnameprefix}${testfile}2.c', \ + '${fnameprefix}${testfile}3.c'\]" \ + "Create a list of source file names" 1 gdb_test "python print objfile.filename" ".*py-objfile.*" \ "Get objfile validity" gdb_test "python print objfile.is_valid()" "True" \ "Get objfile validity" + + gdb_test "python print len(symtabs)" "4" \ + "Get the number of symtabs associated with the objfile." + gdb_test "python print symtabs\[0\].filename in filenames" "True" \ + "Check if symtab file is present in the list of filenames." + gdb_test "python print symtabs\[1\].filename in filenames" "True" \ + "Check if symtab file is present in the list of filenames." + gdb_test "python print symtabs\[2\].filename in filenames" "True" \ + "Check if symtab file is present in the list of filenames." + gdb_test "python print symtabs\[3\].filename in filenames" "True" \ + "Check if symtab file is present in the list of filenames." + gdb_unload gdb_test "python print objfile.is_valid()" "False" \ "Get objfile validity after unload" Index: testsuite/gdb.python/py-objfile1.c =================================================================== RCS file: testsuite/gdb.python/py-objfile1.c diff -N testsuite/gdb.python/py-objfile1.c *** /dev/null 1 Jan 1970 00:00:00 -0000 --- testsuite/gdb.python/py-objfile1.c 2 Apr 2012 06:09:24 -0000 *************** *** 0 **** --- 1,22 ---- + /* This testcase is part of GDB, the GNU debugger. + + Copyright 2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + static int + add (int a, int b) + { + return a + b; + } Index: testsuite/gdb.python/py-objfile2.c =================================================================== RCS file: testsuite/gdb.python/py-objfile2.c diff -N testsuite/gdb.python/py-objfile2.c *** /dev/null 1 Jan 1970 00:00:00 -0000 --- testsuite/gdb.python/py-objfile2.c 2 Apr 2012 06:09:24 -0000 *************** *** 0 **** --- 1,23 ---- + /* This testcase is part of GDB, the GNU debugger. + + Copyright 2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + static int + sub (int a, int b) + { + return a - b; + } + Index: testsuite/gdb.python/py-objfile3.c =================================================================== RCS file: testsuite/gdb.python/py-objfile3.c diff -N testsuite/gdb.python/py-objfile3.c *** /dev/null 1 Jan 1970 00:00:00 -0000 --- testsuite/gdb.python/py-objfile3.c 2 Apr 2012 06:09:24 -0000 *************** *** 0 **** --- 1,23 ---- + /* This testcase is part of GDB, the GNU debugger. + + Copyright 2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + static int + mul (int a, int b) + { + return a * b; + } + Index: NEWS =================================================================== RCS file: /cvs/src/src/gdb/NEWS,v retrieving revision 1.505 diff -c -p -r1.505 NEWS *** NEWS 28 Mar 2012 21:31:56 -0000 1.505 --- NEWS 2 Apr 2012 06:09:24 -0000 *************** *** 32,37 **** --- 32,41 ---- ** A new method 'referenced_value' on gdb.Value objects which can dereference pointer as well as C++ reference values. + ** A new method 'symtabs' on gdb.Objfile objects which returns the + list of gdb.Symtab objects associated with the underlying object + files. + * GDBserver now supports stdio connections. E.g. (gdb) target remote | ssh myhost gdbserver - hello