/* 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.
#include "arch-utils.h"
#include "gdbcore.h"
#include "solib.h"
+#include "solist.h"
#include "gdbthread.h"
#include "inferior.h"
+#include <algorithm>
/* The last program space number assigned. */
int last_program_space_num = 0;
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);
/* See progspace.h. */
void
-program_space::add_objfile (struct objfile *objfile, struct objfile *before)
+program_space::free_all_objfiles ()
{
- for (struct objfile **objp = &objfiles_head;
- *objp != NULL;
- objp = &((*objp)->next))
- {
- if (*objp == before)
- {
- objfile->next = *objp;
- *objp = objfile;
- return;
- }
- }
+ struct so_list *so;
- internal_error (__FILE__, __LINE__,
- _("put_objfile_before: before objfile not in list"));
+ /* Any objfile reference would become stale. */
+ for (so = master_so_list (); so; so = so->next)
+ gdb_assert (so->objfile == NULL);
+ while (!objfiles_list.empty ())
+ objfiles_list.front ()->unlink ();
}
/* See progspace.h. */
void
-program_space::remove_objfile (struct objfile *objfile)
+program_space::add_objfile (std::shared_ptr<objfile> &&objfile,
+ struct objfile *before)
{
- struct objfile **objpp;
-
- for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
+ if (before == nullptr)
+ objfiles_list.push_back (std::move (objfile));
+ else
{
- if (*objpp == objfile)
- {
- *objpp = (*objpp)->next;
- objfile->next = NULL;
-
- if (objfile == symfile_object_file)
- symfile_object_file = NULL;
-
- return;
- }
+ 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, std::move (objfile));
}
-
- internal_error (__FILE__, __LINE__,
- _("remove_objfile: objfile already unlinked"));
}
/* See progspace.h. */
-bool
-program_space::multi_objfile_p () const
+void
+program_space::remove_objfile (struct objfile *objfile)
{
- return objfiles_head != nullptr && objfiles_head->next != nullptr;
+ 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);
+
+ if (objfile == symfile_object_file)
+ symfile_object_file = NULL;
}
/* Copies program space SRC to DEST. Copies the main executable file,