+/* See progspace.h. */
+
+void
+program_space::free_all_objfiles ()
+{
+ /* Any objfile reference would become stale. */
+ for (struct so_list *so : current_program_space->solibs ())
+ gdb_assert (so->objfile == NULL);
+
+ while (!objfiles_list.empty ())
+ objfiles_list.front ()->unlink ();
+}
+
+/* See progspace.h. */
+
+void
+program_space::add_objfile (std::shared_ptr<objfile> &&objfile,
+ struct objfile *before)
+{
+ if (before == nullptr)
+ objfiles_list.push_back (std::move (objfile));
+ else
+ {
+ 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));
+ }
+}
+
+/* See progspace.h. */
+
+void
+program_space::remove_objfile (struct objfile *objfile)
+{
+ /* Removing an objfile from the objfile list invalidates any frame
+ that was built using frame info found in the objfile. Reinit the
+ frame cache to get rid of any frame that might otherwise
+ reference stale info. */
+ reinit_frame_cache ();
+
+ 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;
+}
+
+/* See progspace.h. */
+
+void
+program_space::exec_close ()
+{
+ if (ebfd != nullptr)
+ {
+ /* Removing target sections may close the exec_ops target.
+ Clear ebfd before doing so to prevent recursion. */
+ ebfd.reset (nullptr);
+ ebfd_mtime = 0;
+
+ remove_target_sections (&ebfd);
+
+ exec_filename.reset (nullptr);
+ }
+}
+