gdb: make the target_sections table private within program_space

Following on from earlier commits which made access to the
target_sections table more 'const', this commit makes the table
private within the program_space class and provides member functions
to access the table.

Ideally I would have liked for the new target_sections member
function (on program_space) to return a 'const' reference to the table
within the program_space.  Unfortunately, there are two places in
solib-*.c, where code outside of the program_space class modifies the
target_sections table, and so to support this we need to return a
non-const reference.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* exec.c (exec_target::close): Call new clear_target_sections
	function.
	(program_space::add_target_sections): Update name of member
	variable.
	(program_space::foreach_target_section): New function.
	(program_space::add_target_sections): Update name of member
	variable.
	(program_space::remove_target_sections): Likewise.
	(exec_one_fork): Use new target_sections member function.
	(exec_target::get_section_table): Likewise.
	(exec_target::files_info): Likewise.
	(set_section_command): Use new foreach_target_section member
	function.
	(exec_set_section_address): Likewise.
	(exec_target::has_memory): Use new target_sections member
	function.
	* progspace.h (program_space::clear_target_sections): New member
	function.
	(program_space::target_sections): Rename member variable to
	m_target_sections, replace with a new member function.
	(program_space::foreach_target_section): Declare new member
	function.
	(program_space::m_target_sections): New member variable.
	* solib-dsbt.c (scan_dyntag): Use new member function.
	* solib-svr4.c (scan_dyntag): Likewise.
This commit is contained in:
Andrew Burgess
2021-02-12 12:06:15 +00:00
parent b91919ac8b
commit 02f7d26b0b
5 changed files with 59 additions and 22 deletions

View File

@ -1,3 +1,27 @@
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* exec.c (exec_target::close): Call new clear_target_sections
function.
(program_space::add_target_sections): Update name of member
variable.
(program_space::add_target_sections): Update name of member
variable.
(program_space::remove_target_sections): Likewise.
(exec_one_fork): Use new target_sections member function.
(exec_target::get_section_table): Likewise.
(exec_target::files_info): Likewise.
(set_section_command): Likewise.
(exec_set_section_address): Likewise.
(exec_target::has_memory): Use new target_sections member
function.
* progspace.h (program_space::clear_target_sections): New member
function.
(program_space::target_sections): Rename member variable to
m_target_sections, replace with a new member function.
(program_space::m_target_sections): New member variable.
* solib-dsbt.c (scan_dyntag): Use new member function.
* solib-svr4.c (scan_dyntag): Likewise.
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb/bfd-target.c (class target_bfd) <get_section_table>: Make

View File

@ -156,7 +156,7 @@ exec_target::close ()
{
for (struct program_space *ss : program_spaces)
{
ss->target_sections.clear ();
ss->clear_target_sections ();
ss->exec_close ();
}
}
@ -599,8 +599,8 @@ program_space::add_target_sections (void *owner,
{
for (const target_section &s : sections)
{
target_sections.push_back (s);
target_sections.back ().owner = owner;
m_target_sections.push_back (s);
m_target_sections.back ().owner = owner;
}
scoped_restore_current_pspace_and_thread restore_pspace_thread;
@ -637,9 +637,9 @@ program_space::add_target_sections (struct objfile *objfile)
if (bfd_section_size (osect->the_bfd_section) == 0)
continue;
target_sections.emplace_back (obj_section_addr (osect),
obj_section_endaddr (osect),
osect->the_bfd_section, (void *) objfile);
m_target_sections.emplace_back (obj_section_addr (osect),
obj_section_endaddr (osect),
osect->the_bfd_section, (void *) objfile);
}
}
@ -651,18 +651,18 @@ program_space::remove_target_sections (void *owner)
{
gdb_assert (owner != NULL);
auto it = std::remove_if (target_sections.begin (),
target_sections.end (),
auto it = std::remove_if (m_target_sections.begin (),
m_target_sections.end (),
[&] (target_section &sect)
{
return sect.owner == owner;
});
target_sections.erase (it, target_sections.end ());
m_target_sections.erase (it, m_target_sections.end ());
/* If we don't have any more sections to read memory from,
remove the file_stratum target from the stack of each
inferior sharing the program space. */
if (target_sections.empty ())
if (m_target_sections.empty ())
{
scoped_restore_current_pspace_and_thread restore_pspace_thread;
@ -682,7 +682,7 @@ program_space::remove_target_sections (void *owner)
void
exec_on_vfork ()
{
if (!current_program_space->target_sections.empty ())
if (!current_program_space->target_sections ().empty ())
push_target (&exec_ops);
}
@ -887,7 +887,7 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
const target_section_table *
exec_target::get_section_table ()
{
return &current_program_space->target_sections;
return &current_program_space->target_sections ();
}
enum target_xfer_status
@ -985,7 +985,7 @@ void
exec_target::files_info ()
{
if (current_program_space->exec_bfd ())
print_section_info (&current_program_space->target_sections,
print_section_info (&current_program_space->target_sections (),
current_program_space->exec_bfd ());
else
puts_filtered (_("\t<no file loaded>\n"));
@ -1010,7 +1010,7 @@ set_section_command (const char *args, int from_tty)
/* Parse out new virtual address. */
secaddr = parse_and_eval_address (args);
for (target_section &p : current_program_space->target_sections)
for (target_section &p : current_program_space->target_sections ())
{
if (!strncmp (secname, bfd_section_name (p.the_bfd_section), seclen)
&& bfd_section_name (p.the_bfd_section)[seclen] == '\0')
@ -1036,7 +1036,7 @@ set_section_command (const char *args, int from_tty)
void
exec_set_section_address (const char *filename, int index, CORE_ADDR address)
{
for (target_section &p : current_program_space->target_sections)
for (target_section &p : current_program_space->target_sections ())
{
if (filename_cmp (filename,
bfd_get_filename (p.the_bfd_section->owner)) == 0
@ -1053,7 +1053,7 @@ exec_target::has_memory ()
{
/* We can provide memory if we have any file/target sections to read
from. */
return !current_program_space->target_sections.empty ();
return !current_program_space->target_sections ().empty ();
}
gdb::unique_xmalloc_ptr<char>

View File

@ -309,6 +309,18 @@ struct program_space
sections. They are given OBJFILE as the "owner". */
void add_target_sections (struct objfile *objfile);
/* Clear all target sections from M_TARGET_SECTIONS table. */
void clear_target_sections ()
{
m_target_sections.clear ();
}
/* Return a reference to the M_TARGET_SECTIONS table. */
target_section_table &target_sections ()
{
return m_target_sections;
}
/* Unique ID number. */
int num = 0;
@ -359,10 +371,6 @@ struct program_space
/* All known objfiles are kept in a linked list. */
std::list<std::shared_ptr<objfile>> objfiles_list;
/* The set of target sections matching the sections mapped into
this program space. Managed by both exec_ops and solib.c. */
target_section_table target_sections;
/* List of shared objects mapped into this space. Managed by
solib.c. */
struct so_list *so_list = NULL;
@ -380,6 +388,11 @@ struct program_space
/* Per pspace data-pointers required by other GDB modules. */
REGISTRY_FIELDS {};
private:
/* The set of target sections matching the sections mapped into
this program space. Managed by both exec_ops and solib.c. */
target_section_table m_target_sections;
};
/* An address space. It is used for comparing if

View File

@ -425,7 +425,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
bool found = false;
for (const target_section &target_section
: current_program_space->target_sections)
: current_program_space->target_sections ())
if (sect == target_section.the_bfd_section)
{
dyn_addr = target_section.addr;

View File

@ -611,7 +611,7 @@ scan_dyntag (const int desired_dyntag, bfd *abfd, CORE_ADDR *ptr,
bool found = false;
for (const target_section &target_section
: current_program_space->target_sections)
: current_program_space->target_sections ())
if (sect == target_section.the_bfd_section)
{
dyn_addr = target_section.addr;