Patchwork Fix compilation on GCC 4.5

login
register
mail settings
Submitter Søren Sandmann
Date Oct. 3, 2012, 6:04 p.m.
Message ID <1349287498-10475-1-git-send-email-sandmann@cs.au.dk>
Download mbox | patch
Permalink /patch/188881/
State New
Headers show

Comments

Søren Sandmann - Oct. 3, 2012, 6:04 p.m.
From: Søren Sandmann Pedersen <ssp@redhat.com>

Apparently GCC 4.5 still warns about "value computed not used" even
with __attribute__((unused)). Fix this by only doing the compile time
check on gcc > 4.5.

Signed-off-by: Soren Sandmann <ssp@redhat.com>
---

I need this patch to get qemu to compile with GCC 4.5, but I'm not
sure if 4.5 is the right compiler version to check against.

 osdep.h |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
Søren Sandmann - Oct. 3, 2012, 7:49 p.m.
Stefan Weil <sw@weilnetz.de> writes:

> I don't see any warnings with gcc Debian 4.4.5-8.
>
> Could you please provide more information on your environment
> and the warnings which you get?
>
> Here is a macro which simplifies the version check:
>
> #if QEMU_GNUC_PREREQ(4, 6)
>
> Regards
>
> Stefan Weil

With this compiler:

    dhcp-100-3-184:~/vertigo/qemu% gcc -v
    Using built-in specs.
    COLLECT_GCC=/usr/bin/gcc
    COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/lto-wrapper
    Target: x86_64-redhat-linux
    Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
    --infodir=/usr/share/info
    --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap
    --enable-shared --enable-threads=posix --enable-checking=release
    --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
    --enable-gnu-unique-object --enable-linker-build-id
    --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto
    --enable-plugin --enable-java-awt=gtk --disable-dssi
    --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
    --enable-libgcj-multifile --enable-java-maintainer-mode
    --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
    --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic
    --with-arch_32=i686 --build=x86_64-redhat-linux
    Thread model: posix
    gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 

This is the error I get:

    make  BUILD_DIR=/home/ssp/vertigo/qemu -C i386-softmmu V="1"
    TARGET_DIR="i386-softmmu/" all
    make[1]: Entering directory `/home/ssp/vertigo/qemu/i386-softmmu'
    gcc -I/home/ssp/vertigo/qemu/slirp -I. -I/home/ssp/vertigo/qemu
    -I/home/ssp/vertigo/qemu/fpu -I/home/ssp/vertigo/qemu/libcacard
    -I/home/ssp/vertigo/qemu/linux-headers -I/home/ssp/vertigo/qemu/tcg
    -I/home/ssp/vertigo/qemu/tcg/i386  -Werror -fPIE -DPIE -m64
    -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
    -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings
    -Wmissing-prototypes -fno-strict-aliasing  -fstack-protector-all
    -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs
    -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers
    -Wold-style-declaration -Wold-style-definition -Wtype-limits
    -I/usr/include/libpng12   -I/usr/include/spice-server
    -I/usr/include/pixman-1 -I/usr/include/spice-1   -I/usr/include/nss3
    -I/usr/include/nspr4   -pthread -I/usr/include/glib-2.0
    -I/usr/lib64/glib-2.0/include   -DHAS_AUDIO -DHAS_AUDIO_CHOICE
    -DTARGET_PHYS_ADDR_BITS=64 -I../linux-headers
    -I.. -I/home/ssp/vertigo/qemu/target-i386 -DNEED_CPU_H
    -I/home/ssp/vertigo/qemu/include    -I/usr/include/libpng12   -pthread
    -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include   -MMD -MP -MT
    hw/vfio_pci.o -MF hw/vfio_pci.d -O2 -D_FORTIFY_SOURCE=2 -g  -c -o
    hw/vfio_pci.o /home/ssp/vertigo/qemu/hw/vfio_pci.c
    cc1: warnings being treated as errors
    /home/ssp/vertigo/qemu/hw/vfio_pci.c: In function ‘vfio_bar_write’:
    /home/ssp/vertigo/qemu/hw/vfio_pci.c:604:84: error: value computed is not used
    /home/ssp/vertigo/qemu/hw/vfio_pci.c: In function ‘vfio_bar_read’:
    /home/ssp/vertigo/qemu/hw/vfio_pci.c:644:84: error: value computed is
    not used
    make[1]: *** [hw/vfio_pci.o] Error 1
    make[1]: Leaving directory `/home/ssp/vertigo/qemu/i386-softmmu'
    make: *** [subdir-i386-softmmu] Error 2
Stefan Weil - Oct. 3, 2012, 8:45 p.m.
Am 03.10.2012 21:49, schrieb Søren Sandmann:
> Stefan Weil<sw@weilnetz.de>  writes:
>
>> I don't see any warnings with gcc Debian 4.4.5-8.
>>
>> Could you please provide more information on your environment
>> and the warnings which you get?
>>
>> Here is a macro which simplifies the version check:
>>
>> #if QEMU_GNUC_PREREQ(4, 6)
>>
>> Regards
>>
>> Stefan Weil
>
> With this compiler:
>
>      dhcp-100-3-184:~/vertigo/qemu% gcc -v
>      Using built-in specs.
>      COLLECT_GCC=/usr/bin/gcc
>      COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/lto-wrapper
>      Target: x86_64-redhat-linux
>      Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
>      --infodir=/usr/share/info
>      --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap
>      --enable-shared --enable-threads=posix --enable-checking=release
>      --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
>      --enable-gnu-unique-object --enable-linker-build-id
>      --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto
>      --enable-plugin --enable-java-awt=gtk --disable-dssi
>      --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
>      --enable-libgcj-multifile --enable-java-maintainer-mode
>      --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
>      --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic
>      --with-arch_32=i686 --build=x86_64-redhat-linux
>      Thread model: posix
>      gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
>
> This is the error I get:
>
>      make  BUILD_DIR=/home/ssp/vertigo/qemu -C i386-softmmu V="1"
>      TARGET_DIR="i386-softmmu/" all
>      make[1]: Entering directory `/home/ssp/vertigo/qemu/i386-softmmu'
>      gcc -I/home/ssp/vertigo/qemu/slirp -I. -I/home/ssp/vertigo/qemu
>      -I/home/ssp/vertigo/qemu/fpu -I/home/ssp/vertigo/qemu/libcacard
>      -I/home/ssp/vertigo/qemu/linux-headers -I/home/ssp/vertigo/qemu/tcg
>      -I/home/ssp/vertigo/qemu/tcg/i386  -Werror -fPIE -DPIE -m64
>      -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
>      -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings
>      -Wmissing-prototypes -fno-strict-aliasing  -fstack-protector-all
>      -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs
>      -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers
>      -Wold-style-declaration -Wold-style-definition -Wtype-limits
>      -I/usr/include/libpng12   -I/usr/include/spice-server
>      -I/usr/include/pixman-1 -I/usr/include/spice-1   -I/usr/include/nss3
>      -I/usr/include/nspr4   -pthread -I/usr/include/glib-2.0
>      -I/usr/lib64/glib-2.0/include   -DHAS_AUDIO -DHAS_AUDIO_CHOICE
>      -DTARGET_PHYS_ADDR_BITS=64 -I../linux-headers
>      -I.. -I/home/ssp/vertigo/qemu/target-i386 -DNEED_CPU_H
>      -I/home/ssp/vertigo/qemu/include    -I/usr/include/libpng12   -pthread
>      -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include   -MMD -MP -MT
>      hw/vfio_pci.o -MF hw/vfio_pci.d -O2 -D_FORTIFY_SOURCE=2 -g  -c -o
>      hw/vfio_pci.o /home/ssp/vertigo/qemu/hw/vfio_pci.c
>      cc1: warnings being treated as errors
>      /home/ssp/vertigo/qemu/hw/vfio_pci.c: In function ‘vfio_bar_write’:
>      /home/ssp/vertigo/qemu/hw/vfio_pci.c:604:84: error: value computed is not used
>      /home/ssp/vertigo/qemu/hw/vfio_pci.c: In function ‘vfio_bar_read’:
>      /home/ssp/vertigo/qemu/hw/vfio_pci.c:644:84: error: value computed is
>      not used
>      make[1]: *** [hw/vfio_pci.o] Error 1
>      make[1]: Leaving directory `/home/ssp/vertigo/qemu/i386-softmmu'
>      make: *** [subdir-i386-softmmu] Error 2

That's strange.

The lines which cause compiler errors look like this:

     vfio_eoi(DO_UPCAST(VFIODevice, bars[bar->nr], bar));

There are more uses of DO_UPCAST without any compiler error:

     VFIODevice *vdev = DO_UPCAST(VFIODevice, pdev, pdev);

Neither of both lines creates a compiler error with any of my
compilers (gcc 4.4 up to latest gcc, Linux and MinGW hosts).

When I compile with gcc option -save-temps, I get this code
for the first line:

     vfio_eoi(( __extension__ ( { char __attribute__((unused)) 
offset_must_be_zero[ -__builtin_offsetof (VFIODevice, bars[bar->nr])]; 
({ const typeof(((VFIODevice *) 0)->bars[bar->nr]) *__mptr = (bar); 
(VFIODevice *) ((char *) __mptr - __builtin_offsetof (VFIODevice, 
bars[bar->nr]));});})));

Could you please replace the first line by that code and try your compiler?
If it remains silent, I suspect a bad offsetof macro.

Do you compile on Linux? Which distribution or which C library do you use?

Regards

Stefan Weil
Richard Henderson - Oct. 3, 2012, 8:55 p.m.
On 10/03/2012 11:04 AM, Søren Sandmann wrote:
> From: Søren Sandmann Pedersen <ssp@redhat.com>
> 
> Apparently GCC 4.5 still warns about "value computed not used" even
> with __attribute__((unused)). Fix this by only doing the compile time
> check on gcc > 4.5.
> 
> Signed-off-by: Soren Sandmann <ssp@redhat.com>
> ---
> 
> I need this patch to get qemu to compile with GCC 4.5, but I'm not
> sure if 4.5 is the right compiler version to check against.
> 
>  osdep.h |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/osdep.h b/osdep.h
> index cb213e0..df89552 100644
> --- a/osdep.h
> +++ b/osdep.h
> @@ -41,8 +41,9 @@ typedef signed int              int_fast16_t;
>  #endif
>  
>  /* Convert from a base type to a parent type, with compile time checking.  */
> -#ifdef __GNUC__
> -#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
> +#if defined (__GNUC__) && \
> +    (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5))
> +#define DO_UPCAST(type, field, dev) ( __extension__ ( {	\
>      char __attribute__((unused)) offset_must_be_zero[ \
>          -offsetof(type, field)]; \
>      container_of(dev, type, field);}))

Try moving the attribute to the end of the declaration,
i.e. just before the semi-colon.


r~

Patch

diff --git a/osdep.h b/osdep.h
index cb213e0..df89552 100644
--- a/osdep.h
+++ b/osdep.h
@@ -41,8 +41,9 @@  typedef signed int              int_fast16_t;
 #endif
 
 /* Convert from a base type to a parent type, with compile time checking.  */
-#ifdef __GNUC__
-#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
+#if defined (__GNUC__) && \
+    (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5))
+#define DO_UPCAST(type, field, dev) ( __extension__ ( {	\
     char __attribute__((unused)) offset_must_be_zero[ \
         -offsetof(type, field)]; \
     container_of(dev, type, field);}))