gdb: make the target_sections table private within program_space
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 12 Feb 2021 12:06:15 +0000 (12:06 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 24 Feb 2021 16:58:04 +0000 (16:58 +0000)
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.

gdb/ChangeLog
gdb/exec.c
gdb/progspace.h
gdb/solib-dsbt.c
gdb/solib-svr4.c

index e59343bc819807559cf940fc8fc5341e040bf89f..841d51bc3ca42c8448f9e37bff15f2fe35b2d144 100644 (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
index 1cac5fb5d3d6395f05995b09a99ce1824646f373..c55a41aa8a19d44519bf0a92dadebcb89e4327a1 100644 (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>
index 6ac8932cd60b4d831923f8f28326139eb9564216..790684743d871a95396afa877b9860cc3c1be643 100644 (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
index 6d2180603433d0b4b72e6fc84b1ba2b1269b12f9..4b1b7560e16a7cfb85a1cedf3c4306df32321351 100644 (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;
index f8dd4194e701e2260f1880ea23d25c5557fe12d8..c7b3157191f2e625c65deef6f8b19d8657a0d7f2 100644 (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;