/* Program and address space management, for GDB, the GNU debugger.
- Copyright (C) 2009-2019 Free Software Foundation, Inc.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
This file is part of GDB.
\f
-/* Adds a new empty program space to the program space list, and binds
- it to ASPACE. Returns the pointer to the new object. */
+/* Add a program space from the program spaces list. */
-program_space::program_space (address_space *aspace_)
-: num (++last_program_space_num), aspace (aspace_)
+static void
+add_program_space (program_space *pspace)
{
- program_space_alloc_data (this);
-
if (program_spaces == NULL)
- program_spaces = this;
+ program_spaces = pspace;
else
{
- struct program_space *last;
+ program_space *last;
for (last = program_spaces; last->next != NULL; last = last->next)
;
- last->next = this;
+ last->next = pspace;
}
}
-/* Releases program space PSPACE, and all its contents (shared
- libraries, objfiles, and any other references to the PSPACE in
- other modules). It is an internal error to call this when PSPACE
- is the current program space, since there should always be a
- program space. */
+/* Remove a program space from the program spaces list. */
+
+static void
+remove_program_space (program_space *pspace)
+{
+ program_space *ss, **ss_link;
+ gdb_assert (pspace != NULL);
+
+ ss = program_spaces;
+ ss_link = &program_spaces;
+ while (ss != NULL)
+ {
+ if (ss == pspace)
+ {
+ *ss_link = ss->next;
+ return;
+ }
+
+ ss_link = &ss->next;
+ ss = *ss_link;
+ }
+}
+
+/* See progspace.h. */
+
+program_space::program_space (address_space *aspace_)
+ : num (++last_program_space_num),
+ aspace (aspace_)
+{
+ program_space_alloc_data (this);
+
+ add_program_space (this);
+}
+
+/* See progspace.h. */
program_space::~program_space ()
{
gdb_assert (this != current_program_space);
+ remove_program_space (this);
+
scoped_restore_current_program_space restore_pspace;
set_current_program_space (this);
no_shared_libraries (NULL, 0);
exec_close ();
free_all_objfiles ();
+ /* Defer breakpoint re-set because we don't want to create new
+ locations for this pspace which we're tearing down. */
+ clear_symtab_users (SYMFILE_DEFER_BP_RESET);
if (!gdbarch_has_shared_address_space (target_gdbarch ()))
free_address_space (this->aspace);
clear_section_table (&this->target_sections);
while (!objfiles_list.empty ())
objfiles_list.front ()->unlink ();
-
- clear_symtab_users (0);
}
/* See progspace.h. */
void
-program_space::add_objfile (struct objfile *objfile, struct objfile *before)
+program_space::add_objfile (std::shared_ptr<objfile> &&objfile,
+ struct objfile *before)
{
if (before == nullptr)
- objfiles_list.push_back (objfile);
+ objfiles_list.push_back (std::move (objfile));
else
{
- auto iter = std::find (objfiles_list.begin (), objfiles_list.end (),
- before);
+ auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
+ [=] (const std::shared_ptr<::objfile> &objf)
+ {
+ return objf.get () == before;
+ });
gdb_assert (iter != objfiles_list.end ());
- objfiles_list.insert (iter, objfile);
+ objfiles_list.insert (iter, std::move (objfile));
}
}
void
program_space::remove_objfile (struct objfile *objfile)
{
- auto iter = std::find (objfiles_list.begin (), objfiles_list.end (),
- objfile);
+ auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
+ [=] (const std::shared_ptr<::objfile> &objf)
+ {
+ return objf.get () == objfile;
+ });
gdb_assert (iter != objfiles_list.end ());
objfiles_list.erase (iter);
return 1;
}
-/* Remove a program space from the program spaces list and release it. It is
- an error to call this function while PSPACE is the current program space. */
-
-void
-delete_program_space (struct program_space *pspace)
-{
- struct program_space *ss, **ss_link;
- gdb_assert (pspace != NULL);
- gdb_assert (pspace != current_program_space);
-
- ss = program_spaces;
- ss_link = &program_spaces;
- while (ss != NULL)
- {
- if (ss == pspace)
- {
- *ss_link = ss->next;
- break;
- }
-
- ss_link = &ss->next;
- ss = *ss_link;
- }
-
- delete pspace;
-}
-
/* Prints the list of program spaces and their details on UIOUT. If
REQUESTED is not -1, it's the ID of the pspace that should be
printed. Otherwise, all spaces are printed. */