X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fjit.c;h=bb6b6bacb5d17a5c3218c284e976ac310e071143;hb=b61121178ec07f9da1242e439fe1a23a314ad30e;hp=07767275f533bcf248b2d6897ce060205fc81241;hpb=89867184294da399078d77bae3cd4b27ce640f27;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jit.c b/gdb/jit.c index 07767275f5..bb6b6bacb5 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -41,6 +41,7 @@ #include "gdb_bfd.h" #include "readline/tilde.h" #include "completer.h" +#include 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 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 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).