From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53825) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a3ORV-0000DR-DX for Qemu-devel@nongnu.org; Mon, 30 Nov 2015 08:24:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a3ORS-0008S8-1l for Qemu-devel@nongnu.org; Mon, 30 Nov 2015 08:24:33 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40416) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a3ORR-0008Rx-Ql for Qemu-devel@nongnu.org; Mon, 30 Nov 2015 08:24:29 -0500 From: Juan Quintela In-Reply-To: (Peter Maydell's message of "Fri, 27 Nov 2015 18:49:21 +0000") References: <93259ECD-066A-413E-B647-2BB240DBF7EC@livius.net> <2E7B730D-C409-4800-9BEC-8E302812C7E8@livius.net> <54778506.5060200@weilnetz.de> <547820C8.3060805@weilnetz.de> Date: Mon, 30 Nov 2015 14:24:21 +0100 Message-ID: <878u5foc1m.fsf@emacs.mitica> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] MinGW build Reply-To: quintela@redhat.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: Stefan Weil , QEMU Developers , Liviu Ionescu Peter Maydell wrote: > On 28 November 2014 at 07:14, Stefan Weil wrote: >> The libvixl code is correct, but the C++ compiler would need to be >> fixed. Here are some examples: >> >> disas/libvixl/a64/disasm-a64.cc:1340:57: warning: unknown conversion >> type character =E2=80=98l=E2=80=99 in format [-Wformat] >> disas/libvixl/a64/disasm-a64.cc:1340:57: warning: too many arguments for >> format [-Wformat-extra-args] >> disas/libvixl/a64/disasm-a64.cc:1492:42: warning: unknown conversion >> type character =E2=80=98l=E2=80=99 in format [-Wformat] >> >> That code uses PRIx64, so the format specifier is %llx which is correct. >> Obviously the C++ compiler ignores that QEMU uses ANSI format specifiers >> (compiler option -D__USE_MINGW_ANSI_STDIO=3D1) instead of the MS specific >> ones. > > I finally got around to looking at this (a year later!), and it turns out > that the problem here is just that libvixl's code for marking functions > as having format strings doesn't have the check that we do in > include/qemu/compiler.h: > > #if defined __GNUC__ > # if !QEMU_GNUC_PREREQ(4, 4) > /* gcc versions before 4.4.x don't support gnu_printf, so use printf. = */ > # define GCC_FMT_ATTR(n, m) __attribute__((format(printf, n, m))) > # else > /* Use gnu_printf when supported (qemu uses standard format strings). = */ > # define GCC_FMT_ATTR(n, m) __attribute__((format(gnu_printf, n, m))) > # if defined(_WIN32) > /* Map __printf__ to __gnu_printf__ because we want standard format s= trings > * even when MinGW or GLib include files use __printf__. */ > # define __printf__ __gnu_printf__ > # endif > # endif > #else > #define GCC_FMT_ATTR(n, m) > #endif > > ...which will effectively cause us to use 'gnu_printf' on this > compiler, which works. The libvixl headers always use plain 'printf', > which gets warnings. So I think we can fix this pretty simply in > disas/libvixl/utils.h by making it also do "use gnu_printf for > a compiler that's 4.4 or better". Confirmed that following patch works for me (as I don't have a pre-4.4 compiler, I didn't care if doing the proper thing). diff --git a/disas/libvixl/utils.h b/disas/libvixl/utils.h index b440626..96ef4b0 100644 --- a/disas/libvixl/utils.h +++ b/disas/libvixl/utils.h @@ -36,7 +36,7 @@ namespace vixl { // Macros for compile-time format checking. #if defined(__GNUC__) #define PRINTF_CHECK(format_index, varargs_index) \ - __attribute__((format(printf, format_index, varargs_index))) + __attribute__((format(gnu_printf, format_index, varargs_index))) #else #define PRINTF_CHECK(format_index, varargs_index) #endif I lied, on win64, you also need the following one (notice that getpagesize on unix return int as far as I can see). And this is the solution that was suggested on list. Should I submit that one, or should we leave the warning? Thanks, Juan. diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h index 13dcef6..400e098 100644 --- a/include/sysemu/os-win32.h +++ b/include/sysemu/os-win32.h @@ -87,7 +87,7 @@ static inline void os_setup_post(void) {} void os_set_line_buffering(void); static inline void os_set_proc_name(const char *dummy) {} -size_t getpagesize(void); +int getpagesize(void); #if !defined(EPROTONOSUPPORT) # define EPROTONOSUPPORT EINVAL diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 09f9e98..7aad185 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -454,7 +454,7 @@ gint g_poll(GPollFD *fds, guint nfds, gint timeout) return retval; } -size_t getpagesize(void) +getpagesize(void) { SYSTEM_INFO system_info; @@ -465,7 +465,7 @@ size_t getpagesize(void) void os_mem_prealloc(int fd, char *area, size_t memory) { int i; - size_t pagesize =3D getpagesize(); + int pagesize =3D getpagesize(); memory =3D (memory + pagesize - 1) & -pagesize; for (i =3D 0; i < memory / pagesize; i++) {