This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] cooked_read test for readonly regcache


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a63f2d2feedcfce401ae1d7d03d119bfa5e4d8bc

commit a63f2d2feedcfce401ae1d7d03d119bfa5e4d8bc
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri Nov 24 13:04:30 2017 +0000

    cooked_read test for readonly regcache
    
    This patch adds a test to check cooked_read for readonly regcache.  For
    raw registers, cooked_read get either REG_VALID or REG_UNKNOWN, depends on
    the raw register is in save_reggroup or not.  For pseudo register,
    cooked_read get different result in different ports.
    
    gdb:
    
    2017-11-24  Yao Qi  <yao.qi@linaro.org>
    
    	* regcache.c (cooked_read_test): Add more test for readonly
    	regcache.

Diff:
---
 gdb/ChangeLog  |  5 ++++
 gdb/regcache.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9947aaa..aecd85b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2017-11-24  Yao Qi  <yao.qi@linaro.org>
 
+	* regcache.c (cooked_read_test): Add more test for readonly
+	regcache.
+
+2017-11-24  Yao Qi  <yao.qi@linaro.org>
+
 	* gdbarch-selftests.c (test_target_has_registers): Move it to
 	target.c.
 	(test_target_has_stack): Likewise.
diff --git a/gdb/regcache.c b/gdb/regcache.c
index c37a520..e82176b 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1865,6 +1865,82 @@ cooked_read_test (struct gdbarch *gdbarch)
 
       mock_target.reset ();
     }
+
+  regcache readonly (regcache::readonly, readwrite);
+
+  /* GDB may go to target layer to fetch all registers and memory for
+     readonly regcache.  */
+  mock_target.reset ();
+
+  for (int regnum = 0;
+       regnum < gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+       regnum++)
+    {
+      if (gdbarch_bfd_arch_info (gdbarch)->arch == bfd_arch_mt)
+	{
+	  /* Trigger an internal error otherwise.  */
+	  continue;
+	}
+
+      if (register_size (gdbarch, regnum) == 0)
+	continue;
+
+      gdb::def_vector<gdb_byte> buf (register_size (gdbarch, regnum));
+      enum register_status status = readonly.cooked_read (regnum,
+							  buf.data ());
+
+      if (regnum < gdbarch_num_regs (gdbarch))
+	{
+	  auto bfd_arch = gdbarch_bfd_arch_info (gdbarch)->arch;
+
+	  if (bfd_arch == bfd_arch_frv || bfd_arch == bfd_arch_h8300
+	      || bfd_arch == bfd_arch_m32c || bfd_arch == bfd_arch_sh
+	      || bfd_arch == bfd_arch_alpha || bfd_arch == bfd_arch_v850
+	      || bfd_arch == bfd_arch_msp430 || bfd_arch == bfd_arch_mep
+	      || bfd_arch == bfd_arch_mips || bfd_arch == bfd_arch_v850_rh850
+	      || bfd_arch == bfd_arch_tic6x || bfd_arch == bfd_arch_mn10300
+	      || bfd_arch == bfd_arch_rl78 || bfd_arch == bfd_arch_score)
+	    {
+	      /* Raw registers.  If raw registers are not in save_reggroup,
+		 their status are unknown.  */
+	      if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
+		SELF_CHECK (status == REG_VALID);
+	      else
+		SELF_CHECK (status == REG_UNKNOWN);
+	    }
+	  else
+	    SELF_CHECK (status == REG_VALID);
+	}
+      else
+	{
+	  if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
+	    SELF_CHECK (status == REG_VALID);
+	  else
+	    {
+	      /* If pseudo registers are not in save_reggroup, some of
+		 them can be computed from saved raw registers, but some
+		 of them are unknown.  */
+	      auto bfd_arch = gdbarch_bfd_arch_info (gdbarch)->arch;
+
+	      if (bfd_arch == bfd_arch_frv
+		  || bfd_arch == bfd_arch_m32c
+		  || bfd_arch == bfd_arch_mep
+		  || bfd_arch == bfd_arch_sh)
+		SELF_CHECK (status == REG_VALID || status == REG_UNKNOWN);
+	      else if (bfd_arch == bfd_arch_mips
+		       || bfd_arch == bfd_arch_h8300)
+		SELF_CHECK (status == REG_UNKNOWN);
+	      else
+		SELF_CHECK (status == REG_VALID);
+	    }
+	}
+
+      SELF_CHECK (mock_target.fetch_registers_called == 0);
+      SELF_CHECK (mock_target.store_registers_called == 0);
+      SELF_CHECK (mock_target.xfer_partial_called == 0);
+
+      mock_target.reset ();
+    }
 }
 
 } // namespace selftests


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]