[GDBserver] unit test to i386_tdesc
authorYao Qi <yao.qi@linaro.org>
Tue, 5 Sep 2017 08:54:53 +0000 (09:54 +0100)
committerYao Qi <yao.qi@linaro.org>
Tue, 5 Sep 2017 08:54:53 +0000 (09:54 +0100)
This patch adds a unit test in GDBserver to test dynamically created
target descriptions equal these pre-generated ones.

gdb/gdbserver:

2017-09-05  Yao Qi  <yao.qi@linaro.org>

* linux-x86-tdesc.c: Include selftest.h.
(i386_tdesc_test): New function.
(initialize_low_tdesc): Call selftests::register_test.
* tdesc.h: Include regdef.h.
(target_desc): Override operator == and !=.

gdb:

2017-09-05  Yao Qi  <yao.qi@linaro.org>

* regformats/regdef.h (struct reg): Override operator == and !=.

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-x86-tdesc.c
gdb/gdbserver/tdesc.h
gdb/regformats/regdef.h

index cebd4f563e3d5d7af0a8ec9af48cc57cbb25c164..84135045ffc4add167a330f7b63b7c5dd0a17116 100644 (file)
@@ -1,3 +1,7 @@
+2017-09-05  Yao Qi  <yao.qi@linaro.org>
+
+       * regformats/regdef.h (struct reg): Override operator == and !=.
+
 2017-09-05  Yao Qi  <yao.qi@linaro.org>
 
        * arch/tdesc.h: New file.
index 66e9f5379b80acfcd18fc74e47596e5ac5b2eda4..20a0c9791149761eac67f5f1a417d58576f4cec7 100644 (file)
@@ -1,3 +1,11 @@
+2017-09-05  Yao Qi  <yao.qi@linaro.org>
+
+       * linux-x86-tdesc.c: Include selftest.h.
+       (i386_tdesc_test): New function.
+       (initialize_low_tdesc): Call selftests::register_test.
+       * tdesc.h: Include regdef.h.
+       (target_desc): Override operator == and !=.
+
 2017-09-05  Yao Qi  <yao.qi@linaro.org>
 
        * configure.srv (srv_tgtobj): Append linux-x86-tdesc.o.
index 0d0be83d4a168ecbcf232ae1ae453f2ebc84d59d..1f3dbaf9e21386f2cc2744a9828b65978798b096 100644 (file)
@@ -63,6 +63,39 @@ extern const struct target_desc *tdesc_i386_mpx_linux;
 
 static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
 
+#if defined GDB_SELF_TEST && !defined IN_PROCESS_AGENT
+#include "selftest.h"
+
+namespace selftests {
+namespace tdesc {
+static void
+i386_tdesc_test ()
+{
+  struct
+  {
+    unsigned int mask;
+    const target_desc *tdesc;
+  } tdesc_tests[] = {
+    { X86_XSTATE_X87, tdesc_i386_mmx_linux },
+    { X86_XSTATE_SSE_MASK, tdesc_i386_linux },
+    { X86_XSTATE_AVX_MASK, tdesc_i386_avx_linux },
+    { X86_XSTATE_MPX_MASK, tdesc_i386_mpx_linux },
+    { X86_XSTATE_AVX_MPX_MASK, tdesc_i386_avx_mpx_linux },
+    { X86_XSTATE_AVX_AVX512_MASK, tdesc_i386_avx_avx512_linux },
+    { X86_XSTATE_AVX_MPX_AVX512_PKU_MASK, tdesc_i386_avx_mpx_avx512_pku_linux }
+  };
+
+  for (auto &elem : tdesc_tests)
+    {
+      const target_desc *tdesc = i386_linux_read_description (elem.mask);
+
+      SELF_CHECK (*tdesc == *elem.tdesc);
+    }
+}
+}
+} // namespace selftests
+#endif /* GDB_SELF_TEST */
+
 void
 initialize_low_tdesc ()
 {
@@ -74,6 +107,10 @@ initialize_low_tdesc ()
   init_registers_i386_avx_mpx_linux ();
   init_registers_i386_avx_avx512_linux ();
   init_registers_i386_avx_mpx_avx512_pku_linux ();
+
+#if GDB_SELF_TEST && !defined IN_PROCESS_AGENT
+  selftests::register_test (selftests::tdesc::i386_tdesc_test);
+#endif
 #endif
 }
 
index 50d0364faeb1638346537cfaa34831cc64b785cd..49c82c6c1697f3e0280418334e2f1353289d77c2 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "arch/tdesc.h"
 
-struct reg;
+#include "regdef.h"
 
 typedef struct reg *tdesc_reg_p;
 DEF_VEC_P(tdesc_reg_p);
@@ -66,6 +66,46 @@ public:
       xfree (reg);
     VEC_free (tdesc_reg_p, reg_defs);
   }
+
+  bool operator== (const target_desc &other) const
+  {
+    if (VEC_length (tdesc_reg_p, reg_defs)
+       != VEC_length (tdesc_reg_p, other.reg_defs))
+      return false;
+
+    struct reg *reg;
+
+    for (int ix = 0;
+        VEC_iterate (tdesc_reg_p, reg_defs, ix, reg);
+        ix++)
+      {
+       struct reg *reg2
+         = VEC_index (tdesc_reg_p, other.reg_defs, ix);
+
+       if (reg != reg2 && *reg != *reg2)
+         return false;
+      }
+
+    /* Compare expedite_regs.  */
+    int i = 0;
+    for (; expedite_regs[i] != NULL; i++)
+      {
+       if (strcmp (expedite_regs[i], other.expedite_regs[i]) != 0)
+         return false;
+      }
+    if (other.expedite_regs[i] != NULL)
+      return false;
+
+    if (strcmp (xmltarget, other.xmltarget) != 0)
+      return false;
+
+    return true;
+  }
+
+  bool operator!= (const target_desc &other) const
+  {
+    return !(*this == other);
+  }
 #endif
 };
 
index de7a010ec7558d92b97a5f020c0c3685b76b865c..ff1d40b777db70ba8b01d96945c03365854e3872 100644 (file)
@@ -34,6 +34,18 @@ struct reg
 
   /* The size (in bits) of the value of this register, as transmitted.  */
   int size;
+
+  bool operator== (const reg &other) const
+  {
+    return (strcmp (name, other.name) == 0
+           && offset == other.offset
+           && size == other.size);
+  }
+
+  bool operator!= (const reg &other) const
+  {
+    return !(*this == other);
+  }
 };
 
 #endif /* REGDEF_H */