jit: c++-ify gdb_block

Add a constructor to gdb_block, change the name field to be a
gdb::unique_xmalloc_ptr.  This is in preparation for using an
std::forward_list<gdb_block> in the next patch.

gdb/ChangeLog:

	* jit.c (struct gdb_block): Add constructor, initialize
	real_block and next fields.
	<name>: Change type to gdb::unique_xmalloc_ptr.
	(struct gdb_symtab) <~gdb_symtab>: Free blocks with delete.
	(jit_block_open_impl): Allocate gdb_block with new.
	(finalize_symtab): Adjust to gdb::unique_xmalloc_ptr.
This commit is contained in:
Simon Marchi
2019-12-16 16:30:50 -05:00
committed by Simon Marchi
parent 1b61f46da5
commit b61121178e
2 changed files with 23 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2019-12-16 Simon Marchi <simon.marchi@polymtl.ca>
* jit.c (struct gdb_block): Add constructor, initialize
real_block and next fields.
<name>: Change type to gdb::unique_xmalloc_ptr.
(struct gdb_symtab) <~gdb_symtab>: Free blocks with delete.
(jit_block_open_impl): Allocate gdb_block with new.
(finalize_symtab): Adjust to gdb::unique_xmalloc_ptr.
2019-12-16 Simon Marchi <simon.marchi@polymtl.ca> 2019-12-16 Simon Marchi <simon.marchi@polymtl.ca>
* jit.c: Include forward_list. * jit.c: Include forward_list.

View File

@ -429,22 +429,30 @@ jit_read_code_entry (struct gdbarch *gdbarch,
struct gdb_block 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 /* 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 next node at the same depth as this block and parent to the
parent gdb_block. */ 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 /* Points to the "real" block that is being built out of this
instance. This block will be added to a blockvector, which will instance. This block will be added to a blockvector, which will
then be added to a symtab. */ 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. */ /* The first and last code address corresponding to this block. */
CORE_ADDR begin, end; CORE_ADDR begin, end;
/* The name of this block (if any). If this is non-NULL, the /* The name of this block (if any). If this is non-NULL, the
FUNCTION symbol symbol is set to this value. */ FUNCTION symbol symbol is set to this value. */
const char *name; gdb::unique_xmalloc_ptr<char> name;
}; };
/* Proxy object for building a symtab. */ /* Proxy object for building a symtab. */
@ -465,8 +473,7 @@ struct gdb_symtab
gdb_block_iter = gdb_block_iter_tmp) gdb_block_iter = gdb_block_iter_tmp)
{ {
gdb_block_iter_tmp = gdb_block_iter->next; gdb_block_iter_tmp = gdb_block_iter->next;
xfree ((void *) gdb_block_iter->name); delete gdb_block_iter;
xfree (gdb_block_iter);
} }
} }
@ -574,13 +581,9 @@ jit_block_open_impl (struct gdb_symbol_callbacks *cb,
struct gdb_symtab *symtab, struct gdb_block *parent, struct gdb_symtab *symtab, struct gdb_block *parent,
GDB_CORE_ADDR begin, GDB_CORE_ADDR end, const char *name) 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->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 /* Ensure that the blocks are inserted in the correct (reverse of
the order expected by blockvector). */ the order expected by blockvector). */
@ -721,7 +724,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
SYMBOL_BLOCK_VALUE (block_name) = new_block; SYMBOL_BLOCK_VALUE (block_name) = new_block;
block_name->name = obstack_strdup (&objfile->objfile_obstack, block_name->name = obstack_strdup (&objfile->objfile_obstack,
gdb_block_iter->name); gdb_block_iter->name.get ());
BLOCK_FUNCTION (new_block) = block_name; BLOCK_FUNCTION (new_block) = block_name;