Add gdb.Objfile.is_file attribute
authorTom Tromey <tromey@adacore.com>
Mon, 20 Jun 2022 18:32:52 +0000 (12:32 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 5 Jul 2022 17:22:20 +0000 (11:22 -0600)
Sometimes an objfile comes from memory and not from a file.  It can be
useful to be able to check this from Python, so this patch adds a new
"is_file" attribute.

gdb/NEWS
gdb/doc/python.texi
gdb/python/py-objfile.c
gdb/testsuite/gdb.base/jit-reader.exp

index c4f4a02a7c086d3730bf69129d880218f138e186..1178a37017e3c8f9185634ee7b12a9662f1db6c6 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -118,6 +118,9 @@ GNU/Linux/LoongArch (gdbserver)     loongarch*-*-linux*
        to wrap the result of a call to a Disassembler.  It has
        read-only attributes 'length' and 'string'.
 
+  ** gdb.Objfile now has an attribute named "is_file".  This is True
+     if the objfile comes from a file, and False otherwise.
+
 * New features in the GDB remote stub, GDBserver
 
   ** GDBserver is now supported on LoongArch GNU/Linux.
index 9e2e97b1e743896bf2de8b909c4927820d1a51d4..19ae33012c30cb5784549668a4754636da26b3be 100644 (file)
@@ -4891,6 +4891,13 @@ The value is @code{None} if the objfile is no longer valid.
 See the @code{gdb.Objfile.is_valid} method, described below.
 @end defvar
 
+@defvar Objfile.is_file
+An objfile often comes from an ordinary file, but in some cases it may
+be constructed from the contents of memory.  This attribute is
+@code{True} for file-backed objfiles, and @code{False} for other
+kinds.
+@end defvar
+
 @defvar Objfile.owner
 For separate debug info objfiles this is the corresponding @code{gdb.Objfile}
 object that debug info is being provided for.
index 3e3270e7cd373e48ce6ac5706878237c4be198dd..298f3f23632776bd1e4df3206825231416631189 100644 (file)
@@ -101,6 +101,18 @@ objfpy_get_username (PyObject *self, void *closure)
   Py_RETURN_NONE;
 }
 
+/* Get the 'is_file' attribute.  */
+
+static PyObject *
+objfpy_get_is_file (PyObject *o, void *ignore)
+{
+  objfile_object *self = (objfile_object *) o;
+
+  if (self->objfile != nullptr)
+    return PyBool_FromLong ((self->objfile->flags & OBJF_NOT_FILENAME) == 0);
+  Py_RETURN_NONE;
+}
+
 /* If SELF is a separate debug-info file, return the "backlink" field.
    Otherwise return None.  */
 
@@ -762,6 +774,8 @@ static gdb_PyGetSetDef objfile_getset[] =
     "Type printers.", NULL },
   { "xmethods", objfpy_get_xmethods, NULL,
     "Debug methods.", NULL },
+  { "is_file", objfpy_get_is_file, nullptr,
+    "Whether this objfile came from a file.", nullptr },
   { NULL }
 };
 
index e0b3ba421150317159b57b52db262acf0d9c3a94..69bf721d90aaf4e9163ab3e68c02b1a90267ea5c 100644 (file)
@@ -13,6 +13,9 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# Optionally test a Python API here as well.
+load_lib gdb-python.exp
+
 standard_testfile jit-reader-host.c
 
 if { (![istarget x86_64-*-*] && ![istarget i?86-*-*]) || ![is_lp64_target] } {
@@ -265,6 +268,15 @@ proc jit_reader_test {} {
                 "#1 ${any} in main ${any}" \
                ]
     }
+
+    if {![skip_python_tests]} {
+       gdb_test "python print(any(\[not x.is_file for x in gdb.objfiles()\]))" \
+           "True" \
+           "at least one non-file objfile"
+       gdb_test "python print(any(\[x.is_file for x in gdb.objfiles()\]))" \
+           "True" \
+           "at least one file-based objfile"
+    }
 }
 
 jit_reader_test