diff mbox

qemu git does not build on 32bits anymore (incl mingw32)

Message ID 52FFA51B.9070108@msgid.tls.msk.ru
State New
Headers show

Commit Message

Michael Tokarev Feb. 15, 2014, 5:34 p.m. UTC
Since this commit:

commit 999b53ec8794f203964db3ecf939a3da5c4bc843
Author: Claudio Fontana <claudio.fontana@linaro.org>
Date:   Wed Feb 5 17:27:28 2014 +0000

    disas: Implement disassembly output for A64

    Use libvixl to implement disassembly output in debug
    logs for A64, for use with both AArch64 hosts and targets.

    Signed-off-by: Claudio Fontana <claudio.fontana@linaro.org>
    [PMM:
     * added support for target disassembly
     * switched to custom QEMUDisassembler so the output format
       matches what QEMU expects
     * make sure we correctly fall back to "just print hex"
       if we didn't build the AArch64 disassembler because of
       lack of a C++ compiler
     * rename from 'aarch64' to 'arm-a64' because this is a
       disassembler for the A64 instruction set
     * merge aarch64.c and aarch64-cxx.cc into one C++ file
     * simplify the aarch64.c<->aarch64-cxx.cc interface]
    Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Qemu does not build on mingw32 anymore, with the following error
messages:

  CXX   disas/libvixl/utils.o
disas/libvixl/utils.cc:98: error: integer constant is too large for 'unsigned long' type
disas/libvixl/utils.cc:111: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:111: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:112: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:112: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:113: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:113: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:114: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:114: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:115: error: integer constant is too large for 'long' type
disas/libvixl/utils.cc:115: error: integer constant is too large for 'long' type
make: *** [disas/libvixl/utils.o] Error 1

Attached patch fixes this.

/mjt

Comments

Peter Maydell Feb. 15, 2014, 6:12 p.m. UTC | #1
On 15 February 2014 17:34, Michael Tokarev <mjt@tls.msk.ru> wrote:
> Since this commit:
>
> commit 999b53ec8794f203964db3ecf939a3da5c4bc843
> Author: Claudio Fontana <claudio.fontana@linaro.org>
> Date:   Wed Feb 5 17:27:28 2014 +0000
>
>     disas: Implement disassembly output for A64
>
>     Use libvixl to implement disassembly output in debug
>     logs for A64, for use with both AArch64 hosts and targets.
>
>     Signed-off-by: Claudio Fontana <claudio.fontana@linaro.org>
>     [PMM:
>      * added support for target disassembly
>      * switched to custom QEMUDisassembler so the output format
>        matches what QEMU expects
>      * make sure we correctly fall back to "just print hex"
>        if we didn't build the AArch64 disassembler because of
>        lack of a C++ compiler
>      * rename from 'aarch64' to 'arm-a64' because this is a
>        disassembler for the A64 instruction set
>      * merge aarch64.c and aarch64-cxx.cc into one C++ file
>      * simplify the aarch64.c<->aarch64-cxx.cc interface]
>     Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
>
> Qemu does not build on mingw32 anymore, with the following error
> messages:
>
>   CXX   disas/libvixl/utils.o
> disas/libvixl/utils.cc:98: error: integer constant is too large for 'unsigned long' type
> disas/libvixl/utils.cc:111: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:111: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:112: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:112: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:113: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:113: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:114: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:114: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:115: error: integer constant is too large for 'long' type
> disas/libvixl/utils.cc:115: error: integer constant is too large for 'long' type
> make: *** [disas/libvixl/utils.o] Error 1
>
> Attached patch fixes this.

Ugh, sorry about that. I thought I'd caught them but obviously the Windows
32 bit build is pickier than the Linux one (it's clearly right though).

PS: your patch has a stray roms/seabios update hunk in it. Other than that
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
and I'll apply it directly shortly since it's a build-breakage.

thanks
-- PMM
Peter Maydell Feb. 15, 2014, 6:53 p.m. UTC | #2
On 15 February 2014 18:12, Peter Maydell <peter.maydell@linaro.org> wrote:
> Ugh, sorry about that. I thought I'd caught them but obviously the Windows
> 32 bit build is pickier than the Linux one (it's clearly right though).

Incidentally if you have a simple recipe for setting up a windows
mingw build environment on Ubuntu (preferably not bleeding-edge
Ubuntu) then I'm happy to add "compile-test for win32" to my
pullreq application checklist.

thanks
-- PMM
Michael Tokarev Feb. 15, 2014, 7:01 p.m. UTC | #3
15.02.2014 22:53, Peter Maydell wrote:
> Incidentally if you have a simple recipe for setting up a windows
> mingw build environment on Ubuntu (preferably not bleeding-edge
> Ubuntu) then I'm happy to add "compile-test for win32" to my
> pullreq application checklist.

Hm.  I've never did that before, but it appeared quite easy to do.

 apt-get install mingw32

grabbed a few -dev binaries from http://www.gtk.org/download/win32.php,
namely:

 glib
 zlib
 gettext-runtime
 libpng
 pixman

and extracted them into a common directory (say, $mingwhome).

Next, created /usr/local/bin/i586-mingw32msvc-pkg-config with the following:

--- cut ---
#!/bin/sh
prefix=$mingwhome
PKG_CONFIG_LIBDIR=$prefix/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec pkg-config --define-variable=prefix=$prefix $@
--- cut ---

Now I can build qemu like this:

 ./configure --cross-prefix=i586-mingw32msvc- \
    --extra-cflags=-I$mingwhome/include \
    --extra-ldflags=-I$mingwhome/lib

That's basically all.

This works on debian wheezy.

Similar setup should work for w64 too, except in
this case mingw-w64 is needed, and libs from
http://www.gtk.org/download/win64.php .

Initially I followed http://wiki.qemu.org/Hosts/W32 .

BTW, current debian wheezy catches these constants
in 32bits too.  I mean, when the host is 32bits.

Thanks,

/mjt
Peter Maydell Feb. 15, 2014, 7:05 p.m. UTC | #4
On 15 February 2014 19:01, Michael Tokarev <mjt@tls.msk.ru> wrote:
> 15.02.2014 22:53, Peter Maydell wrote:
>> Incidentally if you have a simple recipe for setting up a windows
>> mingw build environment on Ubuntu (preferably not bleeding-edge
>> Ubuntu) then I'm happy to add "compile-test for win32" to my
>> pullreq application checklist.
>
> Hm.  I've never did that before, but it appeared quite easy to do.

Thanks for the instructions; I'll get that set up.

> BTW, current debian wheezy catches these constants
> in 32bits too.  I mean, when the host is 32bits.

Must be a new-gcc thing, then, maybe? My test 32 bit
Linux host has gcc-4.6.3-1ubuntu5 and that builds fine
(it did complain about some of the constants which is
why I caught and fixed those).

thanks
-- PMM
Michael Tokarev Feb. 15, 2014, 7:08 p.m. UTC | #5
15.02.2014 23:05, Peter Maydell wrote:
> On 15 February 2014 19:01, Michael Tokarev <mjt@tls.msk.ru> wrote:

>> BTW, current debian wheezy catches these constants
>> in 32bits too.  I mean, when the host is 32bits.
> 
> Must be a new-gcc thing, then, maybe? My test 32 bit
> Linux host has gcc-4.6.3-1ubuntu5 and that builds fine
> (it did complain about some of the constants which is
> why I caught and fixed those).

gcc-4.7.2 (which is the version on debian wheezy) complains
about these.  It is actually the same compiler I used to
build mingw32 stuff.

/mjt
Peter Maydell Feb. 15, 2014, 9:01 p.m. UTC | #6
On 15 February 2014 19:05, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 15 February 2014 19:01, Michael Tokarev <mjt@tls.msk.ru> wrote:
>> 15.02.2014 22:53, Peter Maydell wrote:
>>> Incidentally if you have a simple recipe for setting up a windows
>>> mingw build environment on Ubuntu (preferably not bleeding-edge
>>> Ubuntu) then I'm happy to add "compile-test for win32" to my
>>> pullreq application checklist.
>>
>> Hm.  I've never did that before, but it appeared quite easy to do.
>
> Thanks for the instructions; I'll get that set up.

OK, I've set up the win32 cross-compiler, confirmed that it doesn't
build and that this patch fixes the problem, and pushed the fix
to master (without the stray seabios update hunk).

thanks
-- PMM
diff mbox

Patch

From: Michael Tokarev <mjt@tls.msk.ru>
Subject: libvixl: fix 64bit constants usage

Since commit 999b53ec8794f203964db3ecf939a3da5c4bc843:
 Author: Claudio Fontana <claudio.fontana@linaro.org>
 Date:   Wed Feb 5 17:27:28 2014 +0000

    disas: Implement disassembly output for A64
    
    Use libvixl to implement disassembly output in debug
    logs for A64, for use with both AArch64 hosts and targets.

disas/libvixl/ contains functions which uses 64bit constants
without using appropriate suffixes, which fails on 32bits.

Fix this by using ULL suffix.

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>

diff --git a/disas/libvixl/a64/disasm-a64.cc b/disas/libvixl/a64/disasm-a64.cc
index 4a49748..5c6b898 100644
--- a/disas/libvixl/a64/disasm-a64.cc
+++ b/disas/libvixl/a64/disasm-a64.cc
@@ -269,19 +269,19 @@  bool Disassembler::IsMovzMovnImm(unsigned reg_size, uint64_t value) {
          ((reg_size == kWRegSize) && (value <= 0xffffffff)));
 
   // Test for movz: 16 bits set at positions 0, 16, 32 or 48.
-  if (((value & 0xffffffffffff0000UL) == 0UL) ||
-      ((value & 0xffffffff0000ffffUL) == 0UL) ||
-      ((value & 0xffff0000ffffffffUL) == 0UL) ||
-      ((value & 0x0000ffffffffffffUL) == 0UL)) {
+  if (((value & 0xffffffffffff0000ULL) == 0ULL) ||
+      ((value & 0xffffffff0000ffffULL) == 0ULL) ||
+      ((value & 0xffff0000ffffffffULL) == 0ULL) ||
+      ((value & 0x0000ffffffffffffULL) == 0ULL)) {
     return true;
   }
 
   // Test for movn: NOT(16 bits set at positions 0, 16, 32 or 48).
   if ((reg_size == kXRegSize) &&
-      (((value & 0xffffffffffff0000UL) == 0xffffffffffff0000UL) ||
-       ((value & 0xffffffff0000ffffUL) == 0xffffffff0000ffffUL) ||
-       ((value & 0xffff0000ffffffffUL) == 0xffff0000ffffffffUL) ||
-       ((value & 0x0000ffffffffffffUL) == 0x0000ffffffffffffUL))) {
+      (((value & 0xffffffffffff0000ULL) == 0xffffffffffff0000ULL) ||
+       ((value & 0xffffffff0000ffffULL) == 0xffffffff0000ffffULL) ||
+       ((value & 0xffff0000ffffffffULL) == 0xffff0000ffffffffULL) ||
+       ((value & 0x0000ffffffffffffULL) == 0x0000ffffffffffffULL))) {
     return true;
   }
   if ((reg_size == kWRegSize) &&
diff --git a/disas/libvixl/utils.cc b/disas/libvixl/utils.cc
index 6f85e61..a45fb95 100644
--- a/disas/libvixl/utils.cc
+++ b/disas/libvixl/utils.cc
@@ -95,7 +95,7 @@  int CountSetBits(uint64_t value, int width) {
   ASSERT((width == 32) || (width == 64));
 
   // Mask out unused bits to ensure that they are not counted.
-  value &= (0xffffffffffffffffUL >> (64-width));
+  value &= (0xffffffffffffffffULL >> (64-width));
 
   // Add up the set bits.
   // The algorithm works by adding pairs of bit fields together iteratively,
@@ -108,12 +108,18 @@  int CountSetBits(uint64_t value, int width) {
   // value =   h+g+f+e     d+c+b+a
   //                  \          |
   // value =       h+g+f+e+d+c+b+a
-  value = ((value >> 1) & 0x5555555555555555) + (value & 0x5555555555555555);
-  value = ((value >> 2) & 0x3333333333333333) + (value & 0x3333333333333333);
-  value = ((value >> 4) & 0x0f0f0f0f0f0f0f0f) + (value & 0x0f0f0f0f0f0f0f0f);
-  value = ((value >> 8) & 0x00ff00ff00ff00ff) + (value & 0x00ff00ff00ff00ff);
-  value = ((value >> 16) & 0x0000ffff0000ffff) + (value & 0x0000ffff0000ffff);
-  value = ((value >> 32) & 0x00000000ffffffff) + (value & 0x00000000ffffffff);
+  value = ((value >> 1) & 0x5555555555555555ULL) +
+           (value & 0x5555555555555555ULL);
+  value = ((value >> 2) & 0x3333333333333333ULL) +
+           (value & 0x3333333333333333ULL);
+  value = ((value >> 4) & 0x0f0f0f0f0f0f0f0fULL) +
+           (value & 0x0f0f0f0f0f0f0f0fULL);
+  value = ((value >> 8) & 0x00ff00ff00ff00ffULL) +
+           (value & 0x00ff00ff00ff00ffULL);
+  value = ((value >> 16) & 0x0000ffff0000ffffULL) +
+           (value & 0x0000ffff0000ffffULL);
+  value = ((value >> 32) & 0x00000000ffffffffULL) +
+           (value & 0x00000000ffffffffULL);
 
   return value;
 }
diff --git a/roms/seabios b/roms/seabios
index 96917a8..31b8b4e 160000
--- a/roms/seabios
+++ b/roms/seabios
@@ -1 +1 @@ 
-Subproject commit 96917a8ed761f017fc8c72ba3b9181fbac03ac59
+Subproject commit 31b8b4eea9d9ad58a73b22a6060d3ac1c419c26d