X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fprogspace.c;h=3cb0d4c61e3966eb571e18b92fdb7a0fa0c8906a;hb=343cc95202fce70383551053f2efab09c5e02366;hp=e6c4f55c4e8b1c39dda555ff7a019d3ec84f4a89;hpb=234529260a90b6ac6ed38ddac45d6ed15149e8f8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/progspace.c b/gdb/progspace.c index e6c4f55c4e..3cb0d4c61e 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -23,8 +23,10 @@ #include "arch-utils.h" #include "gdbcore.h" #include "solib.h" +#include "solist.h" #include "gdbthread.h" #include "inferior.h" +#include /* The last program space number assigned. */ int last_program_space_num = 0; @@ -156,48 +158,48 @@ 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 (struct objfile *objfile, struct objfile *before) { - struct objfile **objpp; - - for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next)) + if (before == nullptr) + objfiles_list.push_back (objfile); + else { - if (*objpp == objfile) - { - *objpp = (*objpp)->next; - objfile->next = NULL; + auto iter = std::find (objfiles_list.begin (), objfiles_list.end (), + before); + gdb_assert (iter != objfiles_list.end ()); + objfiles_list.insert (iter, objfile); + } +} - if (objfile == symfile_object_file) - symfile_object_file = NULL; +/* See progspace.h. */ - return; - } - } +void +program_space::remove_objfile (struct objfile *objfile) +{ + auto iter = std::find (objfiles_list.begin (), objfiles_list.end (), + objfile); + gdb_assert (iter != objfiles_list.end ()); + objfiles_list.erase (iter); - internal_error (__FILE__, __LINE__, - _("remove_objfile: objfile already unlinked")); + if (objfile == symfile_object_file) + symfile_object_file = NULL; } /* Copies program space SRC to DEST. Copies the main executable file,