diff options
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 } }; |