gdb: move regcache::regcaches to regcache.c

I don't really understand why `regcache_thread_ptid_changed` is a static
method of `struct regcache` instead of being a static free function in
regcache.c.  And I don't understand why `current_regcache` is a static
member of `struct regcache` instead of being a static global in
regcache.c.  It's not wrong per-se, but there's no other place where we
do it like this in GDB (as far as I remember) and it just exposes things
unnecessarily in the .h.

Move them to be just static in regcache.c.  As a result,
registers_changed_ptid doesn't need to be friend of the regcache class
anymore.

Removing the include of forward_list in regcache.h showed that we were
missing an include for it in dwarf2/index-write.c, record-btrace.c and
sparc64-tdep.c.

gdb/ChangeLog:

	* regcache.h (class regcache): Remove friend
	registers_changed_ptid.
	<regcache_thread_ptid_changed>: Remove.
	<regcaches>: Remove.
	* regcache.c (regcache::regcaches): Rename to...
	(regcaches): ... this.  Make static.
	(get_thread_arch_aspace_regcache): Update.
	(regcache::regcache_thread_ptid_changed): Rename to...
	(regcache_thread_ptid_changed): ... this.  Update.
	(class regcache_access): Remove.
	(regcaches_test): Update.
	(_initialize_regcache): Update.
	* sparc64-tdep.c, dwarf2/index-write.c, record-btrace.c: Include
	<forward_list>.

Change-Id: Iabc25759848010cfbb7ee7e27f60eaca17d61c12
This commit is contained in:
Simon Marchi
2020-07-17 16:43:35 -04:00
parent 5c879edf04
commit 7e17ef8ca4
5 changed files with 35 additions and 50 deletions

View File

@@ -41,6 +41,7 @@
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <forward_list>
#include <set> #include <set>
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>

View File

@@ -43,6 +43,7 @@
#include "gdbarch.h" #include "gdbarch.h"
#include "cli/cli-style.h" #include "cli/cli-style.h"
#include "async-event.h" #include "async-event.h"
#include <forward_list>
static const target_info record_btrace_target_info = { static const target_info record_btrace_target_info = {
"record-btrace", "record-btrace",

View File

@@ -319,7 +319,7 @@ reg_buffer::assert_regnum (int regnum) const
recording if the register values have been changed (eg. by the recording if the register values have been changed (eg. by the
user). Therefore all registers must be written back to the user). Therefore all registers must be written back to the
target when appropriate. */ target when appropriate. */
std::forward_list<regcache *> regcache::regcaches; static std::forward_list<regcache *> regcaches;
struct regcache * struct regcache *
get_thread_arch_aspace_regcache (process_stratum_target *target, get_thread_arch_aspace_regcache (process_stratum_target *target,
@@ -328,7 +328,7 @@ get_thread_arch_aspace_regcache (process_stratum_target *target,
{ {
gdb_assert (target != nullptr); gdb_assert (target != nullptr);
for (const auto &regcache : regcache::regcaches) for (const auto &regcache : regcaches)
if (regcache->target () == target if (regcache->target () == target
&& regcache->ptid () == ptid && regcache->ptid () == ptid
&& regcache->arch () == gdbarch) && regcache->arch () == gdbarch)
@@ -336,7 +336,7 @@ get_thread_arch_aspace_regcache (process_stratum_target *target,
regcache *new_regcache = new regcache (target, gdbarch, aspace); regcache *new_regcache = new regcache (target, gdbarch, aspace);
regcache::regcaches.push_front (new_regcache); regcaches.push_front (new_regcache);
new_regcache->set_ptid (ptid); new_regcache->set_ptid (ptid);
return new_regcache; return new_regcache;
@@ -412,12 +412,11 @@ regcache_observer_target_changed (struct target_ops *target)
registers_changed (); registers_changed ();
} }
/* Update global variables old ptids to hold NEW_PTID if they were /* Update regcaches related to OLD_PTID to now use NEW_PTID. */
holding OLD_PTID. */ static void
void regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
regcache::regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
{ {
for (auto &regcache : regcache::regcaches) for (auto &regcache : regcaches)
{ {
if (regcache->ptid () == old_ptid) if (regcache->ptid () == old_ptid)
regcache->set_ptid (new_ptid); regcache->set_ptid (new_ptid);
@@ -438,15 +437,15 @@ regcache::regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
void void
registers_changed_ptid (process_stratum_target *target, ptid_t ptid) registers_changed_ptid (process_stratum_target *target, ptid_t ptid)
{ {
for (auto oit = regcache::regcaches.before_begin (), it = std::next (oit); for (auto oit = regcaches.before_begin (), it = std::next (oit);
it != regcache::regcaches.end (); ) it != regcaches.end (); )
{ {
struct regcache *regcache = *it; struct regcache *regcache = *it;
if ((target == nullptr || regcache->target () == target) if ((target == nullptr || regcache->target () == target)
&& regcache->ptid ().matches (ptid)) && regcache->ptid ().matches (ptid))
{ {
delete regcache; delete regcache;
it = regcache::regcaches.erase_after (oit); it = regcaches.erase_after (oit);
} }
else else
oit = it++; oit = it++;
@@ -1431,19 +1430,12 @@ register_dump::dump (ui_file *file)
namespace selftests { namespace selftests {
class regcache_access : public regcache static size_t
regcaches_size ()
{ {
public: return std::distance (regcaches.begin (),
regcaches.end ());
/* Return the number of elements in regcache::regcaches. */ }
static size_t
regcaches_size ()
{
return std::distance (regcache::regcaches.begin (),
regcache::regcaches.end ());
}
};
/* Wrapper around get_thread_arch_aspace_regcache that does some self checks. */ /* Wrapper around get_thread_arch_aspace_regcache that does some self checks. */
@@ -1464,7 +1456,7 @@ static void
regcaches_test (void) regcaches_test (void)
{ {
/* It is empty at the start. */ /* It is empty at the start. */
SELF_CHECK (regcache_access::regcaches_size () == 0); SELF_CHECK (regcaches_size () == 0);
ptid_t ptid1 (1), ptid2 (2), ptid3 (3); ptid_t ptid1 (1), ptid2 (2), ptid3 (3);
@@ -1472,57 +1464,56 @@ regcaches_test (void)
test_target_ops test_target2; test_target_ops test_target2;
/* Get regcache from (target1,ptid1), a new regcache is added to /* Get regcache from (target1,ptid1), a new regcache is added to
regcache::regcaches. */ REGCACHES. */
test_get_thread_arch_aspace_regcache (&test_target1, ptid1, test_get_thread_arch_aspace_regcache (&test_target1, ptid1,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 1); SELF_CHECK (regcaches_size () == 1);
/* Get regcache from (target1,ptid2), a new regcache is added to /* Get regcache from (target1,ptid2), a new regcache is added to
regcache::regcaches. */ REGCACHES. */
test_get_thread_arch_aspace_regcache (&test_target1, ptid2, test_get_thread_arch_aspace_regcache (&test_target1, ptid2,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 2); SELF_CHECK (regcaches_size () == 2);
/* Get regcache from (target1,ptid3), a new regcache is added to /* Get regcache from (target1,ptid3), a new regcache is added to
regcache::regcaches. */ REGCACHES. */
test_get_thread_arch_aspace_regcache (&test_target1, ptid3, test_get_thread_arch_aspace_regcache (&test_target1, ptid3,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 3); SELF_CHECK (regcaches_size () == 3);
/* Get regcache from (target1,ptid2) again, nothing is added to /* Get regcache from (target1,ptid2) again, nothing is added to
regcache::regcaches. */ REGCACHES. */
test_get_thread_arch_aspace_regcache (&test_target1, ptid2, test_get_thread_arch_aspace_regcache (&test_target1, ptid2,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 3); SELF_CHECK (regcaches_size () == 3);
/* Get regcache from (target2,ptid2), a new regcache is added to /* Get regcache from (target2,ptid2), a new regcache is added to
regcache::regcaches, since this time we're using a differen REGCACHES, since this time we're using a different target. */
target. */
test_get_thread_arch_aspace_regcache (&test_target2, ptid2, test_get_thread_arch_aspace_regcache (&test_target2, ptid2,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 4); SELF_CHECK (regcaches_size () == 4);
/* Mark that (target1,ptid2) changed. The regcache of (target1, /* Mark that (target1,ptid2) changed. The regcache of (target1,
ptid2) should be removed from regcache::regcaches. */ ptid2) should be removed from REGCACHES. */
registers_changed_ptid (&test_target1, ptid2); registers_changed_ptid (&test_target1, ptid2);
SELF_CHECK (regcache_access::regcaches_size () == 3); SELF_CHECK (regcaches_size () == 3);
/* Get the regcache from (target2,ptid2) again, confirming the /* Get the regcache from (target2,ptid2) again, confirming the
registers_changed_ptid call above did not delete it. */ registers_changed_ptid call above did not delete it. */
test_get_thread_arch_aspace_regcache (&test_target2, ptid2, test_get_thread_arch_aspace_regcache (&test_target2, ptid2,
target_gdbarch (), target_gdbarch (),
NULL); NULL);
SELF_CHECK (regcache_access::regcaches_size () == 3); SELF_CHECK (regcaches_size () == 3);
/* Confirm that marking all regcaches of all targets as changed /* Confirm that marking all regcaches of all targets as changed
clears regcache::regcaches. */ clears REGCACHES. */
registers_changed_ptid (nullptr, minus_one_ptid); registers_changed_ptid (nullptr, minus_one_ptid);
SELF_CHECK (regcache_access::regcaches_size () == 0); SELF_CHECK (regcaches_size () == 0);
} }
class target_ops_no_register : public test_target_ops class target_ops_no_register : public test_target_ops
@@ -1837,8 +1828,7 @@ _initialize_regcache ()
= gdbarch_data_register_post_init (init_regcache_descr); = gdbarch_data_register_post_init (init_regcache_descr);
gdb::observers::target_changed.attach (regcache_observer_target_changed); gdb::observers::target_changed.attach (regcache_observer_target_changed);
gdb::observers::thread_ptid_changed.attach gdb::observers::thread_ptid_changed.attach (regcache_thread_ptid_changed);
(regcache::regcache_thread_ptid_changed);
add_com ("flushregs", class_maintenance, reg_flush_command, add_com ("flushregs", class_maintenance, reg_flush_command,
_("Force gdb to flush its register cache (maintainer command).")); _("Force gdb to flush its register cache (maintainer command)."));

View File

@@ -22,7 +22,6 @@
#include "gdbsupport/common-regcache.h" #include "gdbsupport/common-regcache.h"
#include "gdbsupport/function-view.h" #include "gdbsupport/function-view.h"
#include <forward_list>
struct regcache; struct regcache;
struct regset; struct regset;
@@ -397,13 +396,10 @@ public:
debug. */ debug. */
void debug_print_register (const char *func, int regno); void debug_print_register (const char *func, int regno);
static void regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid);
protected: protected:
regcache (process_stratum_target *target, gdbarch *gdbarch, regcache (process_stratum_target *target, gdbarch *gdbarch,
const address_space *aspace); const address_space *aspace);
static std::forward_list<regcache *> regcaches;
private: private:
/* Helper function for transfer_regset. Copies across a single register. */ /* Helper function for transfer_regset. Copies across a single register. */
@@ -437,9 +433,6 @@ private:
get_thread_arch_aspace_regcache (process_stratum_target *target, ptid_t ptid, get_thread_arch_aspace_regcache (process_stratum_target *target, ptid_t ptid,
struct gdbarch *gdbarch, struct gdbarch *gdbarch,
struct address_space *aspace); struct address_space *aspace);
friend void
registers_changed_ptid (process_stratum_target *target, ptid_t ptid);
}; };
class readonly_detached_regcache : public readable_regcache class readonly_detached_regcache : public readable_regcache

View File

@@ -33,8 +33,8 @@
#include "target-descriptions.h" #include "target-descriptions.h"
#include "target.h" #include "target.h"
#include "value.h" #include "value.h"
#include "sparc64-tdep.h" #include "sparc64-tdep.h"
#include <forward_list>
/* This file implements the SPARC 64-bit ABI as defined by the /* This file implements the SPARC 64-bit ABI as defined by the
section "Low-Level System Information" of the SPARC Compliance section "Low-Level System Information" of the SPARC Compliance