cooked_read test for readonly regcache
authorYao Qi <yao.qi@linaro.org>
Fri, 24 Nov 2017 13:04:30 +0000 (13:04 +0000)
committerYao Qi <yao.qi@linaro.org>
Fri, 24 Nov 2017 13:04:30 +0000 (13:04 +0000)
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.

gdb/ChangeLog
gdb/regcache.c

index 9947aaa8356c96072c11c97e27bde1889f2b6689..aecd85b2f34fb1d059544c178c783b3a400caa42 100644 (file)
@@ -1,3 +1,8 @@
+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
index c37a520b3f8edd9327417c1f9934ca2175062b49..e82176b202cf63806a26980c78b9ea495362316b 100644 (file)
@@ -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
This page took 0.032872 seconds and 4 git commands to generate.