X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fprogspace.h;h=e1fcc3c68d2e00932aaa68bee77f8fc080db2271;hb=234529260a90b6ac6ed38ddac45d6ed15149e8f8;hp=85c99a62091a61aab1d7af9341363d67c89348fc;hpb=55b11ddf16b97b9c50ed480bc9da8b3e1c6c4198;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/progspace.h b/gdb/progspace.h index 85c99a6209..e1fcc3c68d 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -1,6 +1,6 @@ /* Program and address space management, for GDB, the GNU debugger. - Copyright (C) 2009-2017 Free Software Foundation, Inc. + Copyright (C) 2009-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -22,9 +22,11 @@ #define PROGSPACE_H #include "target.h" -#include "vec.h" -#include "gdb_vecs.h" +#include "gdb_bfd.h" +#include "gdbsupport/gdb_vecs.h" #include "registry.h" +#include "gdbsupport/next-iterator.h" +#include "gdbsupport/safe-iterator.h" struct target_ops; struct bfd; @@ -35,9 +37,6 @@ struct address_space; struct program_space_data; struct address_space_data; -typedef struct so_list *so_list_ptr; -DEF_VEC_P (so_list_ptr); - /* A program space represents a symbolic view of an address space. Roughly speaking, it holds all the data associated with a non-running-yet program (main executable, main symbols), and when @@ -135,80 +134,121 @@ DEF_VEC_P (so_list_ptr); /* The program space structure. */ struct program_space +{ + program_space (address_space *aspace_); + ~program_space (); + + typedef next_adapter objfiles_range; + + /* Return an iterable object that can be used to iterate over all + objfiles. The basic use is in a foreach, like: + + for (objfile *objf : pspace->objfiles ()) { ... } */ + objfiles_range objfiles () + { + return objfiles_range (objfiles_head); + } + + typedef next_adapter>> + objfiles_safe_range; + + /* An iterable object that can be used to iterate over all objfiles. + The basic use is in a foreach, like: + + for (objfile *objf : pspace->objfiles_safe ()) { ... } + + This variant uses a basic_safe_iterator so that objfiles can be + deleted during iteration. */ + objfiles_safe_range objfiles_safe () { - /* Pointer to next in linked list. */ - struct program_space *next; - - /* Unique ID number. */ - int num; - - /* The main executable loaded into this program space. This is - managed by the exec target. */ - - /* The BFD handle for the main executable. */ - bfd *ebfd; - /* The last-modified time, from when the exec was brought in. */ - long ebfd_mtime; - /* Similar to bfd_get_filename (exec_bfd) but in original form given - by user, without symbolic links and pathname resolved. - It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */ - char *pspace_exec_filename; - - /* The address space attached to this program space. More than one - program space may be bound to the same address space. In the - traditional unix-like debugging scenario, this will usually - match the address space bound to the inferior, and is mostly - used by the breakpoints module for address matches. If the - target shares a program space for all inferiors and breakpoints - are global, then this field is ignored (we don't currently - support inferiors sharing a program space if the target doesn't - make breakpoints global). */ - struct address_space *aspace; - - /* True if this program space's section offsets don't yet represent - the final offsets of the "live" address space (that is, the - section addresses still require the relocation offsets to be - applied, and hence we can't trust the section addresses for - anything that pokes at live memory). E.g., for qOffsets - targets, or for PIE executables, until we connect and ask the - target for the final relocation offsets, the symbols we've used - to set breakpoints point at the wrong addresses. */ - int executing_startup; - - /* True if no breakpoints should be inserted in this program - space. */ - int breakpoints_not_allowed; - - /* The object file that the main symbol table was loaded from - (e.g. the argument to the "symbol-file" or "file" command). */ - struct objfile *symfile_object_file; - - /* All known objfiles are kept in a linked list. This points to - the head of this list. */ - struct objfile *objfiles; - - /* The set of target sections matching the sections mapped into - this program space. Managed by both exec_ops and solib.c. */ - struct target_section_table target_sections; - - /* List of shared objects mapped into this space. Managed by - solib.c. */ - struct so_list *so_list; - - /* Number of calls to solib_add. */ - unsigned solib_add_generation; - - /* When an solib is added, it is also added to this vector. This - is so we can properly report solib changes to the user. */ - VEC (so_list_ptr) *added_solibs; - - /* When an solib is removed, its name is added to this vector. - This is so we can properly report solib changes to the user. */ - VEC (char_ptr) *deleted_solibs; - - /* Per pspace data-pointers required by other GDB modules. */ - REGISTRY_FIELDS; - }; + return objfiles_safe_range (objfiles_head); + } + + /* Add OBJFILE to the list of objfiles, putting it just before + BEFORE. If BEFORE is nullptr, it will go at the end of the + list. */ + void add_objfile (struct objfile *objfile, struct objfile *before); + + /* Remove OBJFILE from the list of objfiles. */ + void remove_objfile (struct objfile *objfile); + + /* Pointer to next in linked list. */ + struct program_space *next = NULL; + + /* Unique ID number. */ + int num = 0; + + /* The main executable loaded into this program space. This is + managed by the exec target. */ + + /* The BFD handle for the main executable. */ + bfd *ebfd = NULL; + /* The last-modified time, from when the exec was brought in. */ + long ebfd_mtime = 0; + /* Similar to bfd_get_filename (exec_bfd) but in original form given + by user, without symbolic links and pathname resolved. + It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */ + char *pspace_exec_filename = NULL; + + /* Binary file diddling handle for the core file. */ + gdb_bfd_ref_ptr cbfd; + + /* The address space attached to this program space. More than one + program space may be bound to the same address space. In the + traditional unix-like debugging scenario, this will usually + match the address space bound to the inferior, and is mostly + used by the breakpoints module for address matches. If the + target shares a program space for all inferiors and breakpoints + are global, then this field is ignored (we don't currently + support inferiors sharing a program space if the target doesn't + make breakpoints global). */ + struct address_space *aspace = NULL; + + /* True if this program space's section offsets don't yet represent + the final offsets of the "live" address space (that is, the + section addresses still require the relocation offsets to be + applied, and hence we can't trust the section addresses for + anything that pokes at live memory). E.g., for qOffsets + targets, or for PIE executables, until we connect and ask the + target for the final relocation offsets, the symbols we've used + to set breakpoints point at the wrong addresses. */ + int executing_startup = 0; + + /* True if no breakpoints should be inserted in this program + space. */ + int breakpoints_not_allowed = 0; + + /* The object file that the main symbol table was loaded from + (e.g. the argument to the "symbol-file" or "file" command). */ + struct objfile *symfile_object_file = NULL; + + /* All known objfiles are kept in a linked list. This points to + the head of this list. */ + struct objfile *objfiles_head = NULL; + + /* The set of target sections matching the sections mapped into + this program space. Managed by both exec_ops and solib.c. */ + struct target_section_table target_sections {}; + + /* List of shared objects mapped into this space. Managed by + solib.c. */ + struct so_list *so_list = NULL; + + /* Number of calls to solib_add. */ + unsigned int solib_add_generation = 0; + + /* When an solib is added, it is also added to this vector. This + is so we can properly report solib changes to the user. */ + std::vector added_solibs; + + /* When an solib is removed, its name is added to this vector. + This is so we can properly report solib changes to the user. */ + std::vector deleted_solibs; + + /* Per pspace data-pointers required by other GDB modules. */ + REGISTRY_FIELDS {}; +}; /* An address space. It is used for comparing if pspaces/inferior/threads see the same address space and for @@ -228,7 +268,7 @@ struct address_space /* All known objfiles are kept in a linked list. This points to the root of this list. */ -#define object_files current_program_space->objfiles +#define object_files current_program_space->objfiles_head /* The set of target sections matching the sections mapped into the current program space. */ @@ -243,10 +283,6 @@ extern struct program_space *current_program_space; #define ALL_PSPACES(pspace) \ for ((pspace) = program_spaces; (pspace) != NULL; (pspace) = (pspace)->next) -/* Add a new empty program space, and assign ASPACE to it. Returns the - pointer to the new object. */ -extern struct program_space *add_program_space (struct address_space *aspace); - /* Remove a program space from the program spaces list and release it. It is an error to call this function while PSPACE is the current program space. */ extern void delete_program_space (struct program_space *pspace);