forked from Imagelibrary/binutils-gdb
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:
@@ -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>
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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 ®cache : regcache::regcaches)
|
for (const auto ®cache : 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 ®cache : regcache::regcaches)
|
for (auto ®cache : 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
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/* Return the number of elements in regcache::regcaches. */
|
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
regcaches_size ()
|
regcaches_size ()
|
||||||
{
|
{
|
||||||
return std::distance (regcache::regcaches.begin (),
|
return std::distance (regcaches.begin (),
|
||||||
regcache::regcaches.end ());
|
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)."));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user