From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:56804) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RNppn-0000P7-S7 for qemu-devel@nongnu.org; Tue, 08 Nov 2011 12:51:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RNppm-0000dj-Nq for qemu-devel@nongnu.org; Tue, 08 Nov 2011 12:51:43 -0500 Received: from v220110690675601.yourvserver.net ([78.47.199.172]:35818) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RNppm-0000b9-G7 for qemu-devel@nongnu.org; Tue, 08 Nov 2011 12:51:42 -0500 Message-ID: <4EB96BEF.8040009@weilnetz.de> Date: Tue, 08 Nov 2011 18:50:39 +0100 From: Stefan Weil MIME-Version: 1.0 References: <4EB8FE65.8020503@suse.de> In-Reply-To: <4EB8FE65.8020503@suse.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [TestDay] s390x build broken List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= Cc: qemu-devel Developers , Alexander Graf , Blue Swirl , Aurelien Jarno , Richard Henderson This is something were we need a consensus of all maintainers of tcg=20 targets, therefore I extended the cc list to get them informed. Am 08.11.2011 11:03, schrieb Andreas F=C3=A4rber: > Hi everyone, > > Got this with v1.0-rc1 tarball: > > CC i386-softmmu/tcg/tcg.o > In file included from /suse/afaerber/QEMU/qemu-1.0rc1/tcg/tcg.c:176: > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/s390/tcg-target.c:677: error: > conflicting types for =E2=80=98tcg_out_mov=E2=80=99 > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/tcg.c:76: error: previous > declaration of =E2=80=98tcg_out_mov=E2=80=99 was here > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/s390/tcg-target.c:689: error: > conflicting types for =E2=80=98tcg_out_movi=E2=80=99 > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/tcg.c:77: error: previous > declaration of =E2=80=98tcg_out_movi=E2=80=99 was here > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/s390/tcg-target.c:829: error: > conflicting types for =E2=80=98tcg_out_ld=E2=80=99 > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/tcg.c:74: error: previous > declaration of =E2=80=98tcg_out_ld=E2=80=99 was here > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/s390/tcg-target.c:839: error: > conflicting types for =E2=80=98tcg_out_st=E2=80=99 > /suse/afaerber/QEMU/qemu-1.0rc1/tcg/tcg.c:81: error: previous > declaration of =E2=80=98tcg_out_st=E2=80=99 was here > make[1]: *** [tcg/tcg.o] Fehler 1 > make: *** [subdir-i386-softmmu] Fehler 2 > > The difference is TCGReg vs. int. > > tcg/tcg.c: > static void tcg_out_mov(TCGContext *s, TCGType type, int ret, int arg); > > tcg/s390/tcg-target.c: > static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg dst,=20 > TCGReg src) > > tcg/s390/tcg-target.h: > typedef enum TCGReg { > TCG_REG_R0 =3D 0, > TCG_REG_R1, > TCG_REG_R2, > TCG_REG_R3, > TCG_REG_R4, > TCG_REG_R5, > TCG_REG_R6, > TCG_REG_R7, > TCG_REG_R8, > TCG_REG_R9, > TCG_REG_R10, > TCG_REG_R11, > TCG_REG_R12, > TCG_REG_R13, > TCG_REG_R14, > TCG_REG_R15 > } TCGReg; > > > Alex, wasn't this already discussed a few weeks ago? > > Regards, > Andreas It was, although that last discussion only covered part of the problem (see http://lists.nongnu.org/archive/html/qemu-devel/2011-10/msg00770.htm= l). The majority of the tcg targets uses declarations with type 'int' for tcg register arguments, like this one: static inline void tcg_out_mov(TCGContext *s, TCGType type, int ret, int=20 arg) When I first wrote the forward declaration in tcg.c, this was the only st= yle used, so there was no conflict. Now the s390 tcg targets uses 'TCGReg' which is currently only declared=20 for this target: static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg dst, TCGReg s= rc) The ia64 tcg target uses 'TCGArg': static inline void tcg_out_mov(TCGContext *s, TCGType type, TCGArg ret,=20 TCGArg arg) So there is a complete confusion with three different declarations of some functions (and some use inline while others don't). Currently, not only s390 no longer compiles. I expect the same kind of problem for ia64 (obviously it is not used very often). As usual there are lots of ways how to fix this. * We can accept different prototypes for different hosts and remove the forward declarations from tcg.c or make them conditionally (not for ia64 and s390). * We can fix s390 and ia64 to use the same declarations as the other tcg targets. * We can use either the s390 or the ia64 prototypes for all tcg targets. * We can introduce new prototypes and use the=E1=B8=BF for all tcg target= s. I don't think the first one is a clean solution. Functions which are call= ed from tcg.c should have a uniform interface. But that was the status as it existed before the forward declarations were added to tcg.c, so conditional compilation might serve as a quick hack to fix compilation= . We could also revert the forward declarations as a temporary solution but that would allow adding new tcg targets with even more variants of prototypes. My favorite is the last solution with prototypes like this one: static void tcg_out_mov(TCGContext *s, TCGType type, TCGRegister dst,=20 TCGRegistersrc) We don't have TCGCon but use TCGContext and so on, so we should also use TCGRegister instead of TCGReg. As soon as there is a consensus whether to use int, TCGReg, TCGArg or TCGRegister, the tcg target code and tcg.[ch] can be fixed to use it. In a first step, only the common function prototypes would be fixed, so compilation would work again. In further steps, each tcg target (and tcg.c) would need additional changes to use TCGRegister at all places where it fits. Regards, Stefan Weil