ubsan: z8k: index 10 out of bounds for type 'unsigned int const[10]'
[deliverable/binutils-gdb.git] / gdb / progspace.c
index a39b34c923394863b42a01b8bb25fa9383969d02..96f8acc64cd59106eee203ca0962ce9b4b35fba8 100644 (file)
@@ -1,6 +1,6 @@
 /* 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;
@@ -156,56 +158,55 @@ program_space::~program_space ()
 /* 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 ();
+
+  clear_symtab_users (0);
 }
 
 /* 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,
This page took 0.024255 seconds and 4 git commands to generate.