aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/progspace.h4
-rw-r--r--gdb/solib-aix.c14
-rw-r--r--gdb/solib-darwin.c13
-rw-r--r--gdb/solib-dsbt.c13
-rw-r--r--gdb/solib-frv.c14
-rw-r--r--gdb/solib-rocm.c20
-rw-r--r--gdb/solib-svr4.c43
-rw-r--r--gdb/solib-target.c15
-rw-r--r--gdb/solib.c23
-rw-r--r--gdb/solist.h4
10 files changed, 73 insertions, 90 deletions
diff --git a/gdb/progspace.h b/gdb/progspace.h
index 82c0a74..999e7a3 100644
--- a/gdb/progspace.h
+++ b/gdb/progspace.h
@@ -289,7 +289,7 @@ struct program_space
struct objfile *objfile_for_address (CORE_ADDR address);
/* Return the list of all the solibs in this program space. */
- intrusive_list<solib> &solibs ()
+ owning_intrusive_list<solib> &solibs ()
{ return so_list; }
/* Similar to `bfd_get_filename (exec_bfd ())` but in original form given
@@ -399,7 +399,7 @@ struct program_space
/* List of shared objects mapped into this space. Managed by
solib.c. */
- intrusive_list<solib> so_list;
+ owning_intrusive_list<solib> so_list;
/* Number of calls to solib_add. */
unsigned int solib_add_generation = 0;
diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c
index 1c319c2..926f1ed 100644
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -444,7 +444,7 @@ solib_aix_solib_create_inferior_hook (int from_tty)
/* Implement the "current_sos" solib_ops method. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
solib_aix_current_sos ()
{
std::optional<std::vector<lm_info_aix>> &library_list
@@ -452,14 +452,13 @@ solib_aix_current_sos ()
if (!library_list.has_value ())
return {};
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* Build a struct solib for each entry on the list.
We skip the first entry, since this is the entry corresponding
to the main executable, not a shared library. */
for (int ix = 1; ix < library_list->size (); ix++)
{
- solib *new_solib = new solib;
std::string so_name;
lm_info_aix &info = (*library_list)[ix];
@@ -481,12 +480,11 @@ solib_aix_current_sos ()
info.member_name.c_str ());
}
- new_solib->so_original_name = so_name;
- new_solib->so_name = so_name;
- new_solib->lm_info = std::make_unique<lm_info_aix> (info);
-
/* Add it to the list. */
- sos.push_back (*new_solib);
+ auto &new_solib = sos.emplace_back ();
+ new_solib.so_original_name = so_name;
+ new_solib.so_name = so_name;
+ new_solib.lm_info = std::make_unique<lm_info_aix> (info);
}
return sos;
diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
index c7a7f62..6c7d906 100644
--- a/gdb/solib-darwin.c
+++ b/gdb/solib-darwin.c
@@ -212,7 +212,7 @@ open_symbol_file_object (int from_tty)
/* Build a list of currently loaded shared objects. See solib-svr4.c. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
darwin_current_sos ()
{
type *ptr_type
@@ -230,7 +230,7 @@ darwin_current_sos ()
image_info_size = ptr_len * 3;
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* Read infos for each solib.
The first entry was rumored to be the executable itself, but this is not
@@ -272,16 +272,15 @@ darwin_current_sos ()
break;
/* Create and fill the new struct solib element. */
- solib *newobj = new solib;
+ auto &newobj = sos.emplace_back ();
auto li = std::make_unique<lm_info_darwin> ();
- newobj->so_name = file_path.get ();
- newobj->so_original_name = newobj->so_name;
+ newobj.so_name = file_path.get ();
+ newobj.so_original_name = newobj.so_name;
li->lm_addr = load_addr;
- newobj->lm_info = std::move (li);
- sos.push_back (*newobj);
+ newobj.lm_info = std::move (li);
}
return sos;
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index 2751ded..360aede 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -512,13 +512,13 @@ lm_base (void)
themselves. The declaration of `struct solib' says which fields
we provide values for. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
dsbt_current_sos (void)
{
bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
CORE_ADDR lm_addr;
dsbt_info *info = get_dsbt_info (current_program_space);
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* Make sure that the main executable has been relocated. This is
required in order to find the address of the global offset table,
@@ -594,7 +594,7 @@ dsbt_current_sos (void)
break;
}
- solib *sop = new solib;
+ auto &sop = sos.emplace_back ();
auto li = std::make_unique<lm_info_dsbt> ();
li->map = loadmap;
/* Fetch the name. */
@@ -612,12 +612,11 @@ dsbt_current_sos (void)
gdb_printf (gdb_stdlog, "current_sos: name = %s\n",
name_buf.get ());
- sop->so_name = name_buf.get ();
- sop->so_original_name = sop->so_name;
+ sop.so_name = name_buf.get ();
+ sop.so_original_name = sop.so_name;
}
- sop->lm_info = std::move (li);
- sos.push_back (*sop);
+ sop.lm_info = std::move (li);
}
else
{
diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c
index 2ce35c4..25873e6 100644
--- a/gdb/solib-frv.c
+++ b/gdb/solib-frv.c
@@ -306,12 +306,12 @@ lm_base (void)
/* Implement the "current_sos" solib_ops method. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
frv_current_sos ()
{
bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
CORE_ADDR lm_addr, mgot;
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* Make sure that the main executable has been relocated. This is
required in order to find the address of the global offset table,
@@ -377,12 +377,12 @@ frv_current_sos ()
break;
}
- solib *sop = new solib;
+ auto &sop = sos.emplace_back ();
auto li = std::make_unique<lm_info_frv> ();
li->map = loadmap;
li->got_value = got_addr;
li->lm_addr = lm_addr;
- sop->lm_info = std::move (li);
+ sop.lm_info = std::move (li);
/* Fetch the name. */
addr = extract_unsigned_integer (lm_buf.l_name,
@@ -397,11 +397,9 @@ frv_current_sos ()
warning (_("Can't read pathname for link map entry."));
else
{
- sop->so_name = name_buf.get ();
- sop->so_original_name = sop->so_name;
+ sop.so_name = name_buf.get ();
+ sop.so_original_name = sop.so_name;
}
-
- sos.push_back (*sop);
}
else
{
diff --git a/gdb/solib-rocm.c b/gdb/solib-rocm.c
index 9b995c7..156b36a 100644
--- a/gdb/solib-rocm.c
+++ b/gdb/solib-rocm.c
@@ -204,20 +204,18 @@ rocm_solib_handle_event ()
/* Create so_list objects from rocm_so objects in SOS. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
so_list_from_rocm_sos (const std::vector<rocm_so> &sos)
{
- intrusive_list<solib> dst;
+ owning_intrusive_list<solib> dst;
for (const rocm_so &so : sos)
{
- solib *newobj = new solib;
- newobj->lm_info = std::make_unique<lm_info_svr4> (*so.lm_info);
+ auto &newobj = dst.emplace_back ();
- newobj->so_name = so.name;
- newobj->so_original_name = so.unique_name;
-
- dst.push_back (*newobj);
+ newobj.lm_info = std::make_unique<lm_info_svr4> (*so.lm_info);
+ newobj.so_name = so.name;
+ newobj.so_original_name = so.unique_name;
}
return dst;
@@ -226,11 +224,11 @@ so_list_from_rocm_sos (const std::vector<rocm_so> &sos)
/* Build a list of `struct solib' objects describing the shared
objects currently loaded in the inferior. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
rocm_solib_current_sos ()
{
/* First, retrieve the host-side shared library list. */
- intrusive_list<solib> sos = svr4_so_ops.current_sos ();
+ owning_intrusive_list<solib> sos = svr4_so_ops.current_sos ();
/* Then, the device-side shared library list. */
std::vector<rocm_so> &dev_sos = get_solib_info (current_inferior ())->solib_list;
@@ -238,7 +236,7 @@ rocm_solib_current_sos ()
if (dev_sos.empty ())
return sos;
- intrusive_list<solib> dev_so_list = so_list_from_rocm_sos (dev_sos);
+ owning_intrusive_list<solib> dev_so_list = so_list_from_rocm_sos (dev_sos);
if (sos.empty ())
return dev_so_list;
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 5d23205..928d654 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -991,20 +991,18 @@ svr4_clear_so (const solib &so)
/* Create the so_list objects equivalent to the svr4_sos in SOS. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
so_list_from_svr4_sos (const std::vector<svr4_so> &sos)
{
- intrusive_list<solib> dst;
+ owning_intrusive_list<solib> dst;
for (const svr4_so &so : sos)
{
- struct solib *newobj = new struct solib;
+ auto &newobj = dst.emplace_back ();
- newobj->so_name = so.name;
- newobj->so_original_name = so.name;
- newobj->lm_info = std::make_unique<lm_info_svr4> (*so.lm_info);
-
- dst.push_back (*newobj);
+ newobj.so_name = so.name;
+ newobj.so_original_name = so.name;
+ newobj.lm_info = std::make_unique<lm_info_svr4> (*so.lm_info);
}
return dst;
@@ -1184,25 +1182,24 @@ svr4_current_sos_via_xfer_libraries (struct svr4_library_list *list,
/* If no shared library information is available from the dynamic
linker, build a fallback list from other sources. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
svr4_default_sos (svr4_info *info)
{
if (!info->debug_loader_offset_p)
return {};
- solib *newobj = new solib;
auto li = std::make_unique<lm_info_svr4> ();
/* Nothing will ever check the other fields if we set l_addr_p. */
li->l_addr = li->l_addr_inferior = info->debug_loader_offset;
li->l_addr_p = 1;
- newobj->lm_info = std::move (li);
- newobj->so_name = info->debug_loader_name;
- newobj->so_original_name = newobj->so_name;
+ owning_intrusive_list<solib> sos;
+ auto &newobj = sos.emplace_back ();
- intrusive_list<solib> sos;
- sos.push_back (*newobj);
+ newobj.lm_info = std::move (li);
+ newobj.so_name = info->debug_loader_name;
+ newobj.so_original_name = newobj.so_name;
return sos;
}
@@ -1373,10 +1370,10 @@ svr4_current_sos_direct (struct svr4_info *info)
/* Collect sos read and stored by the probes interface. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
svr4_collect_probes_sos (svr4_info *info)
{
- intrusive_list<solib> res;
+ owning_intrusive_list<solib> res;
for (const auto &tuple : info->solib_lists)
{
@@ -1390,10 +1387,10 @@ svr4_collect_probes_sos (svr4_info *info)
/* Implement the main part of the "current_sos" solib_ops
method. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
svr4_current_sos_1 (svr4_info *info)
{
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* If we're using the probes interface, we can use the cache as it will
be maintained by probe update/reload actions. */
@@ -1417,11 +1414,11 @@ svr4_current_sos_1 (svr4_info *info)
/* Implement the "current_sos" solib_ops method. */
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
svr4_current_sos ()
{
svr4_info *info = get_svr4_info (current_program_space);
- intrusive_list<solib> sos = svr4_current_sos_1 (info);
+ owning_intrusive_list<solib> sos = svr4_current_sos_1 (info);
struct mem_range vsyscall_range;
/* Filter out the vDSO module, if present. Its symbol file would
@@ -1478,9 +1475,7 @@ svr4_current_sos ()
if (vsyscall_range.contains (li->l_ld))
{
- auto next = sos.erase (so);
- delete &*so;
- so = next;
+ so = sos.erase (so);
break;
}
diff --git a/gdb/solib-target.c b/gdb/solib-target.c
index 3fffa7c..8f73d5d 100644
--- a/gdb/solib-target.c
+++ b/gdb/solib-target.c
@@ -226,10 +226,10 @@ solib_target_parse_libraries (const char *library)
}
#endif
-static intrusive_list<solib>
+static owning_intrusive_list<solib>
solib_target_current_sos (void)
{
- intrusive_list<solib> sos;
+ owning_intrusive_list<solib> sos;
/* Fetch the list of shared libraries. */
std::optional<gdb::char_vector> library_document
@@ -245,15 +245,12 @@ solib_target_current_sos (void)
/* Build a struct solib for each entry on the list. */
for (lm_info_target_up &info : library_list)
{
- solib *new_solib = new solib;
+ auto &new_solib = sos.emplace_back ();
/* We don't need a copy of the name in INFO anymore. */
- new_solib->so_name = std::move (info->name);
- new_solib->so_original_name = new_solib->so_name;
- new_solib->lm_info = std::move (info);
-
- /* Add it to the list. */
- sos.push_back (*new_solib);
+ new_solib.so_name = std::move (info->name);
+ new_solib.so_original_name = new_solib.so_name;
+ new_solib.lm_info = std::move (info);
}
return sos;
diff --git a/gdb/solib.c b/gdb/solib.c
index b123be3..5c926de 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -755,8 +755,8 @@ update_solib_list (int from_tty)
the time we're done walking GDB's list, the inferior's list
contains only the new shared objects, which we then add. */
- intrusive_list<solib> inferior = ops->current_sos ();
- intrusive_list<solib>::iterator gdb_iter
+ owning_intrusive_list<solib> inferior = ops->current_sos ();
+ owning_intrusive_list<solib>::iterator gdb_iter
= current_program_space->so_list.begin ();
while (gdb_iter != current_program_space->so_list.end ())
{
@@ -785,7 +785,6 @@ update_solib_list (int from_tty)
if (inferior_iter != inferior.end ())
{
inferior.erase (inferior_iter);
- delete &*inferior_iter;
++gdb_iter;
}
@@ -798,9 +797,6 @@ update_solib_list (int from_tty)
current_program_space->deleted_solibs.push_back (gdb_iter->so_name);
- intrusive_list<solib>::iterator gdb_iter_next
- = current_program_space->so_list.erase (gdb_iter);
-
/* Unless the user loaded it explicitly, free SO's objfile. */
if (gdb_iter->objfile != nullptr
&& !(gdb_iter->objfile->flags & OBJF_USERLOADED)
@@ -811,8 +807,7 @@ update_solib_list (int from_tty)
sections from so.abfd; remove them. */
current_program_space->remove_target_sections (&*gdb_iter);
- delete &*gdb_iter;
- gdb_iter = gdb_iter_next;
+ gdb_iter = current_program_space->so_list.erase (gdb_iter);
}
}
@@ -1151,11 +1146,13 @@ clear_solib (program_space *pspace)
disable_breakpoints_in_shlibs (pspace);
- pspace->so_list.clear_and_dispose ([pspace] (solib *so) {
- notify_solib_unloaded (pspace, *so);
- pspace->remove_target_sections (so);
- delete so;
- });
+ for (solib &so : pspace->so_list)
+ {
+ notify_solib_unloaded (pspace, so);
+ pspace->remove_target_sections (&so);
+ };
+
+ pspace->so_list.clear ();
if (ops->clear_solib != nullptr)
ops->clear_solib (pspace);
diff --git a/gdb/solist.h b/gdb/solist.h
index b898ae3..336bb01 100644
--- a/gdb/solist.h
+++ b/gdb/solist.h
@@ -20,9 +20,11 @@
#define SOLIST_H
#define SO_NAME_MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */
+
/* For domain_enum domain. */
#include "symtab.h"
#include "gdb_bfd.h"
+#include "gdbsupport/owning_intrusive_list.h"
#include "target-section.h"
/* Base class for target-specific link map information. */
@@ -119,7 +121,7 @@ struct solib_ops
inferior --- we don't examine any of the shared library files
themselves. The declaration of `struct solib' says which fields
we provide values for. */
- intrusive_list<solib> (*current_sos) ();
+ owning_intrusive_list<solib> (*current_sos) ();
/* Find, open, and read the symbols for the main executable. If
FROM_TTY is non-zero, allow messages to be printed. */