From patchwork Mon Aug 21 15:28:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 22270 Received: (qmail 127791 invoked by alias); 21 Aug 2017 15:29:31 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 127718 invoked by uid 89); 21 Aug 2017 15:29:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-io0-f170.google.com Received: from mail-io0-f170.google.com (HELO mail-io0-f170.google.com) (209.85.223.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 21 Aug 2017 15:29:27 +0000 Received: by mail-io0-f170.google.com with SMTP id p141so11395446iop.3 for ; Mon, 21 Aug 2017 08:29:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=HGC5jcB3fBC7VVnhYXElLAq0cvnK4GW0QH3Y169TLkg=; b=dP2pBwMgRPN7WWV83kkJX1VUP8BY4atdRJjx4lBvs0MiTAG8/Tk2B2KjxTuATK/FW0 te8y64p9ofoFp6UHZ5oqTsyVgcLfII6Jn3FJo3h+xKAXUfr68cBpUOCNWxbPaUg/DFnf t2/a273k/cYJh6oU9ulBjw4lfUiU0hFDWZVsOnsNJFdWXSYFHfxalRDWScIqjU2KLFlX LkrlOJy40e/eesj9aZHWUTohYq11ma5b6hwkvv5Fmgw/6yf91r34EDKE80npqjjRp4Fy G4Oi6XjuDSjHar0XE8tz3rguzQitG39eXWQD3EjcgJe9JUkpIeXS1qqByFk6qa/FFr3R 9t6A== X-Gm-Message-State: AHYfb5gyv24x/Eub8KMaJ3DzVzcNUjbgfAtj+xEnl3Ko7oRBK0wl9ZX1 UJD1RCVcNDBQ52Ls X-Received: by 10.107.195.73 with SMTP id t70mr15805274iof.55.1503329365915; Mon, 21 Aug 2017 08:29:25 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id p62sm5831589ioe.34.2017.08.21.08.29.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 21 Aug 2017 08:29:25 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 09/22] [GDBserver] unit test to i386_tdesc Date: Mon, 21 Aug 2017 16:28:54 +0100 Message-Id: <1503329347-26711-10-git-send-email-yao.qi@linaro.org> In-Reply-To: <1503329347-26711-1-git-send-email-yao.qi@linaro.org> References: <1503329347-26711-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes This patch adds a unit test in GDBserver to test dynamically created target descriptions equal these pre-generated ones. gdb/gdbserver: 2017-07-07 Yao Qi * 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-07-07 Yao Qi * regformats/regdef.h (struct reg): Override operator == and !=. --- gdb/gdbserver/linux-x86-tdesc.c | 37 ++++++++++++++++++++++++++++++++++++ gdb/gdbserver/tdesc.h | 42 ++++++++++++++++++++++++++++++++++++++++- gdb/regformats/regdef.h | 12 ++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c index 0d0be83..1f3dbaf 100644 --- a/gdb/gdbserver/linux-x86-tdesc.c +++ b/gdb/gdbserver/linux-x86-tdesc.c @@ -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 } diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index 50d0364..49c82c6 100644 --- a/gdb/gdbserver/tdesc.h +++ b/gdb/gdbserver/tdesc.h @@ -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 }; diff --git a/gdb/regformats/regdef.h b/gdb/regformats/regdef.h index de7a010..ff1d40b 100644 --- a/gdb/regformats/regdef.h +++ b/gdb/regformats/regdef.h @@ -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 */