From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:57114) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TFR7G-0007wI-4B for qemu-devel@nongnu.org; Sat, 22 Sep 2012 10:55:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TFR7C-0001zl-5M for qemu-devel@nongnu.org; Sat, 22 Sep 2012 10:55:34 -0400 Received: from hall.aurel32.net ([88.191.126.93]:55776) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TFR7B-0001zh-T0 for qemu-devel@nongnu.org; Sat, 22 Sep 2012 10:55:30 -0400 Date: Sat, 22 Sep 2012 16:55:21 +0200 From: Aurelien Jarno Message-ID: <20120922145521.GA17188@ohm.aurel32.net> References: <1348186688-29410-1-git-send-email-jcmvbkbc@gmail.com> <1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com> Subject: Re: [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Filippov Cc: Peter Maydell , qemu-devel@nongnu.org, Richard Henderson On Fri, Sep 21, 2012 at 04:18:08AM +0400, Max Filippov wrote: > 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 > --- > 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; I think this is better address in the patch from Richard Henderson. -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net