From: Alan Hayward <Alan.Hayward@arm.com>
To: Simon Marchi <simon.marchi@ericsson.com>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
nd <nd@arm.com>
Subject: Re: [PATCH v2 04/10] Add regcache raw_compare method
Date: Fri, 08 Jun 2018 15:16:00 -0000 [thread overview]
Message-ID: <B2E1E96D-A235-4CE2-9CF9-217FBE23C50A@arm.com> (raw)
In-Reply-To: <ada727b3-a7d5-bc04-afd8-4b32f8ec67ac@ericsson.com>
> On 7 Jun 2018, at 21:55, Simon Marchi <simon.marchi@ericsson.com> wrote:
>
> On 2018-06-06 11:16 AM, Alan Hayward wrote:
>> raw_compare returns the same as a memcmp (0 for success,
>> the diff otherwise). Kept with tristate return as this
>> feels potentally more useful than a simple true/false return.
>> (Happy to change if not).
>
> I would err on the bool side, but I don't really mind, the important is
> that it's documented properly. We still use many ints as bool in GDB, so
> someone seeing an int return value could easily think it's 0 -> not equal,
> 1 -> equal.
Ok, updated.
>
> Speaking of doc, I would suggest (as in the previous patch) to centralize
> the doc in the class/struct at the root, so we don't duplicate it.
Done.
>
>> 2018-06-06 Alan Hayward <alan.hayward@arm.com>
>>
>> gdb/
>> * common/common-regcache.h (raw_compare): New function.
>> * regcache.c (regcache::raw_compare): Likewise.
>> * regcache.h (regcache::raw_compare): New declaration.
>>
>> gdbserver/
>> * regcache.c (regcache::raw_compare): New function.
>> * regcache.h (regcache::raw_compare): New declaration.
>> ---
>> gdb/common/common-regcache.h | 1 +
>> gdb/gdbserver/regcache.c | 10 ++++++++++
>> gdb/gdbserver/regcache.h | 5 +++++
>> gdb/regcache.c | 15 +++++++++++++++
>> gdb/regcache.h | 11 +++++++++++
>> 5 files changed, 42 insertions(+)
>>
>> diff --git a/gdb/common/common-regcache.h b/gdb/common/common-regcache.h
>> index 487da0a7fb..e91439bec5 100644
>> --- a/gdb/common/common-regcache.h
>> +++ b/gdb/common/common-regcache.h
>> @@ -67,6 +67,7 @@ struct reg_buffer_common
>> virtual ~reg_buffer_common () = default;
>> virtual void raw_supply (int regnum, const void *buf) = 0;
>> virtual void raw_collect (int regnum, void *buf) const = 0;
>> + virtual int raw_compare (int regnum, const void *buf, int offset) const = 0;
>> virtual register_status get_register_status (int regnum) const = 0;
>> };
>>
>> diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
>> index 857721ee3d..9648428349 100644
>> --- a/gdb/gdbserver/regcache.c
>> +++ b/gdb/gdbserver/regcache.c
>> @@ -501,3 +501,13 @@ regcache::get_register_status (int regnum) const
>> return REG_VALID;
>> #endif
>> }
>> +
>> +/* See gdbserver/regcache.h. */
>> +
>> +int
>> +regcache::raw_compare (int regnum, const void *buf, int offset) const
>> +{
>> + gdb_assert (register_size (tdesc, regnum) > offset);
>
> Should we check ">= offset"? I think it could be useful for some edge cases
> where we could avoid an "if (offset < size)" in the caller, if we know offset
> could be equal to size. memcmp would return 0 (equal), which is fine.
>
Given that memcmp can cope with this, then ok.
(I need to make sure I update the patch that uses this function too!)
> Maybe assign "register_size (tdesc, regnum)" to a variable (e.g. reg_size)
> and use it in both places?
Done.
>
>> + return memcmp (buf, register_data (this, regnum, 1) + offset,
>> + register_size (tdesc, regnum) - offset);
>> +}
>> diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h
>> index 1842f1d9cf..b26f39a8ad 100644
>> --- a/gdb/gdbserver/regcache.h
>> +++ b/gdb/gdbserver/regcache.h
>> @@ -50,6 +50,11 @@ struct regcache : public reg_buffer_common
>>
>> void raw_collect (int regnum, void *buf) const override;
>>
>> + /* Compare the contents of the register stored in the regcache (ignoring the
>> + first OFFSET bytes) to the contents of BUF (without any offset). Returns
>> + the same result as memcmp. */
>> + int raw_compare (int regnum, const void *buf, int offset) const override;
>> +
>> enum register_status get_register_status (int regnum) const override;
>> };
>>
>> diff --git a/gdb/regcache.c b/gdb/regcache.c
>> index a914b548ca..383e355e9f 100644
>> --- a/gdb/regcache.c
>> +++ b/gdb/regcache.c
>> @@ -1082,6 +1082,21 @@ regcache::collect_regset (const struct regset *regset,
>> transfer_regset (regset, NULL, regnum, NULL, buf, size);
>> }
>>
>> +/* See regcache.h. */
>> +
>> +int
>> +regcache::raw_compare (int regnum, const void *buf, int offset) const
>> +{
>> + const char *regbuf;
>> + size_t size;
>> +
>> + gdb_assert (buf != NULL);
>> + assert_regnum (regnum);
>
> Should we assert that offset is < or <= size here too?
>
Not sure why I didn’t add this.
Patch update with changes above. Are you ok with this version?
diff --git a/gdb/common/common-regcache.h b/gdb/common/common-regcache.h
index 29d9a81182ad1a5797b080e136b682fe59ecef37..fe3ece7ac52d60d07d718ad617f30be2f7133b5f 100644
--- a/gdb/common/common-regcache.h
+++ b/gdb/common/common-regcache.h
@@ -75,6 +75,11 @@ struct reg_buffer_common
/* Collect register REGNUM from REGCACHE and store its contents in BUF. */
virtual void raw_collect (int regnum, void *buf) const = 0;
+
+ /* Compare the contents of the register stored in the regcache (ignoring the
+ first OFFSET bytes) to the contents of BUF (without any offset). Returns
+ True if the same. */
+ virtual bool raw_compare (int regnum, const void *buf, int offset) const = 0;
};
#endif /* COMMON_REGCACHE_H */
diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h
index 352c1df3f9eeacd622a3d5d668ff4ea98aea9c6f..b4c4c20ebd368f56f14af758301ff7d55fd16dae 100644
--- a/gdb/gdbserver/regcache.h
+++ b/gdb/gdbserver/regcache.h
@@ -54,6 +54,9 @@ struct regcache : public reg_buffer_common
/* See common/common-regcache.h. */
void raw_collect (int regnum, void *buf) const override;
+
+ /* See common/common-regcache.h. */
+ bool raw_compare (int regnum, const void *buf, int offset) const override;
};
struct regcache *init_register_cache (struct regcache *regcache,
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index 83837525a18c1dc96b6e9d24397064e247ced459..735ce7bccfc7a058f8604620928f3894d4655887 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -502,3 +502,17 @@ regcache::get_register_status (int regnum) const
return REG_VALID;
#endif
}
+
+/* See common/common-regcache.h. */
+
+bool
+regcache::raw_compare (int regnum, const void *buf, int offset) const
+{
+ gdb_assert (buf != NULL);
+
+ const unsigned char *regbuf = register_data (this, regnum, 1);
+ int size = register_size (tdesc, regnum);
+ gdb_assert (size >= offset);
+
+ return (memcmp (buf, regbuf + offset, size - offset) == 0);
+}
diff --git a/gdb/regcache.h b/gdb/regcache.h
index 4e5659b25bc530a4ced32520825136534be2e642..511864858d24a7fa53047fdc247846a551b121af 100644
--- a/gdb/regcache.h
+++ b/gdb/regcache.h
@@ -191,6 +191,10 @@ public:
xfree (m_registers);
xfree (m_register_status);
}
+
+ /* See common/common-regcache.h. */
+ bool raw_compare (int regnum, const void *buf, int offset) const override;
+
protected:
/* Assert on the range of REGNUM. */
void assert_regnum (int regnum) const;
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 032fef0d34ac635c96dd6c39426f5c6d04f28095..fd0fd7318c8cca0083c897d2bd6ba1361dd627c0 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1078,6 +1078,20 @@ regcache::collect_regset (const struct regset *regset,
transfer_regset (regset, NULL, regnum, NULL, buf, size);
}
+/* See common/common-regcache.h. */
+
+bool
+reg_buffer::raw_compare (int regnum, const void *buf, int offset) const
+{
+ gdb_assert (buf != NULL);
+ assert_regnum (regnum);
+
+ const char *regbuf = (const char *) register_buffer (regnum);
+ size_t size = m_descr->sizeof_register[regnum];
+ gdb_assert (size >= offset);
+
+ return (memcmp (buf, regbuf + offset, size - offset) == 0);
+}
/* Special handling for register PC. */
next prev parent reply other threads:[~2018-06-08 15:16 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-06 15:16 [PATCH v2 00/10] gdb/gdbserver support for aarch64 SVE Alan Hayward
2018-06-06 15:17 ` [PATCH v2 09/10] Ptrace support for AArch64 SVE gdbsever Alan Hayward
2018-06-11 2:43 ` Simon Marchi
2018-06-11 2:44 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 02/10] Add Aarch64 SVE Linux headers Alan Hayward
2018-06-08 14:13 ` Alan Hayward
2018-06-08 14:37 ` Simon Marchi
2018-06-08 15:23 ` Simon Marchi
2018-06-12 14:37 ` Alan Hayward
2018-06-12 14:43 ` Pedro Alves
2018-06-12 15:06 ` Simon Marchi
2018-06-12 15:11 ` Pedro Alves
2018-06-12 15:21 ` Simon Marchi
2018-06-12 15:09 ` Alan Hayward
2018-06-12 14:51 ` Simon Marchi
2018-06-12 16:34 ` Sergio Durigan Junior
2018-06-12 17:51 ` Alan Hayward
2018-06-12 20:29 ` Sergio Durigan Junior
2018-06-15 9:45 ` Ramana Radhakrishnan
2018-06-15 17:14 ` Alan Hayward
2018-09-20 21:16 ` Status of the AArch* builders (was: Re: [PATCH v2 02/10] Add Aarch64 SVE Linux headers) Sergio Durigan Junior
2018-09-24 14:16 ` Alan Hayward
2018-09-24 14:42 ` Status of the AArch* builders Sergio Durigan Junior
2018-10-11 9:23 ` Alan Hayward
2018-10-12 19:06 ` Sergio Durigan Junior
2018-10-15 10:16 ` Alan Hayward
2018-10-15 12:42 ` Sergio Durigan Junior
2018-10-15 14:02 ` Alan Hayward
2018-10-15 15:32 ` Sergio Durigan Junior
2018-10-17 18:46 ` Sergio Durigan Junior
2018-10-24 9:56 ` Alan Hayward
2018-10-25 16:26 ` Sergio Durigan Junior
2018-06-08 15:27 ` [PATCH v2 02/10] Add Aarch64 SVE Linux headers Alan Hayward
2018-06-06 15:17 ` [PATCH v2 01/10] Aarch64 SVE pseudo register support Alan Hayward
2018-06-06 22:17 ` Simon Marchi
2018-06-07 9:34 ` Alan Hayward
2018-06-06 15:17 ` [PATCH v2 07/10] Increase gdbsever PBUFSIZ Alan Hayward
2018-06-11 0:46 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 08/10] Enable Aarch64 SVE for gdbserver Alan Hayward
2018-06-11 0:49 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 10/10] Remove reg2 section from Aarch64 SVE cores Alan Hayward
2018-06-11 2:47 ` Simon Marchi
2018-06-11 16:37 ` Alan Hayward
2018-06-06 15:17 ` [PATCH v2 05/10] Ptrace support for Aarch64 SVE Alan Hayward
2018-06-10 22:52 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 06/10] Add Aarch64 SVE dwarf regnums Alan Hayward
2018-06-11 0:43 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 03/10] Add reg_buffer_common Alan Hayward
2018-06-07 20:19 ` Simon Marchi
2018-06-07 20:42 ` Simon Marchi
2018-06-08 14:14 ` Alan Hayward
2018-06-10 22:21 ` Simon Marchi
2018-06-06 15:17 ` [PATCH v2 04/10] Add regcache raw_compare method Alan Hayward
2018-06-07 20:56 ` Simon Marchi
2018-06-08 15:16 ` Alan Hayward [this message]
2018-06-10 22:26 ` Simon Marchi
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=B2E1E96D-A235-4CE2-9CF9-217FBE23C50A@arm.com \
--to=alan.hayward@arm.com \
--cc=gdb-patches@sourceware.org \
--cc=nd@arm.com \
--cc=simon.marchi@ericsson.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).