/* 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.
#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"
+#include <list>
struct target_ops;
struct bfd;
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
program_space (address_space *aspace_);
~program_space ();
+ typedef std::list<struct objfile *> 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_list;
+ }
+
+ typedef basic_safe_range<objfiles_range> 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 ()
+ {
+ 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);
+
+ /* 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;
char *pspace_exec_filename = NULL;
/* Binary file diddling handle for the core file. */
- bfd *cbfd = NULL;
+ 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
(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 = NULL;
+ /* All known objfiles are kept in a linked list. */
+ std::list<struct objfile *> objfiles_list;
/* The set of target sections matching the sections mapped into
this program space. Managed by both exec_ops and solib.c. */
/* 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 = NULL;
+ std::vector<struct so_list *> 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. */
#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
-
/* The set of target sections matching the sections mapped into the
current program space. */
#define current_target_sections (¤t_program_space->target_sections)