X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fprogspace.h;h=5fe2f6c755efd19491bc3701d2ba8aa105110164;hb=8aaaf7577f070c91086533d959ac36a15d1d604f;hp=e1fcc3c68d2e00932aaa68bee77f8fc080db2271;hpb=234529260a90b6ac6ed38ddac45d6ed15149e8f8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/progspace.h b/gdb/progspace.h index e1fcc3c68d..5fe2f6c755 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -27,6 +27,7 @@ #include "registry.h" #include "gdbsupport/next-iterator.h" #include "gdbsupport/safe-iterator.h" +#include struct target_ops; struct bfd; @@ -37,6 +38,79 @@ struct address_space; struct program_space_data; struct address_space_data; +typedef std::list> objfile_list; + +/* An iterator that wraps an iterator over std::shared_ptr, + and dereferences the returned object. This is useful for iterating + over a list of shared pointers and returning raw pointers -- which + helped avoid touching a lot of code when changing how objfiles are + managed. */ + +class unwrapping_objfile_iterator +{ +public: + + typedef unwrapping_objfile_iterator self_type; + typedef typename ::objfile *value_type; + typedef typename ::objfile &reference; + typedef typename ::objfile **pointer; + typedef typename objfile_list::iterator::iterator_category iterator_category; + typedef typename objfile_list::iterator::difference_type difference_type; + + unwrapping_objfile_iterator (const objfile_list::iterator &iter) + : m_iter (iter) + { + } + + objfile *operator* () const + { + return m_iter->get (); + } + + unwrapping_objfile_iterator operator++ () + { + ++m_iter; + return *this; + } + + bool operator!= (const unwrapping_objfile_iterator &other) const + { + return m_iter != other.m_iter; + } + +private: + + /* The underlying iterator. */ + objfile_list::iterator m_iter; +}; + + +/* A range that returns unwrapping_objfile_iterators. */ + +struct unwrapping_objfile_range +{ + typedef unwrapping_objfile_iterator iterator; + + unwrapping_objfile_range (objfile_list &ol) + : m_list (ol) + { + } + + iterator begin () const + { + return iterator (m_list.begin ()); + } + + iterator end () const + { + return iterator (m_list.end ()); + } + +private: + + objfile_list &m_list; +}; + /* 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 @@ -138,7 +212,7 @@ struct program_space program_space (address_space *aspace_); ~program_space (); - typedef next_adapter objfiles_range; + typedef unwrapping_objfile_range objfiles_range; /* Return an iterable object that can be used to iterate over all objfiles. The basic use is in a foreach, like: @@ -146,12 +220,10 @@ struct program_space for (objfile *objf : pspace->objfiles ()) { ... } */ objfiles_range objfiles () { - return objfiles_range (objfiles_head); + return unwrapping_objfile_range (objfiles_list); } - typedef next_adapter>> - objfiles_safe_range; + typedef basic_safe_range objfiles_safe_range; /* An iterable object that can be used to iterate over all objfiles. The basic use is in a foreach, like: @@ -162,17 +234,29 @@ struct program_space deleted during iteration. */ objfiles_safe_range objfiles_safe () { - return objfiles_safe_range (objfiles_head); + return objfiles_safe_range (objfiles_list); } /* 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); + void add_objfile (std::shared_ptr &&objfile, + struct objfile *before); /* Remove OBJFILE from the list of objfiles. */ void remove_objfile (struct objfile *objfile); + /* Return true if there is more than one object file loaded; false + otherwise. */ + bool multi_objfile_p () const + { + return objfiles_list.size () > 1; + } + + /* Free all the objfiles associated with this program space. */ + void free_all_objfiles (); + + /* Pointer to next in linked list. */ struct program_space *next = NULL; @@ -223,9 +307,8 @@ struct program_space (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; + /* All known objfiles are kept in a linked list. */ + std::list> objfiles_list; /* The set of target sections matching the sections mapped into this program space. Managed by both exec_ops and solib.c. */ @@ -266,10 +349,6 @@ struct address_space #define symfile_objfile current_program_space->symfile_object_file -/* All known objfiles are kept in a linked list. This points to the - root of this list. */ -#define object_files current_program_space->objfiles_head - /* The set of target sections matching the sections mapped into the current program space. */ #define current_target_sections (¤t_program_space->target_sections)