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>
* aarch64-tdep.c (pass_in_v): Use register size.

View File

@ -34,56 +34,22 @@
#include "arch-utils.h"
#include <algorithm>
/* Track inferior memory reserved by inferior mmap. */
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. */
/* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to the
list. */
void
munmap_list_free (struct munmap_list *head)
munmap_list::add (CORE_ADDR addr, CORE_ADDR size)
{
while (head)
{
struct munmap_list *todo = head;
head = todo->next;
gdbarch_infcall_munmap (target_gdbarch (), todo->addr, todo->size);
xfree (todo);
}
struct munmap_item item = { addr, size };
items.push_back (item);
}
/* Stub for munmap_list_free suitable for make_cleanup. Contrary to
munmap_list_free this function's parameter is a pointer to the first
list element pointer. */
/* Destroy an munmap_list. */
static void
munmap_listp_free_cleanup (void *headp_voidp)
munmap_list::~munmap_list ()
{
struct munmap_list **headp = (struct munmap_list **) headp_voidp;
munmap_list_free (*headp);
for (auto &item : items)
gdbarch_infcall_munmap (target_gdbarch (), item.addr, item.size);
}
/* Helper data for setup_sections. */
@ -105,7 +71,7 @@ struct setup_sections_data
/* List of inferior mmap ranges where setup_sections should add its
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. */
@ -155,7 +121,7 @@ setup_sections (bfd *abfd, asection *sect, void *data_voidp)
{
addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size,
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)
fprintf_unfiltered (gdb_stdlog,
"allocated %s bytes at %s prot %u\n",
@ -611,7 +577,6 @@ struct compile_module *
compile_object_load (const compile_file_names &file_names,
enum compile_i_scope_types scope, void *scope_data)
{
struct cleanup *cleanups;
struct setup_sections_data setup_sections_data;
CORE_ADDR regs_addr, out_value_addr = 0;
struct symbol *func_sym;
@ -626,7 +591,6 @@ compile_object_load (const compile_file_names &file_names,
struct objfile *objfile;
int expect_parameters;
struct type *expect_return_type;
struct munmap_list *munmap_list_head = NULL;
gdb::unique_xmalloc_ptr<char> filename
(tilde_expand (file_names.object_file ()));
@ -648,15 +612,15 @@ compile_object_load (const compile_file_names &file_names,
setup_sections_data.last_section_first = abfd->sections;
setup_sections_data.last_prot = -1;
setup_sections_data.last_max_alignment = 1;
setup_sections_data.munmap_list_headp = &munmap_list_head;
cleanups = make_cleanup (munmap_listp_free_cleanup, &munmap_list_head);
setup_sections_data.munmap_list.reset (new struct munmap_list);
bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data);
setup_sections (abfd.get (), NULL, &setup_sections_data);
storage_needed = bfd_get_symtab_upper_bound (abfd.get ());
if (storage_needed < 0)
error (_("Cannot read symbols of compiled module \"%s\": %s"),
filename.get (), bfd_errmsg (bfd_get_error ()));
filename.get (), bfd_errmsg (bfd_get_error ()));
/* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in
"Reading symbols from ..." message for automatically generated file. */
@ -703,8 +667,8 @@ compile_object_load (const compile_file_names &file_names,
objfile_name (objfile));
if (!types_deeply_equal (expect_return_type, TYPE_TARGET_TYPE (func_type)))
error (_("Invalid return type of function \"%s\" in compiled "
"module \"%s\"."),
GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
"module \"%s\"."),
GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
/* The memory may be later needed
by bfd_generic_get_relocated_section_contents
@ -714,7 +678,7 @@ compile_object_load (const compile_file_names &file_names,
number_of_symbols = bfd_canonicalize_symtab (abfd.get (), symbol_table);
if (number_of_symbols < 0)
error (_("Cannot parse symbols of compiled module \"%s\": %s"),
filename.get (), bfd_errmsg (bfd_get_error ()));
filename.get (), bfd_errmsg (bfd_get_error ()));
missing_symbols = 0;
for (symp = symbol_table; symp < symbol_table + number_of_symbols; symp++)
@ -784,7 +748,7 @@ compile_object_load (const compile_file_names &file_names,
TYPE_LENGTH (regs_type),
GDB_MMAP_PROT_READ);
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)
fprintf_unfiltered (gdb_stdlog,
"allocated %s bytes at %s for registers\n",
@ -799,18 +763,15 @@ compile_object_load (const compile_file_names &file_names,
{
out_value_type = get_out_value_type (func_sym, objfile, scope);
if (out_value_type == NULL)
{
do_cleanups (cleanups);
return NULL;
}
return NULL;
check_typedef (out_value_type);
out_value_addr = gdbarch_infcall_mmap (target_gdbarch (),
TYPE_LENGTH (out_value_type),
(GDB_MMAP_PROT_READ
| GDB_MMAP_PROT_WRITE));
gdb_assert (out_value_addr != 0);
munmap_list_add (&munmap_list_head, out_value_addr,
TYPE_LENGTH (out_value_type));
setup_sections_data.munmap_list->add (out_value_addr,
TYPE_LENGTH (out_value_type));
if (compile_debug)
fprintf_unfiltered (gdb_stdlog,
"allocated %s bytes at %s for printed value\n",
@ -828,12 +789,7 @@ compile_object_load (const compile_file_names &file_names,
retval->scope_data = scope_data;
retval->out_value_type = out_value_type;
retval->out_value_addr = out_value_addr;
/* CLEANUPS will free MUNMAP_LIST_HEAD. */
retval->munmap_list_head = munmap_list_head;
munmap_list_head = NULL;
do_cleanups (cleanups);
retval->munmap_list_head = setup_sections_data.munmap_list.release ();
return retval;
}

View File

@ -18,8 +18,31 @@
#define GDB_COMPILE_OBJECT_LOAD_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
{

View File

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