Introduce program_space::add_objfile

This introduces a new method, program_space::add_objfile, that adds an
objfile to the program space's list of objfiles.  It also changes the
obfile's constructor so that linking an objfile into this list is not
done here.

The former is an improvement because it makes more sense to treat the
program space as a container holding objfiles -- so manipulation of
the list belongs there.

The latter is not strictly needed, but seemed better both because it
is removing a global side effect from a constructor, and for symmetry
reasons, as a subsequent patch will remove unlinking from the
destructor.

gdb/ChangeLog
2019-12-12  Tom Tromey  <tom@tromey.com>

	* progspace.h (struct program_space) <add_objfile>: Declare
	method.
	* progspace.c (program_space::add_objfile): New method.
	* objfiles.c (~objfile): Don't unlink objfile.
	(put_objfile_before): Remove.
	(add_separate_debug_objfile): Don't call put_objfile_before.
	(objfile::make): Call add_objfile.  Set new_objfiles_available on
	the per-program-space data.

Change-Id: I93e8525dda631cb89dcc2046a5c51c7c9f34ccfd
This commit is contained in:
Tom Tromey 2019-11-01 16:31:28 -06:00
parent 268e4f0914
commit 7cac64af7b
4 changed files with 45 additions and 45 deletions

View file

@ -1,3 +1,14 @@
2019-12-12 Tom Tromey <tom@tromey.com>
* progspace.h (struct program_space) <add_objfile>: Declare
method.
* progspace.c (program_space::add_objfile): New method.
* objfiles.c (~objfile): Don't unlink objfile.
(put_objfile_before): Remove.
(add_separate_debug_objfile): Don't call put_objfile_before.
(objfile::make): Call add_objfile. Set new_objfiles_available on
the per-program-space data.
2019-12-12 Tom Tromey <tom@tromey.com> 2019-12-12 Tom Tromey <tom@tromey.com>
* symfile.c (syms_from_objfile_1): Use objfile_up. * symfile.c (syms_from_objfile_1): Use objfile_up.

View file

@ -371,23 +371,6 @@ objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_)
} }
per_bfd = get_objfile_bfd_data (this, abfd); per_bfd = get_objfile_bfd_data (this, abfd);
/* Add this file onto the tail of the linked list of other such files. */
if (object_files == NULL)
object_files = this;
else
{
struct objfile *last_one;
for (last_one = object_files;
last_one->next;
last_one = last_one->next);
last_one->next = this;
}
/* Rebuild section map next time we need it. */
get_objfile_pspace_data (pspace)->new_objfiles_available = 1;
} }
/* Retrieve the gdbarch associated with OBJFILE. */ /* Retrieve the gdbarch associated with OBJFILE. */
@ -494,30 +477,6 @@ unlink_objfile (struct objfile *objfile)
_("unlink_objfile: objfile already unlinked")); _("unlink_objfile: objfile already unlinked"));
} }
/* Put one object file before a specified on in the global list.
This can be used to make sure an object file is destroyed before
another when using objfiles_safe to free all objfiles. */
static void
put_objfile_before (struct objfile *objfile, struct objfile *before_this)
{
struct objfile **objp;
unlink_objfile (objfile);
for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
{
if (*objp == before_this)
{
objfile->next = *objp;
*objp = objfile;
return;
}
}
internal_error (__FILE__, __LINE__,
_("put_objfile_before: before objfile not in list"));
}
/* Add OBJFILE as a separate debug objfile of PARENT. */ /* Add OBJFILE as a separate debug objfile of PARENT. */
static void static void
@ -535,10 +494,6 @@ add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
objfile->separate_debug_objfile_backlink = parent; objfile->separate_debug_objfile_backlink = parent;
objfile->separate_debug_objfile_link = parent->separate_debug_objfile; objfile->separate_debug_objfile_link = parent->separate_debug_objfile;
parent->separate_debug_objfile = objfile; parent->separate_debug_objfile = objfile;
/* Put the separate debug object before the normal one, this is so that
usage of objfiles_safe will stay safe. */
put_objfile_before (objfile, parent);
} }
/* See objfiles.h. */ /* See objfiles.h. */
@ -550,6 +505,12 @@ objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_,
objfile *result = new objfile (bfd_, name_, flags_); objfile *result = new objfile (bfd_, name_, flags_);
if (parent != nullptr) if (parent != nullptr)
add_separate_debug_objfile (result, parent); add_separate_debug_objfile (result, parent);
current_program_space->add_objfile (result, parent);
/* Rebuild section map next time we need it. */
get_objfile_pspace_data (current_program_space)->new_objfiles_available = 1;
return result; return result;
} }

View file

@ -153,6 +153,28 @@ program_space::~program_space ()
program_space_free_data (this); program_space_free_data (this);
} }
/* See progspace.h. */
void
program_space::add_objfile (struct objfile *objfile, struct objfile *before)
{
for (struct objfile **objp = &objfiles_head;
*objp != NULL;
objp = &((*objp)->next))
{
if (*objp == before)
{
objfile->next = *objp;
*objp = objfile;
return;
}
}
internal_error (__FILE__, __LINE__,
_("put_objfile_before: before objfile not in list"));
}
/* Copies program space SRC to DEST. Copies the main executable file, /* Copies program space SRC to DEST. Copies the main executable file,
and the main symbol file. Returns DEST. */ and the main symbol file. Returns DEST. */

View file

@ -165,6 +165,12 @@ struct program_space
return objfiles_safe_range (objfiles_head); 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);
/* Pointer to next in linked list. */ /* Pointer to next in linked list. */
struct program_space *next = NULL; struct program_space *next = NULL;