Use tag dispatch regcache ctor in regcache_dup

This patch adds a tag dispatch ctor to create read-only regcache from
a write-through regcache, also this patch deletes copy ctor and
assignment operator.

gdb:

2017-04-28  Yao Qi  <yao.qi@linaro.org>
	    Pedro Alves  <palves@redhat.com>

	* regcache.c (regcache::regcache): New tag dispatch ctor.
	(do_cooked_read): Moved above.
	(regcache_dup): Use the tag dispatch ctor..
	* regcache.h (regcache): Declare ctor, delete copy ctor and
	assignment operator, remove friend regcache_dup.
This commit is contained in:
Yao Qi 2017-04-28 22:48:42 +01:00
parent b421c83cb8
commit deb1fa3eda
3 changed files with 34 additions and 17 deletions

View File

@ -1,3 +1,12 @@
2017-04-28 Yao Qi <yao.qi@linaro.org>
Pedro Alves <palves@redhat.com>
* regcache.c (regcache::regcache): New tag dispatch ctor.
(do_cooked_read): Moved above.
(regcache_dup): Use the tag dispatch ctor..
* regcache.h (regcache): Declare ctor, delete copy ctor and
assignment operator, remove friend regcache_dup.
2017-04-28 Yao Qi <yao.qi@linaro.org>
* regcache.c (regcache_dup): Assert !src->m_readonly_p and

View File

@ -209,6 +209,21 @@ regcache::regcache (gdbarch *gdbarch, address_space *aspace_,
m_ptid = minus_one_ptid;
}
static enum register_status
do_cooked_read (void *src, int regnum, gdb_byte *buf)
{
struct regcache *regcache = (struct regcache *) src;
return regcache_cooked_read (regcache, regnum, buf);
}
regcache::regcache (readonly_t, const regcache &src)
: regcache (src.arch (), src.aspace (), true)
{
gdb_assert (!src.m_readonly_p);
save (do_cooked_read, (void *) &src);
}
gdbarch *
regcache::arch () const
{
@ -371,14 +386,6 @@ regcache::restore (struct regcache *src)
}
}
static enum register_status
do_cooked_read (void *src, int regnum, gdb_byte *buf)
{
struct regcache *regcache = (struct regcache *) src;
return regcache_cooked_read (regcache, regnum, buf);
}
void
regcache_cpy (struct regcache *dst, struct regcache *src)
{
@ -420,12 +427,7 @@ regcache::cpy_no_passthrough (struct regcache *src)
struct regcache *
regcache_dup (struct regcache *src)
{
struct regcache *newbuf;
gdb_assert (!src->m_readonly_p);
newbuf = regcache_xmalloc (src->arch (), get_regcache_aspace (src));
newbuf->save (do_cooked_read, src);
return newbuf;
return new regcache (regcache::readonly, *src);
}
enum register_status

View File

@ -240,6 +240,15 @@ class regcache
: regcache (gdbarch, aspace_, true)
{}
struct readonly_t {};
static constexpr readonly_t readonly {};
/* Create a readonly regcache from a non-readonly regcache. */
regcache (readonly_t, const regcache &src);
regcache (const regcache &) = delete;
void operator= (const regcache &) = delete;
~regcache ()
{
xfree (m_registers);
@ -373,9 +382,6 @@ class regcache
friend void
regcache_cpy (struct regcache *dst, struct regcache *src);
friend struct regcache *
regcache_dup (struct regcache *src);
};
/* Copy/duplicate the contents of a register cache. By default, the