]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: update is_addr_in_objfile to support "dynamic" objfiles master
authorJan Vrany <jan.vrany@labware.com>
Fri, 28 Nov 2025 13:47:02 +0000 (13:47 +0000)
committerJan Vrany <jan.vrany@labware.com>
Fri, 28 Nov 2025 13:47:02 +0000 (13:47 +0000)
While working with objfiles in Python I noticed that
gdb.Progspace.objfile_for_address () does not return "dynamic" objfiles
created by (for example) GDB's JIT reader API.

This is because is_addr_in_objfile() checks if a given address falls into
any (mappped) section of that objfile. However objfiles created by JIT
reader API do not have sections.

To solve this issue, this commit updates is_addr_in_objfile() to also
check if the address fall into any compunit in that objfile. It does so
only if the objfile has no sections.

gdb/objfiles.c
gdb/objfiles.h
gdb/symtab.c
gdb/symtab.h
gdb/testsuite/gdb.base/jit-reader.exp

index 0d166ceec4c3c3ddd4d8326a04a06926feb40963..5c5b04c645896fed15222029fbd0f18ef22ee6f2 100644 (file)
@@ -1084,14 +1084,28 @@ is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile)
   if (objfile == NULL)
     return false;
 
-  for (obj_section &osect : objfile->sections ())
+  if (objfile->sections_start == nullptr)
     {
-      if (section_is_overlay (&osect) && !section_is_mapped (&osect))
-       continue;
+      /* Objfiles created dynamically by the JIT reader API (and possibly by
+        other means too) do not have sections.  For such "dynamic" objfiles
+        walk over all compunits and check if any of them contains given
+        ADDR.  */
+      for (const compunit_symtab &cu : objfile->compunits ())
+       if (cu.contains (addr))
+         return true;
+    }
+  else
+    {
+      for (obj_section &osect : objfile->sections ())
+       {
+         if (section_is_overlay (&osect) && !section_is_mapped (&osect))
+           continue;
 
-      if (osect.contains (addr))
-       return true;
+         if (osect.contains (addr))
+           return true;
+       }
     }
+
   return false;
 }
 
index 0dd3fafac0377a2dc4313fba0c6bb06d84b0627e..f65f3bde930d1f5e903f883911f1300ff9ff1ebf 100644 (file)
@@ -476,7 +476,7 @@ public:
   /* A range adapter that makes it possible to iterate over all
      compunits in one objfile.  */
 
-  compunit_symtab_range compunits ()
+  compunit_symtab_range compunits () const
   {
     auto begin = compunit_symtab_iterator (compunit_symtabs.begin ());
     auto end = compunit_symtab_iterator (compunit_symtabs.end ());
index 701aa5d0007042486f283b8e366265bfdc24288a..5754d944b6c6a77345284d37b3d8d3d34e977e3d 100644 (file)
@@ -513,6 +513,14 @@ compunit_symtab::symbol_at_address (CORE_ADDR addr) const
 
 /* See symtab.h.  */
 
+bool
+compunit_symtab::contains (CORE_ADDR addr) const
+{
+  return blockvector ()->contains (addr);
+}
+
+/* See symtab.h.  */
+
 compunit_symtab::compunit_symtab (struct objfile *objfile,
                                  const char *name_)
   : m_objfile (objfile),
index 33cf0a6c229f4d24dfca2d68da38a0959569eebb..45aca07bc362f8dbfbd682cb5d67ff4f77dc7c08 100644 (file)
@@ -1964,6 +1964,9 @@ struct compunit_symtab : intrusive_list_node<compunit_symtab>
      for ADDR are considered.  */
   struct symbol *symbol_at_address (CORE_ADDR addr) const;
 
+  /* True if ADDR is in this compunit_symtab, false otherwise.  */
+  bool contains (CORE_ADDR addr) const;
+
   /* Object file from which this symtab information was read.  */
   struct objfile *m_objfile;
 
index cd844ca75d25f636bb7c2ebf1fe98df0ba37baf0..df2dd74a6ab2693c761e1f552f0bf31db52087d7 100644 (file)
@@ -234,6 +234,15 @@ proc jit_reader_test {} {
                gdb_test "python print( \[o for o in gdb.objfiles() if o.filename.startswith('<< JIT compiled code')\]\[0\].build_id )" \
                    "None" \
                    "python gdb.Objfile.build_id"
+
+               # Check that Progspace.objfile_for_address () finds "jitted"
+               # objfile
+               gdb_test "frame 0" \
+                   "#0  $hex in jit_function_stack_mangle ()$any" \
+                   "select frame 0"
+               gdb_test "python print( gdb.current_progspace().objfile_for_address(gdb.parse_and_eval('\$pc')) )" \
+                   "<gdb.Objfile filename=<< JIT compiled code at $hex >>>" \
+                   "python gdb.Progspace.objfile_for_address"
            }
        }
     }