diff options
author | Tom Tromey <tom@tromey.com> | 2013-12-26 19:50:05 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-09-16 06:52:37 -0600 |
commit | 8743a9cdd20055e02a20c24c37b5312e3e626691 (patch) | |
tree | 982605dd428a62aff01ce080fbd68221e3f425e1 /gdb/python/py-progspace.c | |
parent | 752312ba4e53fea8e77ae240a35a7b508c6ca619 (diff) | |
download | binutils-8743a9cdd20055e02a20c24c37b5312e3e626691.zip binutils-8743a9cdd20055e02a20c24c37b5312e3e626691.tar.gz binutils-8743a9cdd20055e02a20c24c37b5312e3e626691.tar.bz2 |
Add more methods to gdb.Progspace
There are a number of global functions in the gdb Python module which
really should be methods on Progspace. This patch adds new methods to
Progspace and then redefines these globals in terms of these new
methods.
This version has been rebased on the related changes that Simon
recently put in.
Built and regtested on x86-64 Fedora 28.
gdb/ChangeLog
2018-09-16 Tom Tromey <tom@tromey.com>
* python/lib/gdb/__init__.py (current_progspace, objfiles)
(solib_name, block_for_pc, find_pc_line): New functions.
(execute_unwinders): Update.
* python/py-block.c (gdbpy_block_for_pc): Remove.
* python/py-inferior.c (infpy_get_progspace): New function.
(inferior_object_getset) <progspace>: Add.
* python/py-progspace.c (pspy_objfiles): Rewrite.
(pspy_solib_name, pspy_block_for_pc)
(pspy_find_pc_line, pspy_is_valid): New functions.
(progspace_object_methods): Add entries for solib_name,
block_for_pc, find_pc_line, is_valid.
* python/python-internal.h (gdbpy_block_for_pc)
(build_objfiles_list): Don't declare.
* python/python.c: Don't include solib.h.
(gdbpy_solib_name, gdbpy_find_pc_line)
(gdbpy_get_current_progspace, build_objfiles_list)
(gdbpy_objfiles): Remove.
(GdbMethods) <current_progspace, objfiles, block_for_pc,
solib_name, find_pc_line>: Remove entries.
gdb/doc/ChangeLog
2018-09-16 Tom Tromey <tom@tromey.com>
* python.texi (Basic Python): Update docs for find_pc_line,
solib_name.
(Progspaces In Python): Update docs for current_progspace.
Document block_for_pc, find_pc_line, is_valid, nsolib_name.
Move method documentation before example.
Diffstat (limited to 'gdb/python/py-progspace.c')
-rw-r--r-- | gdb/python/py-progspace.c | 149 |
1 files changed, 148 insertions, 1 deletions
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index e01338f..b88ad3c 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -25,6 +25,8 @@ #include "language.h" #include "arch-utils.h" #include "py-ref.h" +#include "solib.h" +#include "block.h" typedef struct { @@ -332,9 +334,143 @@ pspy_get_objfiles (PyObject *self_, PyObject *args) PSPY_REQUIRE_VALID (self); - return build_objfiles_list (self->pspace).release (); + gdbpy_ref<> list (PyList_New (0)); + if (list == NULL) + return NULL; + + if (self->pspace != NULL) + { + struct objfile *objf; + + ALL_PSPACE_OBJFILES (self->pspace, objf) + { + PyObject *item = objfile_to_objfile_object (objf); + + if (!item || PyList_Append (list.get (), item) == -1) + return NULL; + } + } + + return list.release (); +} + +/* Implementation of solib_name (Long) -> String. + Returns the name of the shared library holding a given address, or None. */ + +static PyObject * +pspy_solib_name (PyObject *o, PyObject *args) +{ + char *soname; + gdb_py_longest pc; + pspace_object *self = (pspace_object *) o; + + PSPY_REQUIRE_VALID (self); + + if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) + return NULL; + + soname = solib_name_from_address (self->pspace, pc); + if (soname == nullptr) + Py_RETURN_NONE; + return host_string_to_python_string (soname); } +/* Return the innermost lexical block containing the specified pc value, + or 0 if there is none. */ +static PyObject * +pspy_block_for_pc (PyObject *o, PyObject *args) +{ + pspace_object *self = (pspace_object *) o; + gdb_py_ulongest pc; + const struct block *block = NULL; + struct compunit_symtab *cust = NULL; + + PSPY_REQUIRE_VALID (self); + + if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) + return NULL; + + TRY + { + scoped_restore_current_program_space saver; + + set_current_program_space (self->pspace); + cust = find_pc_compunit_symtab (pc); + + if (cust != NULL && COMPUNIT_OBJFILE (cust) != NULL) + block = block_for_pc (pc); + } + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH + + if (cust == NULL || COMPUNIT_OBJFILE (cust) == NULL) + { + PyErr_SetString (PyExc_RuntimeError, + _("Cannot locate object file for block.")); + return NULL; + } + + if (block) + return block_to_block_object (block, COMPUNIT_OBJFILE (cust)); + + Py_RETURN_NONE; +} + +/* Implementation of the find_pc_line function. + Returns the gdb.Symtab_and_line object corresponding to a PC value. */ + +static PyObject * +pspy_find_pc_line (PyObject *o, PyObject *args) +{ + gdb_py_ulongest pc_llu; + PyObject *result = NULL; /* init for gcc -Wall */ + pspace_object *self = (pspace_object *) o; + + PSPY_REQUIRE_VALID (self); + + if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc_llu)) + return NULL; + + TRY + { + struct symtab_and_line sal; + CORE_ADDR pc; + scoped_restore_current_program_space saver; + + set_current_program_space (self->pspace); + + pc = (CORE_ADDR) pc_llu; + sal = find_pc_line (pc, 0); + result = symtab_and_line_to_sal_object (sal); + } + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH + + return result; +} + +/* Implementation of is_valid (self) -> Boolean. + Returns True if this program space still exists in GDB. */ + +static PyObject * +pspy_is_valid (PyObject *o, PyObject *args) +{ + pspace_object *self = (pspace_object *) o; + + if (self->pspace == NULL) + Py_RETURN_FALSE; + + Py_RETURN_TRUE; +} + + + /* Clear the PSPACE pointer in a Pspace object and remove the reference. */ static void @@ -420,6 +556,17 @@ static PyMethodDef progspace_object_methods[] = { { "objfiles", pspy_get_objfiles, METH_NOARGS, "Return a sequence of objfiles associated to this program space." }, + { "solib_name", pspy_solib_name, METH_VARARGS, + "solib_name (Long) -> String.\n\ +Return the name of the shared library holding a given address, or None." }, + { "block_for_pc", pspy_block_for_pc, METH_VARARGS, + "Return the block containing the given pc value, or None." }, + { "find_pc_line", pspy_find_pc_line, METH_VARARGS, + "find_pc_line (pc) -> Symtab_and_line.\n\ +Return the gdb.Symtab_and_line object corresponding to the pc value." }, + { "is_valid", pspy_is_valid, METH_NOARGS, + "is_valid () -> Boolean.\n\ +Return true if this program space is valid, false if not." }, { NULL } }; |