From: Max Filippov <jcmvbkbc@gmail.com>
To: qemu-devel@nongnu.org
Cc: Max Filippov <jcmvbkbc@gmail.com>,
Peter Maydell <peter.maydell@linaro.org>,
Aurelien Jarno <aurelien@aurel32.net>,
Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking
Date: Fri, 21 Sep 2012 04:18:08 +0400 [thread overview]
Message-ID: <1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com> (raw)
In-Reply-To: <1348186688-29410-1-git-send-email-jcmvbkbc@gmail.com>
Do a sanity checking pass on the intermediate code.
Check that goto_tb indices are either 0 or 1 and used at most once per
TB.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
tcg/tcg.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index b8a1bec..cdd1975 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1454,6 +1454,71 @@ static void check_regs(TCGContext *s)
}
#endif
+#ifdef CONFIG_DEBUG_TCG
+static void tcg_sanity_check(TCGContext *s)
+{
+ const uint16_t *opc_ptr;
+ const TCGArg *args;
+ TCGArg arg;
+ TCGOpcode c;
+ int nb_oargs, nb_iargs, nb_cargs, error_count = 0;
+ const TCGOpDef *def;
+ unsigned goto_tb_slots[2] = {0};
+
+ opc_ptr = gen_opc_buf;
+ args = gen_opparam_buf;
+ while (opc_ptr < gen_opc_ptr) {
+ c = *opc_ptr++;
+ def = &tcg_op_defs[c];
+ if (c == INDEX_op_call) {
+ TCGArg arg;
+
+ /* variable number of arguments */
+ arg = *args++;
+ nb_oargs = arg >> 16;
+ nb_iargs = arg & 0xffff;
+ nb_cargs = def->nb_cargs;
+ } else {
+ if (c == INDEX_op_nopn) {
+ /* variable number of arguments */
+ nb_cargs = *args;
+ nb_oargs = 0;
+ nb_iargs = 0;
+ } else {
+ nb_oargs = def->nb_oargs;
+ nb_iargs = def->nb_iargs;
+ nb_cargs = def->nb_cargs;
+ }
+ }
+
+ switch (c) {
+ case INDEX_op_goto_tb:
+ arg = args[0];
+ if (arg != 0 && arg != 1) {
+ qemu_log("TB ERROR: wrong goto_tb slot index: %"TCG_PRIlx"\n",
+ arg);
+ ++error_count;
+ } else {
+ ++goto_tb_slots[arg];
+ if (goto_tb_slots[arg] > 1) {
+ qemu_log("TB ERROR: multiple goto_tb(%"TCG_PRIlx")\n", arg);
+ ++error_count;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ args += nb_iargs + nb_oargs + nb_cargs;
+ }
+ if (error_count) {
+ qemu_log("\n");
+ }
+}
+#endif
+
static void temp_allocate_frame(TCGContext *s, int temp)
{
TCGTemp *ts;
@@ -2082,6 +2147,10 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
}
#endif
+#ifdef CONFIG_DEBUG_TCG
+ tcg_sanity_check(s);
+#endif
+
tcg_reg_alloc_start(s);
s->code_buf = gen_code_buf;
--
1.7.7.6
next prev parent reply other threads:[~2012-09-21 0:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-21 0:18 [Qemu-devel] [PATCH 0/2] Add TCG sanity checks (goto_tb related) Max Filippov
2012-09-21 0:18 ` [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions Max Filippov
2012-09-22 14:55 ` Aurelien Jarno
2012-09-21 0:18 ` Max Filippov [this message]
2012-09-21 8:37 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Michael Tokarev
2012-09-22 14:55 ` Aurelien Jarno
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com \
--to=jcmvbkbc@gmail.com \
--cc=aurelien@aurel32.net \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).