Add regcache raw_compare method
authorAlan Hayward <alan.hayward@arm.com>
Mon, 11 Jun 2018 09:09:30 +0000 (10:09 +0100)
committerAlan Hayward <alan.hayward@arm.com>
Mon, 11 Jun 2018 09:09:30 +0000 (10:09 +0100)
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/ChangeLog
gdb/common/common-regcache.h
gdb/gdbserver/ChangeLog
gdb/gdbserver/regcache.c
gdb/gdbserver/regcache.h
gdb/regcache.c
gdb/regcache.h

index 9fddd6f976825e2ee1dfa0551d8f931201b36e59..3e51f87d0553c51727e305695f74d552df0fdfd8 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-11  Alan Hayward  <alan.hayward@arm.com>
+
+       * common/common-regcache.h (raw_compare): New function.
+       * regcache.c (regcache::raw_compare): Likewise.
+       * regcache.h (regcache::raw_compare): New declaration.
+
 2018-06-11  Alan Hayward  <alan.hayward@arm.com>
 
        * common/common-regcache.h (reg_buffer_common): New structure.
index 4e6bdde4fc1819886ed3d1ac542c9913a681df96..18080b2c52bc80a1c9254bc0e9c72f8880d0f119 100644 (file)
@@ -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 */
index d11ce5d81ff9fb36a733e9f604aa36f2049c0dbb..475a1aaca9dbbcdb1729320dc212df9527b0caf6 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-11  Alan Hayward  <alan.hayward@arm.com>
+
+       * regcache.c (regcache::raw_compare): New function.
+       * regcache.h (regcache::raw_compare): New declaration.
+
 2018-06-11  Alan Hayward  <alan.hayward@arm.com>
 
        * regcache.c (new_register_cache): Use new.
index 83837525a18c1dc96b6e9d24397064e247ced459..735ce7bccfc7a058f8604620928f3894d4655887 100644 (file)
@@ -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);
+}
index 352c1df3f9eeacd622a3d5d668ff4ea98aea9c6f..b4c4c20ebd368f56f14af758301ff7d55fd16dae 100644 (file)
@@ -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,
index c10c588c30e35860369de33cdbe2ec81bf020124..750ea2ad30f60b03dd76fc30cb72f87d5a531406 100644 (file)
@@ -1079,6 +1079,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.  */
 
index 3b72986db1a0cf81b9a00cc3d4efdff783af174d..41465fb20d0dcdddaf39e47c1fc79f1e8eadc260 100644 (file)
@@ -188,6 +188,9 @@ public:
 
   virtual ~reg_buffer () = default;
 
+  /* 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;