From: Simon Marchi <simon.marchi@polymtl.ca>
To: Yao Qi <qiyaoltc@gmail.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 05/10] Class detached_regcache
Date: Sat, 17 Feb 2018 03:15:00 -0000 [thread overview]
Message-ID: <3d06d590f8fcf3516ba5e497c2193453@polymtl.ca> (raw)
In-Reply-To: <1517999572-14987-6-git-send-email-yao.qi@linaro.org>
Hi Yao,
Just some nits.
On 2018-02-07 05:32, Yao Qi wrote:
> jit.c uses the regcache in a slightly different way, the regcache
> dosn't
"doesn't"
> write through to target, but it has read and write methods. If I apply
> regcache in record-full.c, it has the similar use pattern. This patch
> adds a new class detached_regcache, a register buffer, but can be
> red and written.
"read"
>
> Since jit.c doesn't want to write registers through to target, it uses
> regcache as a readonly regcache (because only readonly regcache
> disconnects from the target), but it adds a hole in regcache
> (raw_set_cached_value) in order to modify a readonly regcache. This
> patch
> fixes this hole completely.
>
> regcache inherits detached_regcache, and detached_regcache inherits
> readable_regcache. The ideal design is that both detached_regcache and
> readable_regcache inherit reg_buffer, and regcache inherit
> detached_regcache and regcache_read (virtual inheritance). I concern
> about the performance overhead of virtual inheritance, so I don't do it
> in
> the patch.
>
> gdb:
>
> 2017-11-28 Yao Qi <yao.qi@linaro.org>
>
> * jit.c (struct jit_unwind_private) <regcache>: Change its type to
> reg_buffer_rw *.
> (jit_unwind_reg_set_impl): Call raw_supply.
> (jit_frame_sniffer): Use reg_buffer_rw.
> * record-full.c (record_full_core_regbuf): Change its type.
> (record_full_core_open_1): Use reg_buffer_rw.
> (record_full_close): Likewise.
> (record_full_core_fetch_registers): Use regcache->raw_supply.
> (record_full_core_store_registers): Likewise.
> * regcache.c (regcache::get_register_status): Move it to
> reg_buffer.
> (regcache_raw_set_cached_value): Remove.
> (regcache::raw_set_cached_value): Remove.
> (regcache::raw_write): Call raw_supply.
> (regcache::raw_supply): Move it to reg_buffer_rw.
> * regcache.h (regcache_raw_set_cached_value): Remove.
> (reg_buffer_rw): New class.
> ---
> gdb/jit.c | 10 ++++------
> gdb/record-full.c | 21 +++++++++------------
> gdb/regcache.c | 32 +++++---------------------------
> gdb/regcache.h | 42 ++++++++++++++++++++++++++----------------
> 4 files changed, 44 insertions(+), 61 deletions(-)
>
> diff --git a/gdb/jit.c b/gdb/jit.c
> index 01ead45..e67e1d2 100644
> --- a/gdb/jit.c
> +++ b/gdb/jit.c
> @@ -1097,7 +1097,7 @@ struct jit_unwind_private
> {
> /* Cached register values. See jit_frame_sniffer to see how this
> works. */
> - struct regcache *regcache;
> + detached_regcache *regcache;
>
> /* The frame being unwound. */
> struct frame_info *this_frame;
> @@ -1126,7 +1126,7 @@ jit_unwind_reg_set_impl (struct
> gdb_unwind_callbacks *cb, int dwarf_regnum,
> return;
> }
>
> - regcache_raw_set_cached_value (priv->regcache, gdb_reg,
> value->value);
> + priv->regcache->raw_supply (gdb_reg, value->value);
> value->free (value);
> }
>
> @@ -1188,7 +1188,6 @@ jit_frame_sniffer (const struct frame_unwind
> *self,
> struct jit_unwind_private *priv_data;
> struct gdb_unwind_callbacks callbacks;
> struct gdb_reader_funcs *funcs;
> - struct gdbarch *gdbarch;
>
> callbacks.reg_get = jit_unwind_reg_get_impl;
> callbacks.reg_set = jit_unwind_reg_set_impl;
> @@ -1201,11 +1200,10 @@ jit_frame_sniffer (const struct frame_unwind
> *self,
>
> gdb_assert (!*cache);
>
> - gdbarch = get_frame_arch (this_frame);
> -
> *cache = XCNEW (struct jit_unwind_private);
> priv_data = (struct jit_unwind_private *) *cache;
> - priv_data->regcache = new regcache (gdbarch);
> + /* Take a snapshot of current regcache. */
> + priv_data->regcache = new detached_regcache (get_frame_arch
> (this_frame), true);
This line is too long.
> diff --git a/gdb/regcache.h b/gdb/regcache.h
> index d4a9d9b..9a1ac41 100644
> --- a/gdb/regcache.h
> +++ b/gdb/regcache.h
> @@ -68,14 +68,6 @@ extern void regcache_raw_write_unsigned (struct
> regcache *regcache,
> extern LONGEST regcache_raw_get_signed (struct regcache *regcache,
> int regnum);
>
> -/* Set a raw register's value in the regcache's buffer. Unlike
> - regcache_raw_write, this is not write-through. The intention is
> - allowing to change the buffer contents of a read-only regcache
> - allocated with new. */
> -
> -extern void regcache_raw_set_cached_value
> - (struct regcache *regcache, int regnum, const gdb_byte *buf);
> -
> /* Partial transfer of raw registers. These perform read, modify,
> write style operations. The read variant returns the status of the
> register. */
> @@ -229,12 +221,13 @@ public:
> /* Return regcache's architecture. */
> gdbarch *arch () const;
>
> + enum register_status get_register_status (int regnum) const;
> +
> virtual ~reg_buffer ()
> {
> xfree (m_registers);
> xfree (m_register_status);
> }
> -
> protected:
> /* Assert on the range of REGNUM. */
> void assert_regnum (int regnum) const;
> @@ -257,6 +250,7 @@ protected:
> signed char *m_register_status;
>
> friend class regcache;
> + friend class detached_regcache;
> };
>
> /* An abstract class which only has methods doing read. */
> @@ -291,11 +285,33 @@ protected:
> bool is_raw);
> };
>
> +/* Buffer of registers, can be red and written. */
"read"
Simon
next prev parent reply other threads:[~2018-02-17 3:15 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-07 10:33 [PATCH 00/10 v2] Remove regcache::m_readonly_p Yao Qi
2018-02-07 10:33 ` [PATCH 01/10] Class reg_buffer Yao Qi
2018-02-07 10:33 ` [PATCH 04/10] Class readonly_detached_regcache Yao Qi
2018-02-07 10:33 ` [PATCH 02/10] class readable_regcache and pass readable_regcache to gdbarch pseudo_register_read and pseudo_register_read_value Yao Qi
2018-02-07 10:33 ` [PATCH 10/10] Pass readable_regcache to gdbarch method read_pc Yao Qi
2018-02-07 10:33 ` [PATCH 03/10] Remove regcache_save and regcache_cpy Yao Qi
2018-02-17 2:07 ` Simon Marchi
2018-02-07 10:33 ` [PATCH 08/10] Remove regcache::m_readonly_p Yao Qi
2018-02-07 10:33 ` [PATCH 05/10] Class detached_regcache Yao Qi
2018-02-17 3:15 ` Simon Marchi [this message]
2018-02-07 10:33 ` [PATCH 07/10] No longer create readonly regcache Yao Qi
2018-02-07 10:33 ` [PATCH 09/10] Move register_dump to regcache-dump.c Yao Qi
2018-02-17 3:50 ` Simon Marchi
2018-02-21 8:27 ` Yao Qi
2018-02-21 12:57 ` Simon Marchi
2018-02-21 13:59 ` Yao Qi
2018-02-21 14:49 ` Simon Marchi
2018-02-17 3:53 ` [PATCH 00/10 v2] Remove regcache::m_readonly_p Simon Marchi
2018-02-21 11:22 ` Yao Qi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3d06d590f8fcf3516ba5e497c2193453@polymtl.ca \
--to=simon.marchi@polymtl.ca \
--cc=gdb-patches@sourceware.org \
--cc=qiyaoltc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox