X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fprogspace.c;h=1d8aaea2caa8d13737ba1be5e021be422f7cc0eb;hb=7d7167ce1b93f8bb151daa2572314987eaeb9e3c;hp=e0bcc5a18d68a0dced558098eca37a39f7d28987;hpb=6fb16ce6eaba92b86a22eac58eb0eb61b3fd8804;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/progspace.c b/gdb/progspace.c index e0bcc5a18d..1d8aaea2ca 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -1,6 +1,6 @@ /* Program and address space management, for GDB, the GNU debugger. - Copyright (C) 2009-2018 Free Software Foundation, Inc. + Copyright (C) 2009-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -23,7 +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; @@ -152,6 +155,60 @@ program_space::~program_space () program_space_free_data (this); } +/* See progspace.h. */ + +void +program_space::free_all_objfiles () +{ + struct so_list *so; + + /* 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::add_objfile (std::shared_ptr &&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) +{ + 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, and the main symbol file. Returns DEST. */ @@ -166,7 +223,8 @@ clone_program_space (struct program_space *dest, struct program_space *src) exec_file_attach (src->pspace_exec_filename, 0); if (src->symfile_object_file != NULL) - symbol_file_add_main (objfile_name (src->symfile_object_file), 0); + symbol_file_add_main (objfile_name (src->symfile_object_file), + SYMFILE_DEFER_BP_RESET); return dest; } @@ -270,7 +328,7 @@ print_program_space (struct ui_out *uiout, int requested) else uiout->field_skip ("current"); - uiout->field_int ("id", pspace->num); + uiout->field_signed ("id", pspace->num); if (pspace->pspace_exec_filename) uiout->field_string ("exec", pspace->pspace_exec_filename); @@ -291,12 +349,12 @@ print_program_space (struct ui_out *uiout, int requested) printed_header = 1; printf_filtered ("\n\tBound inferiors: ID %d (%s)", inf->num, - target_pid_to_str (pid_to_ptid (inf->pid))); + target_pid_to_str (ptid_t (inf->pid)).c_str ()); } else printf_filtered (", ID %d (%s)", inf->num, - target_pid_to_str (pid_to_ptid (inf->pid))); + target_pid_to_str (ptid_t (inf->pid)).c_str ()); } uiout->text ("\n"); @@ -399,8 +457,7 @@ update_address_spaces (void) void clear_program_space_solib_cache (struct program_space *pspace) { - VEC_free (so_list_ptr, pspace->added_solibs); - + pspace->added_solibs.clear (); pspace->deleted_solibs.clear (); }