From a40bf0c2e93daac4ae4ce7dd1c43ab6135e76720 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 13 Sep 2018 15:39:26 -0400 Subject: [PATCH] python: Add Inferior.progspace property This patch adds a progspace property to the gdb.Inferior type, which allows getting the gdb.Progspace object associated to that inferior. In conjunction with the following patch, this will allow scripts iterate on objfiles associated with a particular inferior. gdb/ChangeLog: * python/py-inferior.c (infpy_get_progspace): New function. (inferior_object_getset): Add progspace property. * NEWS: Mention the new property. gdb/doc/ChangeLog: * python.texi (Inferiors In Python): Document Inferior.progspace. (Program Spaces In Python): Document that gdb.current_progspace() is the same as gdb.selected_inferior().progspace. gdb/testsuite/ChangeLog: * gdb.python/py-inferior.exp: Add tests for Inferior.progspace and a few other Inferior properties when the Inferior is no longer valid. --- gdb/ChangeLog | 6 ++++++ gdb/NEWS | 5 +++++ gdb/doc/ChangeLog | 9 +++++++++ gdb/doc/python.texi | 8 +++++++- gdb/python/py-inferior.c | 18 ++++++++++++++++++ gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.python/py-inferior.exp | 5 +++++ 7 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5783e7cb0a3..8ec110cef3d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-09-13 Simon Marchi + + * python/py-inferior.c (infpy_get_progspace): New function. + (inferior_object_getset): Add progspace property. + * NEWS: Mention the new property. + 2018-09-13 Tom Tromey PR rust/23650: diff --git a/gdb/NEWS b/gdb/NEWS index 4e4f12d8d13..4e26f4bb977 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -84,6 +84,11 @@ GNU/Linux/RISC-V riscv*-*-linux* CSKY ELF csky*-*-elf CSKY GNU/LINUX csky*-*-linux +* Python API + + ** The gdb.Inferior type has a new 'progspace' property, which is the program + space associated to that inferior. + *** Changes in GDB 8.2 * The 'set disassembler-options' command now supports specifying options diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 1c965087af6..4750c340b5c 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,12 @@ +2018-09-13 Simon Marchi +2018-09-13 Tom Tromey + + * python.texi (Inferiors In Python): Document + Inferior.progspace. + (Program Spaces In Python): Document that + gdb.current_progspace() is the same as + gdb.selected_inferior().progspace. + 2018-09-13 Simon Marchi * python.texi (Basic Python): Mention the string representation diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 6e2bf5c9eff..75d8ae1e399 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -2836,6 +2836,10 @@ Boolean signaling whether the inferior was created using `attach', or started by @value{GDBN} itself. @end defvar +@defvar Inferior.progspace +The inferior's program space. @xref{Progspaces In Python}. +@end defvar + A @code{gdb.Inferior} object has the following methods: @defun Inferior.is_valid () @@ -3995,7 +3999,9 @@ The following progspace-related functions are available in the @findex gdb.current_progspace @defun gdb.current_progspace () This function returns the program space of the currently selected inferior. -@xref{Inferiors and Programs}. +@xref{Inferiors and Programs}. This is identical to +@code{gdb.selected_inferior().progspace} (@pxref{Inferiors In Python}) and is +included for historical compatibility. @end defun @findex gdb.progspaces diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 56019bf9e05..727a8d2f306 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -459,6 +459,23 @@ infpy_get_was_attached (PyObject *self, void *closure) Py_RETURN_FALSE; } +/* Getter of gdb.Inferior.progspace. */ + +static PyObject * +infpy_get_progspace (PyObject *self, void *closure) +{ + inferior_object *inf = (inferior_object *) self; + + INFPY_REQUIRE_VALID (inf); + + program_space *pspace = inf->inferior->pspace; + gdb_assert (pspace != nullptr); + + PyObject *py_pspace = pspace_to_pspace_object (pspace); + Py_XINCREF (py_pspace); + return py_pspace; +} + static int build_inferior_list (struct inferior *inf, void *arg) { @@ -966,6 +983,7 @@ static gdb_PyGetSetDef inferior_object_getset[] = NULL }, { "was_attached", infpy_get_was_attached, NULL, "True if the inferior was created using 'attach'.", NULL }, + { "progspace", infpy_get_progspace, NULL, "Program space of this inferior" }, { NULL } }; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7d6a2ecbf07..553eaab15ba 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-09-13 Simon Marchi + + * gdb.python/py-inferior.exp: Add tests for Inferior.progspace + and a few other Inferior properties when the Inferior is no + longer valid. + 2018-09-13 Tom Tromey PR rust/23650: diff --git a/gdb/testsuite/gdb.python/py-inferior.exp b/gdb/testsuite/gdb.python/py-inferior.exp index 7ec81930ff0..38f52573b19 100644 --- a/gdb/testsuite/gdb.python/py-inferior.exp +++ b/gdb/testsuite/gdb.python/py-inferior.exp @@ -55,6 +55,9 @@ gdb_test "python print ('result = %s' % i0.pid)" " = \[0-9\]+" "test Inferior.pi gdb_test "python print ('result = %s' % i0.was_attached)" " = False" "test Inferior.was_attached" gdb_test "python print (i0.threads ())" "\\(,\\)" "test Inferior.threads" +gdb_test "python print (i0.progspace)" "" +gdb_test "python print (i0.progspace == gdb.progspaces()\[0\])" "True" + # Test the number of inferior threads. gdb_breakpoint check_threads @@ -263,6 +266,8 @@ with_test_prefix "is_valid" { "RuntimeError: Inferior no longer exists.*" gdb_test "python print (inf_list\[1\].was_attached)" \ "RuntimeError: Inferior no longer exists.*" + gdb_test "python print (inf_list\[1\].progspace)" \ + "RuntimeError: Inferior no longer exists.*" gdb_test "python print (inf_list\[1\].threads ())" \ "RuntimeError: Inferior no longer exists.*" gdb_test "python print (inf_list\[1\].thread_from_thread_handle (1))" \ -- 2.30.2