Remove munmap_listp_free_cleanup

This removes munmap_listp_free_cleanup, replacing it with a
std::unique_ptr at one spot and an explicit delete in another.  It
seemed simplest to completely change this data structure.

gdb/ChangeLog
2018-09-18  Tom Tromey  <tom@tromey.com>

	* compile/compile-object-run.c (do_module_cleanup): Use delete.
	* compile/compile-object-load.c (struct munmap_list): Move to
	header file.
	(munmap_list::add): Rename from munmap_list_add; rewrite.
	(munmap_list::~munmap_list): Rename from munmap_list_free.
	(munmap_listp_free_cleanup): Remove.
	(compile_object_load): Update.
	* compile/compile-object-load.h (struct munmap_list): Move from
	compile-object-load.c.  Rewrite.
This commit is contained in:
Tom Tromey 2018-09-15 14:45:51 -06:00
parent 8ff71a9c80
commit c9e0a7e333
4 changed files with 59 additions and 68 deletions

View file

@ -1,3 +1,15 @@
2018-09-18 Tom Tromey <tom@tromey.com>
* compile/compile-object-run.c (do_module_cleanup): Use delete.
* compile/compile-object-load.c (struct munmap_list): Move to
header file.
(munmap_list::add): Rename from munmap_list_add; rewrite.
(munmap_list::~munmap_list): Rename from munmap_list_free.
(munmap_listp_free_cleanup): Remove.
(compile_object_load): Update.
* compile/compile-object-load.h (struct munmap_list): Move from
compile-object-load.c. Rewrite.
2018-09-18 Alan Hayward <alan.hayward@arm.com> 2018-09-18 Alan Hayward <alan.hayward@arm.com>
* aarch64-tdep.c (pass_in_v): Use register size. * aarch64-tdep.c (pass_in_v): Use register size.

View file

@ -34,56 +34,22 @@
#include "arch-utils.h" #include "arch-utils.h"
#include <algorithm> #include <algorithm>
/* Track inferior memory reserved by inferior mmap. */ /* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to the
list. */
struct munmap_list
{
struct munmap_list *next;
CORE_ADDR addr, size;
};
/* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to list
HEADP. *HEADP needs to be initialized to NULL. */
static void
munmap_list_add (struct munmap_list **headp, CORE_ADDR addr, CORE_ADDR size)
{
struct munmap_list *head_new = XNEW (struct munmap_list);
head_new->next = *headp;
*headp = head_new;
head_new->addr = addr;
head_new->size = size;
}
/* Free list of inferior mmap memory ranges HEAD. HEAD is the first
element of the list, it can be NULL. After calling this function
HEAD pointer is invalid and the possible list needs to be
reinitialized by caller to NULL. */
void void
munmap_list_free (struct munmap_list *head) munmap_list::add (CORE_ADDR addr, CORE_ADDR size)
{ {
while (head) struct munmap_item item = { addr, size };
{ items.push_back (item);
struct munmap_list *todo = head;
head = todo->next;
gdbarch_infcall_munmap (target_gdbarch (), todo->addr, todo->size);
xfree (todo);
}
} }
/* Stub for munmap_list_free suitable for make_cleanup. Contrary to /* Destroy an munmap_list. */
munmap_list_free this function's parameter is a pointer to the first
list element pointer. */
static void munmap_list::~munmap_list ()
munmap_listp_free_cleanup (void *headp_voidp)
{ {
struct munmap_list **headp = (struct munmap_list **) headp_voidp; for (auto &item : items)
gdbarch_infcall_munmap (target_gdbarch (), item.addr, item.size);
munmap_list_free (*headp);
} }
/* Helper data for setup_sections. */ /* Helper data for setup_sections. */
@ -105,7 +71,7 @@ struct setup_sections_data
/* List of inferior mmap ranges where setup_sections should add its /* List of inferior mmap ranges where setup_sections should add its
next range. */ next range. */
struct munmap_list **munmap_list_headp; std::unique_ptr<struct munmap_list> munmap_list;
}; };
/* Place all ABFD sections next to each other obeying all constraints. */ /* Place all ABFD sections next to each other obeying all constraints. */
@ -155,7 +121,7 @@ setup_sections (bfd *abfd, asection *sect, void *data_voidp)
{ {
addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size, addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size,
data->last_prot); data->last_prot);
munmap_list_add (data->munmap_list_headp, addr, data->last_size); data->munmap_list->add (addr, data->last_size);
if (compile_debug) if (compile_debug)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
"allocated %s bytes at %s prot %u\n", "allocated %s bytes at %s prot %u\n",
@ -611,7 +577,6 @@ struct compile_module *
compile_object_load (const compile_file_names &file_names, compile_object_load (const compile_file_names &file_names,
enum compile_i_scope_types scope, void *scope_data) enum compile_i_scope_types scope, void *scope_data)
{ {
struct cleanup *cleanups;
struct setup_sections_data setup_sections_data; struct setup_sections_data setup_sections_data;
CORE_ADDR regs_addr, out_value_addr = 0; CORE_ADDR regs_addr, out_value_addr = 0;
struct symbol *func_sym; struct symbol *func_sym;
@ -626,7 +591,6 @@ compile_object_load (const compile_file_names &file_names,
struct objfile *objfile; struct objfile *objfile;
int expect_parameters; int expect_parameters;
struct type *expect_return_type; struct type *expect_return_type;
struct munmap_list *munmap_list_head = NULL;
gdb::unique_xmalloc_ptr<char> filename gdb::unique_xmalloc_ptr<char> filename
(tilde_expand (file_names.object_file ())); (tilde_expand (file_names.object_file ()));
@ -648,8 +612,8 @@ compile_object_load (const compile_file_names &file_names,
setup_sections_data.last_section_first = abfd->sections; setup_sections_data.last_section_first = abfd->sections;
setup_sections_data.last_prot = -1; setup_sections_data.last_prot = -1;
setup_sections_data.last_max_alignment = 1; setup_sections_data.last_max_alignment = 1;
setup_sections_data.munmap_list_headp = &munmap_list_head; setup_sections_data.munmap_list.reset (new struct munmap_list);
cleanups = make_cleanup (munmap_listp_free_cleanup, &munmap_list_head);
bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data); bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data);
setup_sections (abfd.get (), NULL, &setup_sections_data); setup_sections (abfd.get (), NULL, &setup_sections_data);
@ -784,7 +748,7 @@ compile_object_load (const compile_file_names &file_names,
TYPE_LENGTH (regs_type), TYPE_LENGTH (regs_type),
GDB_MMAP_PROT_READ); GDB_MMAP_PROT_READ);
gdb_assert (regs_addr != 0); gdb_assert (regs_addr != 0);
munmap_list_add (&munmap_list_head, regs_addr, TYPE_LENGTH (regs_type)); setup_sections_data.munmap_list->add (regs_addr, TYPE_LENGTH (regs_type));
if (compile_debug) if (compile_debug)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
"allocated %s bytes at %s for registers\n", "allocated %s bytes at %s for registers\n",
@ -799,17 +763,14 @@ compile_object_load (const compile_file_names &file_names,
{ {
out_value_type = get_out_value_type (func_sym, objfile, scope); out_value_type = get_out_value_type (func_sym, objfile, scope);
if (out_value_type == NULL) if (out_value_type == NULL)
{
do_cleanups (cleanups);
return NULL; return NULL;
}
check_typedef (out_value_type); check_typedef (out_value_type);
out_value_addr = gdbarch_infcall_mmap (target_gdbarch (), out_value_addr = gdbarch_infcall_mmap (target_gdbarch (),
TYPE_LENGTH (out_value_type), TYPE_LENGTH (out_value_type),
(GDB_MMAP_PROT_READ (GDB_MMAP_PROT_READ
| GDB_MMAP_PROT_WRITE)); | GDB_MMAP_PROT_WRITE));
gdb_assert (out_value_addr != 0); gdb_assert (out_value_addr != 0);
munmap_list_add (&munmap_list_head, out_value_addr, setup_sections_data.munmap_list->add (out_value_addr,
TYPE_LENGTH (out_value_type)); TYPE_LENGTH (out_value_type));
if (compile_debug) if (compile_debug)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -828,12 +789,7 @@ compile_object_load (const compile_file_names &file_names,
retval->scope_data = scope_data; retval->scope_data = scope_data;
retval->out_value_type = out_value_type; retval->out_value_type = out_value_type;
retval->out_value_addr = out_value_addr; retval->out_value_addr = out_value_addr;
retval->munmap_list_head = setup_sections_data.munmap_list.release ();
/* CLEANUPS will free MUNMAP_LIST_HEAD. */
retval->munmap_list_head = munmap_list_head;
munmap_list_head = NULL;
do_cleanups (cleanups);
return retval; return retval;
} }

View file

@ -18,8 +18,31 @@
#define GDB_COMPILE_OBJECT_LOAD_H #define GDB_COMPILE_OBJECT_LOAD_H
#include "compile-internal.h" #include "compile-internal.h"
#include <list>
struct munmap_list; struct munmap_list
{
public:
munmap_list () = default;
~munmap_list ();
DISABLE_COPY_AND_ASSIGN (munmap_list);
/* Add a region to the list. */
void add (CORE_ADDR addr, CORE_ADDR size);
private:
/* Track inferior memory reserved by inferior mmap. */
struct munmap_item
{
CORE_ADDR addr, size;
};
std::vector<munmap_item> items;
};
struct compile_module struct compile_module
{ {

View file

@ -99,7 +99,7 @@ do_module_cleanup (void *arg, int registers_valid)
unlink (data->source_file); unlink (data->source_file);
xfree (data->source_file); xfree (data->source_file);
munmap_list_free (data->munmap_list_head); delete data->munmap_list_head;
/* Delete the .o file. */ /* Delete the .o file. */
unlink (data->objfile_name_string); unlink (data->objfile_name_string);