From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NiC4u-0002Ug-JD for qemu-devel@nongnu.org; Thu, 18 Feb 2010 14:30:24 -0500 Received: from [199.232.76.173] (port=38611 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NiC4u-0002US-1v for qemu-devel@nongnu.org; Thu, 18 Feb 2010 14:30:24 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1NiC4t-0006WZ-2h for qemu-devel@nongnu.org; Thu, 18 Feb 2010 14:30:23 -0500 Received: from mail-pz0-f194.google.com ([209.85.222.194]:42094) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NiC4s-0006WQ-NH for qemu-devel@nongnu.org; Thu, 18 Feb 2010 14:30:22 -0500 Received: by pzk32 with SMTP id 32so443566pzk.4 for ; Thu, 18 Feb 2010 11:30:21 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <1266250641-32585-1-git-send-email-weil@mail.berlios.de> References: <1266250641-32585-1-git-send-email-weil@mail.berlios.de> From: Blue Swirl Date: Thu, 18 Feb 2010 21:30:01 +0200 Message-ID: Subject: Re: [Qemu-devel] [PATCH] tcg: Add consistency checks for op definitions Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Weil Cc: qemu-devel Thanks, applied. On Mon, Feb 15, 2010 at 6:17 PM, Stefan Weil wrote: > When compiled with CONFIG_DEBUG_TCG, this code looks > for missing, duplicate and wrong entries in the > op definitions. > > Errors will raise an assertion at program start > (all checks are done in the initial phase). > > The current code contains such errors, at least for > i386 guest on i386 host. > > Signed-off-by: Stefan Weil > --- > =C2=A0tcg/tcg.c | =C2=A0 21 +++++++++++++++++++++ > =C2=A0tcg/tcg.h | =C2=A0 =C2=A03 +++ > =C2=A02 files changed, 24 insertions(+), 0 deletions(-) > > diff --git a/tcg/tcg.c b/tcg/tcg.c > index 9949814..e6a1caf 100644 > --- a/tcg/tcg.c > +++ b/tcg/tcg.c > @@ -981,9 +981,16 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef= *tdefs) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 op =3D tdefs->op; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 assert(op >=3D 0 && op < NB_OPS); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 def =3D &tcg_op_defs[op]; > +#if defined(CONFIG_DEBUG_TCG) > + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Duplicate entry in op definitions? */ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0assert(!def->used); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0def->used =3D 1; > +#endif > =C2=A0 =C2=A0 =C2=A0 =C2=A0 nb_args =3D def->nb_iargs + def->nb_oargs; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 for(i =3D 0; i < nb_args; i++) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ct_str =3D tdefs->args_ct_str[i= ]; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Incomplete TCGTargetOpDef e= ntry? */ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0assert(ct_str !=3D NULL); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tcg_regset_clear(def->args_ct[i= ].u.regs); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 def->args_ct[i].ct =3D 0; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ct_str[0] >=3D '0' && ct_st= r[0] <=3D '9') { > @@ -1018,6 +1025,9 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDe= f *tdefs) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* TCGTargetOpDef entry with too much inform= ation? */ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0assert(i =3D=3D TCG_MAX_OP_ARGS || tdefs->ar= gs_ct_str[i] =3D=3D NULL); > + > =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* sort the constraints (XXX: this is just an= heuristic) */ > =C2=A0 =C2=A0 =C2=A0 =C2=A0 sort_constraints(def, 0, def->nb_oargs); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 sort_constraints(def, def->nb_oargs, def->nb_= iargs); > @@ -1035,6 +1045,17 @@ void tcg_add_target_add_op_defs(const TCGTargetOpD= ef *tdefs) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 tdefs++; > =C2=A0 =C2=A0 } > > +#if defined(CONFIG_DEBUG_TCG) > + =C2=A0 =C2=A0for (op =3D 0; op < ARRAY_SIZE(tcg_op_defs); op++) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (op < INDEX_op_call || op =3D=3D INDEX_op= _debug_insn_start) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Wrong entry in op definitio= ns? */ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0assert(!tcg_op_defs[op].used); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Missing entry in op definit= ions? */ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0assert(tcg_op_defs[op].used); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0} > +#endif > =C2=A0} > > =C2=A0#ifdef USE_LIVENESS_ANALYSIS > diff --git a/tcg/tcg.h b/tcg/tcg.h > index b218abe..aca9f27 100644 > --- a/tcg/tcg.h > +++ b/tcg/tcg.h > @@ -404,6 +404,9 @@ typedef struct TCGOpDef { > =C2=A0 =C2=A0 uint16_t copy_size; > =C2=A0 =C2=A0 TCGArgConstraint *args_ct; > =C2=A0 =C2=A0 int *sorted_args; > +#if defined(CONFIG_DEBUG_TCG) > + =C2=A0 =C2=A0int used; > +#endif > =C2=A0} TCGOpDef; > > =C2=A0typedef struct TCGTargetOpDef { > -- > 1.6.6.1 > > > >