From 5ce85461a143e0d564b6dfa6407374851899d491 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Thu, 7 Sep 2023 11:18:16 +0100 Subject: [PATCH] gdb/python: new Progspace.symbol_file attribute Add a new Progspace.symbol_file attribute. This attribute holds the gdb.Objfile object that corresponds to Progspace.filename, or None if there is no main symbol file currently set. Currently, to get this gdb.Objfile, a user would need to use Progspace.objfiles, and then search for the objfile with a name that matches Progspace.filename -- which should work just fine, but having direct access seems a little nicer. Reviewed-By: Eli Zaretskii Approved-By: Tom Tromey --- gdb/NEWS | 5 +++++ gdb/doc/python.texi | 17 +++++++++++++++++ gdb/python/py-progspace.c | 23 +++++++++++++++++++++++ gdb/testsuite/gdb.python/py-progspace.exp | 9 +++++++++ 4 files changed, 54 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index 5b9ca9be30f2..5d9e9ee9d12e 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -298,6 +298,11 @@ show tui mouse-events class, it signals to gdb that the printer may implement new pretty-printer methods. + ** New attribute Progspace.symbol_file. This attribute holds the + gdb.Objfile that corresponds to Progspace.filename (when + Progspace.filename is not None), otherwise, this attribute is + itself None. + *** Changes in GDB 13 * MI version 1 is deprecated, and will be removed in GDB 14. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 1b4b8a3fa141..6510a8364073 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -5078,6 +5078,23 @@ If there is no main symbol table currently loaded, then this attribute will be @code{None}. @end defvar +@defvar Progspace.symbol_file +The @code{gdb.Objfile} representing the main symbol file (from which +debug symbols have been loaded) for the @code{gdb.Progspace}. This is +the symbol file set by the @kbd{symbol-file} or @kbd{file} commands. + +This will be the @code{gdb.Objfile} representing +@code{Progspace.filename} when @code{Progspace.filename} is not +@code{None}. + +If there is no main symbol table currently loaded, then this attribute +will be @code{None}. + +If the @code{Progspace} is invalid, i.e.@:, when +@code{Progspace.is_valid()} returns @code{False}, then attempting to +access this attribute will raise a @code{RuntimeError} exception. +@end defvar + @defvar Progspace.pretty_printers The @code{pretty_printers} attribute is a list of functions. It is used to look up pretty-printers. A @code{Value} is passed to each diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index 2b1d1605ca09..929c5f4fa70d 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -111,6 +111,26 @@ pspy_get_filename (PyObject *self, void *closure) Py_RETURN_NONE; } +/* Implement the gdb.Progspace.symbol_file attribute. Retun the + gdb.Objfile corresponding to the currently loaded symbol-file, or None + if no symbol-file is loaded. If the Progspace is invalid then raise an + exception. */ + +static PyObject * +pspy_get_symbol_file (PyObject *self, void *closure) +{ + pspace_object *obj = (pspace_object *) self; + + PSPY_REQUIRE_VALID (obj); + + struct objfile *objfile = obj->pspace->symfile_object_file; + + if (objfile != nullptr) + return objfile_to_objfile_object (objfile).release (); + + Py_RETURN_NONE; +} + static void pspy_dealloc (PyObject *self) { @@ -573,6 +593,9 @@ static gdb_PyGetSetDef pspace_getset[] = "The __dict__ for this progspace.", &pspace_object_type }, { "filename", pspy_get_filename, NULL, "The filename of the progspace's main symbol file, or None.", nullptr }, + { "symbol_file", pspy_get_symbol_file, nullptr, + "The gdb.Objfile for the progspace's main symbol file, or None.", + nullptr}, { "pretty_printers", pspy_get_printers, pspy_set_printers, "Pretty printers.", NULL }, { "frame_filters", pspy_get_frame_filters, pspy_set_frame_filters, diff --git a/gdb/testsuite/gdb.python/py-progspace.exp b/gdb/testsuite/gdb.python/py-progspace.exp index f0dc208ae4b2..befd6433e477 100644 --- a/gdb/testsuite/gdb.python/py-progspace.exp +++ b/gdb/testsuite/gdb.python/py-progspace.exp @@ -30,6 +30,8 @@ clean_restart gdb_test "python print (gdb.current_progspace().filename)" "None" \ "current progspace filename (None)" +gdb_test "python print (gdb.current_progspace().symbol_file)" "None" \ + "current progspace symbol_file is None" gdb_test "python print (gdb.progspaces())" "\\\[\\\]" gdb_test_no_output "python dir(gdb.current_progspace())" @@ -42,6 +44,10 @@ gdb_py_test_silent_cmd "python progspace = gdb.current_progspace()" \ gdb_test "python print (progspace.filename)" "py-progspace" \ "current progspace filename (py-progspace)" +gdb_test "python print (gdb.current_progspace().symbol_file)" \ + "" \ + "current progspace symbol_file is set correctly" + gdb_py_test_silent_cmd "python progspace.random_attribute = 42" \ "Set random attribute in progspace" 1 gdb_test "python print (progspace.random_attribute)" "42" \ @@ -100,3 +106,6 @@ gdb_test "inferior 1" "Switching to inferior 1.*" gdb_test_no_output "remove-inferiors 2" gdb_test "python print (progspace2.objfiles ())" \ "RuntimeError: Program space no longer exists.*" + +gdb_test "python print (progspace2.symbol_file)" \ + "RuntimeError: Program space no longer exists.*"