Introduce program_space::remove_objfile

This introduces a new method, program_space::remove_objfile, and
changes the objfile destructor not to unlink an objfile from the
program space's list.

This is cleaner because, like the previous patch, it treats the
program space more like a container for objfiles.  Also, this makes it
possible to keep an objfile alive even though it has been unlinked
from the program space's list, which is important for processing in a
worker thread.

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

	* progspace.h (struct program_space) <remove_objfile>: Declare.
	* progspace.c (program_space::remove_objfile): New method.
	* objfiles.c (unlink_objfile): Remove.
	(objfile::unlink): Call remove_objfile.
	(objfile): Don't call unlink_objfile.

Change-Id: I22f768827723dce21886fae9b3664532c8349e68
This commit is contained in:
Tom Tromey 2019-11-01 16:42:29 -06:00
parent 7cac64af7b
commit 234529260a
4 changed files with 36 additions and 28 deletions

View File

@ -1,3 +1,11 @@
2019-12-12 Tom Tromey <tom@tromey.com>
* progspace.h (struct program_space) <remove_objfile>: Declare.
* progspace.c (program_space::remove_objfile): New method.
* objfiles.c (unlink_objfile): Remove.
(objfile::unlink): Call remove_objfile.
(objfile): Don't call unlink_objfile.
2019-12-12 Tom Tromey <tom@tromey.com>
* progspace.h (struct program_space) <add_objfile>: Declare

View File

@ -456,27 +456,6 @@ separate_debug_iterator::operator++ ()
return *this;
}
/* Unlink OBJFILE from the list of known objfiles. */
static void
unlink_objfile (struct objfile *objfile)
{
struct objfile **objpp;
for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
{
if (*objpp == objfile)
{
*objpp = (*objpp)->next;
objfile->next = NULL;
return;
}
}
internal_error (__FILE__, __LINE__,
_("unlink_objfile: objfile already unlinked"));
}
/* Add OBJFILE as a separate debug objfile of PARENT. */
static void
@ -519,6 +498,7 @@ objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_,
void
objfile::unlink ()
{
current_program_space->remove_objfile (this);
delete this;
}
@ -609,13 +589,6 @@ objfile::~objfile ()
else
delete per_bfd;
/* Remove it from the chain of all objfiles. */
unlink_objfile (this);
if (this == symfile_objfile)
symfile_objfile = NULL;
/* Before the symbol table code was redone to make it easier to
selectively load and remove information particular to a specific
linkage unit, gdb used to do these things whenever the monolithic

View File

@ -175,6 +175,31 @@ program_space::add_objfile (struct objfile *objfile, struct objfile *before)
}
/* See progspace.h. */
void
program_space::remove_objfile (struct objfile *objfile)
{
struct objfile **objpp;
for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
{
if (*objpp == objfile)
{
*objpp = (*objpp)->next;
objfile->next = NULL;
if (objfile == symfile_object_file)
symfile_object_file = NULL;
return;
}
}
internal_error (__FILE__, __LINE__,
_("remove_objfile: objfile already unlinked"));
}
/* Copies program space SRC to DEST. Copies the main executable file,
and the main symbol file. Returns DEST. */

View File

@ -170,6 +170,8 @@ struct program_space
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;