From 89867184294da399078d77bae3cd4b27ce640f27 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Mon, 16 Dec 2019 16:30:49 -0500 Subject: [PATCH] jit: c++-ify gdb_symtab This patch makes the gdb_symtab bit more c++y, in preparation for the next patch that will use an std::forward_list. It changes the fields to use automatic memory management, in the form of std::string and gdb::unique_xmalloc_ptr, and adds a constructor and a destructor. gdb/ChangeLog: * jit.c (struct gdb_symtab): Add constructor, destructor, initialize fields. : Change type to unique_xmalloc_ptr. : Change type to std::string. (jit_symtab_open_impl): Allocate gdb_symtab with new. (jit_symtab_line_mapping_add_impl): Adjust. (finalize_symtab): Adjust, call delete on stab. --- gdb/ChangeLog | 10 +++++++++ gdb/jit.c | 62 +++++++++++++++++++++++++++------------------------ 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c30b60efbfd..86718ad83e2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2019-12-16 Simon Marchi + + * jit.c (struct gdb_symtab): Add constructor, destructor, + initialize fields. + : Change type to unique_xmalloc_ptr. + : Change type to std::string. + (jit_symtab_open_impl): Allocate gdb_symtab with new. + (jit_symtab_line_mapping_add_impl): Adjust. + (finalize_symtab): Adjust, call delete on stab. + 2019-12-16 Simon Marchi * jit.c (finalize_symtab): Set gdb_block_iter_tmp in loop. diff --git a/gdb/jit.c b/gdb/jit.c index 1cd487502c5..07767275f53 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -450,19 +450,39 @@ struct gdb_block struct gdb_symtab { + explicit gdb_symtab (const char *file_name) + : file_name (file_name != nullptr ? file_name : "") + {} + + ~gdb_symtab () + { + gdb_block *gdb_block_iter, *gdb_block_iter_tmp; + + for ((gdb_block_iter = this->blocks, + gdb_block_iter_tmp = gdb_block_iter->next); + gdb_block_iter; + 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); + } + } + /* The list of blocks in this symtab. These will eventually be converted to real blocks. */ - struct gdb_block *blocks; + struct gdb_block *blocks = nullptr; /* The number of blocks inserted. */ - int nblocks; + int nblocks = 0; /* A mapping between line numbers to PC. */ - struct linetable *linetable; + gdb::unique_xmalloc_ptr linetable; /* The source file for this symtab. */ - const char *file_name; - struct gdb_symtab *next; + std::string file_name; + + struct gdb_symtab *next = nullptr; }; /* Proxy object for building an object. */ @@ -512,12 +532,9 @@ jit_symtab_open_impl (struct gdb_symbol_callbacks *cb, struct gdb_object *object, const char *file_name) { - struct gdb_symtab *ret; - /* CB stays unused. See comment in jit_object_open_impl. */ - ret = XCNEW (struct gdb_symtab); - ret->file_name = file_name ? xstrdup (file_name) : xstrdup (""); + gdb_symtab *ret = new gdb_symtab (file_name); ret->next = object->symtabs; object->symtabs = ret; return ret; @@ -605,7 +622,7 @@ jit_symtab_line_mapping_add_impl (struct gdb_symbol_callbacks *cb, alloc_len = sizeof (struct linetable) + (nlines - 1) * sizeof (struct linetable_entry); - stab->linetable = (struct linetable *) xmalloc (alloc_len); + stab->linetable.reset (XNEWVAR (struct linetable, alloc_len)); stab->linetable->nitems = nlines; for (i = 0; i < nlines; i++) { @@ -632,7 +649,7 @@ static void finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) { struct compunit_symtab *cust; - struct gdb_block *gdb_block_iter, *gdb_block_iter_tmp; + struct gdb_block *gdb_block_iter; struct block *block_iter; int actual_nblocks, i; size_t blockvector_size; @@ -641,8 +658,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) actual_nblocks = FIRST_LOCAL_BLOCK + stab->nblocks; - cust = allocate_compunit_symtab (objfile, stab->file_name); - allocate_symtab (cust, stab->file_name); + cust = allocate_compunit_symtab (objfile, stab->file_name.c_str ()); + allocate_symtab (cust, stab->file_name.c_str ()); add_compunit_symtab_to_objfile (cust); /* JIT compilers compile in memory. */ @@ -656,8 +673,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) + sizeof (struct linetable)); SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)) = (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size); - memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), stab->linetable, - size); + memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), + stab->linetable.get (), size); } blockvector_size = (sizeof (struct blockvector) @@ -758,20 +775,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) } } - /* Free memory. */ - gdb_block_iter = stab->blocks; - - for (gdb_block_iter = stab->blocks, gdb_block_iter_tmp = gdb_block_iter->next; - gdb_block_iter; - 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); - } - xfree (stab->linetable); - xfree ((char *) stab->file_name); - xfree (stab); + delete stab; } /* Called when closing a gdb_objfile. Converts OBJ to a proper -- 2.30.2