C++ify program_space

This patch makes program_space a C++ object by adding a
constructor/destructor, giving default values to fields, and using
new/delete.

gdb/ChangeLog:

	* progspace.h (struct program_space): Add constructor and
	destructor, initialize fields.
	(add_program_space): Remove.
	* progspace.c (add_program_space): Rename to...
	(program_space::program_space): ... this.
	(release_program_space): Rename to...
	(program_space::~program_space): ... this.
	(delete_program_space): Use delete to delete program_space.
	(initialize_progspace): Use new to allocate program_space.
	* inferior.c (add_inferior_with_spaces): Likewise.
	(clone_inferior_command): Likewise.
	* infrun.c (follow_fork_inferior): Likewise.
	(handle_vfork_child_exec_or_exit): Likewise.
This commit is contained in:
Simon Marchi 2018-03-02 23:22:08 -05:00
parent e80aaf6183
commit 564b1e3f29
5 changed files with 100 additions and 96 deletions

View File

@ -1,3 +1,19 @@
2018-03-02 Simon Marchi <simon.marchi@polymtl.ca>
* progspace.h (struct program_space): Add constructor and
destructor, initialize fields.
(add_program_space): Remove.
* progspace.c (add_program_space): Rename to...
(program_space::program_space): ... this.
(release_program_space): Rename to...
(program_space::~program_space): ... this.
(delete_program_space): Use delete to delete program_space.
(initialize_progspace): Use new to allocate program_space.
* inferior.c (add_inferior_with_spaces): Likewise.
(clone_inferior_command): Likewise.
* infrun.c (follow_fork_inferior): Likewise.
(handle_vfork_child_exec_or_exit): Likewise.
2018-03-02 Simon Marchi <simon.marchi@polymtl.ca>
* common/gdb_vecs.h (make_cleanup_free_char_ptr_vec): Remove.

View File

@ -784,7 +784,7 @@ add_inferior_with_spaces (void)
doesn't really return a new address space; otherwise, it
really does. */
aspace = maybe_new_address_space ();
pspace = add_program_space (aspace);
pspace = new program_space (aspace);
inf = add_inferior (0);
inf->pspace = pspace;
inf->aspace = pspace->aspace;
@ -928,7 +928,7 @@ clone_inferior_command (const char *args, int from_tty)
doesn't really return a new address space; otherwise, it
really does. */
aspace = maybe_new_address_space ();
pspace = add_program_space (aspace);
pspace = new program_space (aspace);
inf = add_inferior (0);
inf->pspace = pspace;
inf->aspace = pspace->aspace;

View File

@ -511,7 +511,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
else
{
child_inf->aspace = new_address_space ();
child_inf->pspace = add_program_space (child_inf->aspace);
child_inf->pspace = new program_space (child_inf->aspace);
child_inf->removable = 1;
set_current_program_space (child_inf->pspace);
clone_program_space (child_inf->pspace, parent_inf->pspace);
@ -630,7 +630,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
else
{
child_inf->aspace = new_address_space ();
child_inf->pspace = add_program_space (child_inf->aspace);
child_inf->pspace = new program_space (child_inf->aspace);
child_inf->removable = 1;
child_inf->symfile_flags = SYMFILE_NO_READ;
set_current_program_space (child_inf->pspace);
@ -986,7 +986,7 @@ handle_vfork_child_exec_or_exit (int exec)
{
/* We're staying attached to the parent, so, really give the
child a new address space. */
inf->pspace = add_program_space (maybe_new_address_space ());
inf->pspace = new program_space (maybe_new_address_space ());
inf->aspace = inf->pspace->aspace;
inf->removable = 1;
set_current_program_space (inf->pspace);
@ -1020,7 +1020,7 @@ handle_vfork_child_exec_or_exit (int exec)
program space resets breakpoints). */
inf->aspace = NULL;
inf->pspace = NULL;
pspace = add_program_space (maybe_new_address_space ());
pspace = new program_space (maybe_new_address_space ());
set_current_program_space (pspace);
inf->removable = 1;
inf->symfile_flags = SYMFILE_NO_READ;

View File

@ -109,30 +109,21 @@ init_address_spaces (void)
/* Adds a new empty program space to the program space list, and binds
it to ASPACE. Returns the pointer to the new object. */
struct program_space *
add_program_space (struct address_space *aspace)
program_space::program_space (address_space *aspace_)
: num (++last_program_space_num), aspace (aspace_)
{
struct program_space *pspace;
pspace = XCNEW (struct program_space);
pspace->num = ++last_program_space_num;
pspace->aspace = aspace;
program_space_alloc_data (pspace);
program_space_alloc_data (this);
if (program_spaces == NULL)
program_spaces = pspace;
program_spaces = this;
else
{
struct program_space *last;
for (last = program_spaces; last->next != NULL; last = last->next)
;
last->next = pspace;
last->next = this;
}
return pspace;
}
/* Releases program space PSPACE, and all its contents (shared
@ -141,26 +132,24 @@ add_program_space (struct address_space *aspace)
is the current program space, since there should always be a
program space. */
static void
release_program_space (struct program_space *pspace)
program_space::~program_space ()
{
gdb_assert (pspace != current_program_space);
gdb_assert (this != current_program_space);
scoped_restore_current_program_space restore_pspace;
set_current_program_space (pspace);
set_current_program_space (this);
breakpoint_program_space_exit (pspace);
breakpoint_program_space_exit (this);
no_shared_libraries (NULL, 0);
exec_close ();
free_all_objfiles ();
if (!gdbarch_has_shared_address_space (target_gdbarch ()))
free_address_space (pspace->aspace);
clear_section_table (&pspace->target_sections);
clear_program_space_solib_cache (pspace);
free_address_space (this->aspace);
clear_section_table (&this->target_sections);
clear_program_space_solib_cache (this);
/* Discard any data modules have associated with the PSPACE. */
program_space_free_data (pspace);
xfree (pspace);
program_space_free_data (this);
}
/* Copies program space SRC to DEST. Copies the main executable file,
@ -235,7 +224,7 @@ delete_program_space (struct program_space *pspace)
ss = *ss_link;
}
release_program_space (pspace);
delete pspace;
}
/* Prints the list of program spaces and their details on UIOUT. If
@ -433,5 +422,5 @@ initialize_progspace (void)
modules have done that. Do this before
initialize_current_architecture, because that accesses exec_bfd,
which in turn dereferences current_program_space. */
current_program_space = add_program_space (new_address_space ());
current_program_space = new program_space (new_address_space ());
}

View File

@ -135,80 +135,83 @@ DEF_VEC_P (so_list_ptr);
/* The program space structure. */
struct program_space
{
/* Pointer to next in linked list. */
struct program_space *next;
{
program_space (address_space *aspace_);
~program_space ();
/* Unique ID number. */
int num;
/* Pointer to next in linked list. */
struct program_space *next = NULL;
/* The main executable loaded into this program space. This is
managed by the exec target. */
/* Unique ID number. */
int num = 0;
/* 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 main executable loaded into this program space. This is
managed by the exec target. */
/* 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;
/* 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;
/* 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;
/* 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 no breakpoints should be inserted in this program
space. */
int breakpoints_not_allowed;
/* 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;
/* 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;
/* True if no breakpoints should be inserted in this program
space. */
int breakpoints_not_allowed = 0;
/* All known objfiles are kept in a linked list. This points to
the head of this list. */
struct objfile *objfiles;
/* 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;
/* 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;
/* All known objfiles are kept in a linked list. This points to
the head of this list. */
struct objfile *objfiles = NULL;
/* List of shared objects mapped into this space. Managed by
solib.c. */
struct so_list *so_list;
/* 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 {};
/* Number of calls to solib_add. */
unsigned solib_add_generation;
/* List of shared objects mapped into this space. Managed by
solib.c. */
struct so_list *so_list = NULL;
/* 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;
/* Number of calls to solib_add. */
unsigned int solib_add_generation = 0;
/* 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;
/* 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;
/* Per pspace data-pointers required by other GDB modules. */
REGISTRY_FIELDS;
};
/* 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 = NULL;
/* 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
@ -243,10 +246,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);