aboutsummaryrefslogtreecommitdiff
path: root/gdb/compile
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-09-15 14:53:53 -0600
committerTom Tromey <tom@tromey.com>2018-09-18 10:18:04 -0600
commit40f03055a23b7d77e18e14264046d8e21b6abf67 (patch)
tree47aa3286077ca10dbee01d4d2043025ca49395d7 /gdb/compile
parentc9e0a7e333107ad140d9e15110f8820115921555 (diff)
downloadgdb-40f03055a23b7d77e18e14264046d8e21b6abf67.zip
gdb-40f03055a23b7d77e18e14264046d8e21b6abf67.tar.gz
gdb-40f03055a23b7d77e18e14264046d8e21b6abf67.tar.bz2
Remove remaining cleanups from compile-object-load.c
This removes the remaining cleanups from compile-object-load.c. gdb/ChangeLog 2018-09-18 Tom Tromey <tom@tromey.com> * compile/compile-object-load.c (struct link_hash_table_cleanup_data): Add constructor and destructor. Use DISABLE_COPY_AND_ASSIGN. (~link_hash_table_cleanup_data): Rename from link_hash_table_free. Now a destructor. (copy_sections): Use gdb::unique_xmalloc_ptr. Remove cleanups.
Diffstat (limited to 'gdb/compile')
-rw-r--r--gdb/compile/compile-object-load.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c
index 9a6069f..1a7b633 100644
--- a/gdb/compile/compile-object-load.c
+++ b/gdb/compile/compile-object-load.c
@@ -49,7 +49,18 @@ munmap_list::add (CORE_ADDR addr, CORE_ADDR size)
munmap_list::~munmap_list ()
{
for (auto &item : items)
- gdbarch_infcall_munmap (target_gdbarch (), item.addr, item.size);
+ {
+ TRY
+ {
+ gdbarch_infcall_munmap (target_gdbarch (), item.addr, item.size);
+ }
+ CATCH (ex, RETURN_MASK_ERROR)
+ {
+ /* There's not much the user can do, so just ignore
+ this. */
+ }
+ END_CATCH
+ }
}
/* Helper data for setup_sections. */
@@ -282,22 +293,26 @@ static const struct bfd_link_callbacks link_callbacks =
struct link_hash_table_cleanup_data
{
- bfd *abfd;
- bfd *link_next;
-};
+ explicit link_hash_table_cleanup_data (bfd *abfd_)
+ : abfd (abfd_),
+ link_next (abfd->link.next)
+ {
+ }
-/* Cleanup callback for struct bfd_link_info. */
+ ~link_hash_table_cleanup_data ()
+ {
+ if (abfd->is_linker_output)
+ (*abfd->link.hash->hash_table_free) (abfd);
+ abfd->link.next = link_next;
+ }
-static void
-link_hash_table_free (void *d)
-{
- struct link_hash_table_cleanup_data *data
- = (struct link_hash_table_cleanup_data *) d;
+ DISABLE_COPY_AND_ASSIGN (link_hash_table_cleanup_data);
- if (data->abfd->is_linker_output)
- (*data->abfd->link.hash->hash_table_free) (data->abfd);
- data->abfd->link.next = data->link_next;
-}
+private:
+
+ bfd *abfd;
+ bfd *link_next;
+};
/* Relocate and store into inferior memory each section SECT of ABFD. */
@@ -305,12 +320,10 @@ static void
copy_sections (bfd *abfd, asection *sect, void *data)
{
asymbol **symbol_table = (asymbol **) data;
- bfd_byte *sect_data, *sect_data_got;
- struct cleanup *cleanups;
+ bfd_byte *sect_data_got;
struct bfd_link_info link_info;
struct bfd_link_order link_order;
CORE_ADDR inferior_addr;
- struct link_hash_table_cleanup_data cleanup_data;
if ((bfd_get_section_flags (abfd, sect) & (SEC_ALLOC | SEC_LOAD))
!= (SEC_ALLOC | SEC_LOAD))
@@ -326,13 +339,11 @@ copy_sections (bfd *abfd, asection *sect, void *data)
link_info.input_bfds = abfd;
link_info.input_bfds_tail = &abfd->link.next;
- cleanup_data.abfd = abfd;
- cleanup_data.link_next = abfd->link.next;
+ struct link_hash_table_cleanup_data cleanup_data (abfd);
abfd->link.next = NULL;
link_info.hash = bfd_link_hash_table_create (abfd);
- cleanups = make_cleanup (link_hash_table_free, &cleanup_data);
link_info.callbacks = &link_callbacks;
memset (&link_order, 0, sizeof (link_order));
@@ -342,21 +353,22 @@ copy_sections (bfd *abfd, asection *sect, void *data)
link_order.size = bfd_get_section_size (sect);
link_order.u.indirect.section = sect;
- sect_data = (bfd_byte *) xmalloc (bfd_get_section_size (sect));
- make_cleanup (xfree, sect_data);
+ gdb::unique_xmalloc_ptr<gdb_byte> sect_data
+ ((bfd_byte *) xmalloc (bfd_get_section_size (sect)));
sect_data_got = bfd_get_relocated_section_contents (abfd, &link_info,
- &link_order, sect_data,
+ &link_order,
+ sect_data.get (),
FALSE, symbol_table);
if (sect_data_got == NULL)
error (_("Cannot map compiled module \"%s\" section \"%s\": %s"),
bfd_get_filename (abfd), bfd_get_section_name (abfd, sect),
bfd_errmsg (bfd_get_error ()));
- gdb_assert (sect_data_got == sect_data);
+ gdb_assert (sect_data_got == sect_data.get ());
inferior_addr = bfd_get_section_vma (abfd, sect);
- if (0 != target_write_memory (inferior_addr, sect_data,
+ if (0 != target_write_memory (inferior_addr, sect_data.get (),
bfd_get_section_size (sect)))
error (_("Cannot write compiled module \"%s\" section \"%s\" "
"to inferior memory range %s-%s."),
@@ -364,8 +376,6 @@ copy_sections (bfd *abfd, asection *sect, void *data)
paddress (target_gdbarch (), inferior_addr),
paddress (target_gdbarch (),
inferior_addr + bfd_get_section_size (sect)));
-
- do_cleanups (cleanups);
}
/* Fetch the type of COMPILE_I_EXPR_PTR_TYPE and COMPILE_I_EXPR_VAL