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:
parent
8ff71a9c80
commit
c9e0a7e333
4 changed files with 59 additions and 68 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue