jit: c++-ify gdb_block
[deliverable/binutils-gdb.git] / gdb / jit.c
index 07767275f533bcf248b2d6897ce060205fc81241..bb6b6bacb5d17a5c3218c284e976ac310e071143 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -41,6 +41,7 @@
 #include "gdb_bfd.h"
 #include "readline/tilde.h"
 #include "completer.h"
+#include <forward_list>
 
 static std::string jit_reader_dir;
 
@@ -428,22 +429,30 @@ jit_read_code_entry (struct gdbarch *gdbarch,
 
 struct gdb_block
 {
+  gdb_block (gdb_block *parent, CORE_ADDR begin, CORE_ADDR end,
+            const char *name)
+    : parent (parent),
+      begin (begin),
+      end (end),
+      name (name != nullptr ? xstrdup (name) : nullptr)
+  {}
+
   /* gdb_blocks are linked into a tree structure.  Next points to the
      next node at the same depth as this block and parent to the
      parent gdb_block.  */
-  struct gdb_block *next, *parent;
+  struct gdb_block *next = nullptr, *parent;
 
   /* Points to the "real" block that is being built out of this
      instance.  This block will be added to a blockvector, which will
      then be added to a symtab.  */
-  struct block *real_block;
+  struct block *real_block = nullptr;
 
   /* The first and last code address corresponding to this block.  */
   CORE_ADDR begin, end;
 
   /* The name of this block (if any).  If this is non-NULL, the
      FUNCTION symbol symbol is set to this value.  */
-  const char *name;
+  gdb::unique_xmalloc_ptr<char> name;
 };
 
 /* Proxy object for building a symtab.  */
@@ -464,8 +473,7 @@ struct gdb_symtab
          gdb_block_iter = gdb_block_iter_tmp)
       {
         gdb_block_iter_tmp = gdb_block_iter->next;
-        xfree ((void *) gdb_block_iter->name);
-        xfree (gdb_block_iter);
+       delete gdb_block_iter;
       }
   }
 
@@ -481,15 +489,19 @@ struct gdb_symtab
 
   /* The source file for this symtab.  */
   std::string file_name;
-
-  struct gdb_symtab *next = nullptr;
 };
 
 /* Proxy object for building an object.  */
 
 struct gdb_object
 {
-  struct gdb_symtab *symtabs;
+  /* Symtabs of this object.
+
+     This is specifically a linked list, instead of, for example, a vector,
+     because the pointers are returned to the user's debug info reader.  So
+     it's important that the objects don't change location during their
+     lifetime (which would happen with a vector of objects getting resized).  */
+  std::forward_list<gdb_symtab> symtabs;
 };
 
 /* The type of the `private' data passed around by the callback
@@ -521,7 +533,7 @@ jit_object_open_impl (struct gdb_symbol_callbacks *cb)
   /* CB is not required right now, but sometime in the future we might
      need a handle to it, and we'd like to do that without breaking
      the ABI.  */
-  return XCNEW (struct gdb_object);
+  return new gdb_object;
 }
 
 /* Readers call into this function to open a new gdb_symtab, which,
@@ -534,10 +546,8 @@ jit_symtab_open_impl (struct gdb_symbol_callbacks *cb,
 {
   /* CB stays unused.  See comment in jit_object_open_impl.  */
 
-  gdb_symtab *ret = new gdb_symtab (file_name);
-  ret->next = object->symtabs;
-  object->symtabs = ret;
-  return ret;
+  object->symtabs.emplace_front (file_name);
+  return &object->symtabs.front ();
 }
 
 /* Returns true if the block corresponding to old should be placed
@@ -571,13 +581,9 @@ jit_block_open_impl (struct gdb_symbol_callbacks *cb,
                     struct gdb_symtab *symtab, struct gdb_block *parent,
                     GDB_CORE_ADDR begin, GDB_CORE_ADDR end, const char *name)
 {
-  struct gdb_block *block = XCNEW (struct gdb_block);
+  struct gdb_block *block = new gdb_block (parent, begin, end, name);
 
   block->next = symtab->blocks;
-  block->begin = (CORE_ADDR) begin;
-  block->end = (CORE_ADDR) end;
-  block->name = name ? xstrdup (name) : NULL;
-  block->parent = parent;
 
   /* Ensure that the blocks are inserted in the correct (reverse of
      the order expected by blockvector).  */
@@ -718,7 +724,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
       SYMBOL_BLOCK_VALUE (block_name) = new_block;
 
       block_name->name = obstack_strdup (&objfile->objfile_obstack,
-                                        gdb_block_iter->name);
+                                        gdb_block_iter->name.get ());
 
       BLOCK_FUNCTION (new_block) = block_name;
 
@@ -774,8 +780,6 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
            BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
        }
     }
-
-  delete stab;
 }
 
 /* Called when closing a gdb_objfile.  Converts OBJ to a proper
@@ -785,7 +789,6 @@ static void
 jit_object_close_impl (struct gdb_symbol_callbacks *cb,
                       struct gdb_object *obj)
 {
-  struct gdb_symtab *i, *j;
   struct objfile *objfile;
   jit_dbg_reader_data *priv_data;
 
@@ -795,14 +798,12 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
                           OBJF_NOT_FILENAME);
   objfile->per_bfd->gdbarch = target_gdbarch ();
 
-  j = NULL;
-  for (i = obj->symtabs; i; i = j)
-    {
-      j = i->next;
-      finalize_symtab (i, objfile);
-    }
+  for (gdb_symtab &symtab : obj->symtabs)
+    finalize_symtab (&symtab, objfile);
+
   add_objfile_entry (objfile, *priv_data);
-  xfree (obj);
+
+  delete obj;
 }
 
 /* Try to read CODE_ENTRY using the loaded jit reader (if any).
This page took 0.026123 seconds and 4 git commands to generate.