diff mbox

rewrite QEMU_BUILD_BUG_ON

Message ID 1324371827-25099-1-git-send-email-wdongxu@linux.vnet.ibm.com
State New
Headers show

Commit Message

Robert Wang Dec. 20, 2011, 9:03 a.m. UTC
From: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>

On some platforms, __LINE__ will not expand to real number in QEMU_BUILD_BUG_ON,
so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This patch will
fix it.

BTW, I got error message on RHEL 6.1/gcc 4.4.5.

Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
---
 compiler.h |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

Comments

Stefan Hajnoczi Dec. 20, 2011, 10:13 a.m. UTC | #1
On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote:
> From: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
> 
> On some platforms, __LINE__ will not expand to real number in QEMU_BUILD_BUG_ON,
> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This patch will
> fix it.
> 
> BTW, I got error message on RHEL 6.1/gcc 4.4.5.

Can you post the gcc -E output of the file that produces the error as
well as the gcc error output?

Stefan
Robert Wang Dec. 20, 2011, 10:47 a.m. UTC | #2
于 2011年12月20日 18:13, Stefan Hajnoczi 写道:
> On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote:
>> From: Dong Xu Wang<wdongxu@linux.vnet.ibm.com>
>>
>> On some platforms, __LINE__ will not expand to real number in QEMU_BUILD_BUG_ON,
>> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This patch will
>> fix it.
>>
>> BTW, I got error message on RHEL 6.1/gcc 4.4.5.
>
> Can you post the gcc -E output of the file that produces the error as
> well as the gcc error output?
>
> Stefan
>
>

I doubled the following lines in block/qcow2-snapshot.c(line 211 and 212):

QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) !=
offsetof(QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots));"


While "gcc -E -C -I. block/qcow2-snapshot.c", I can get:
typedef char
  qemu_build_bug_on____LINE__
# 241 "block/qcow2-snapshot.c"
     [(__builtin_offsetof (QCowHeader, snapshots_offset) != 
__builtin_offsetof (QCowHeader, nb_snapshots) + 
sizeof(header_data.nb_snapshots))?-1:1];
 
        ;
   typedef char
  qemu_build_bug_on____LINE__
# 243 "block/qcow2-snapshot.c"
   [(__builtin_offsetof (QCowHeader, snapshots_offset) != 
__builtin_offsetof (QCowHeader, nb_snapshots) + 
sizeof(header_data.nb_snapshots))?-1:1];

__LINE__ are not expanded to real line number.



While normally compiling, error message is:
   CC    block/qcow2-snapshot.o
block/qcow2-snapshot.c: In function \u2018qcow2_write_snapshots\u2019:
block/qcow2-snapshot.c:244: error: redefinition of typedef 
\u2018qemu_build_bug_on____LINE__\u2019
block/qcow2-snapshot.c:242: note: previous declaration of 
\u2018qemu_build_bug_on____LINE__\u2019 was here
make: *** [block/qcow2-snapshot.o] Error 1
Stefan Hajnoczi Dec. 20, 2011, 12:08 p.m. UTC | #3
On Tue, Dec 20, 2011 at 10:47 AM, Dong Xu Wang
<wdongxu@linux.vnet.ibm.com> wrote:
> 于 2011年12月20日 18:13, Stefan Hajnoczi 写道:
>
>> On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote:
>>>
>>> From: Dong Xu Wang<wdongxu@linux.vnet.ibm.com>
>>>
>>> On some platforms, __LINE__ will not expand to real number in
>>> QEMU_BUILD_BUG_ON,
>>> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This
>>> patch will
>>> fix it.
>>>
>>> BTW, I got error message on RHEL 6.1/gcc 4.4.5.
>>
>>
>> Can you post the gcc -E output of the file that produces the error as
>> well as the gcc error output?
>>
>> Stefan
>>
>>
>
> I doubled the following lines in block/qcow2-snapshot.c(line 211 and 212):
>
> QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) !=
> offsetof(QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots));"
>
>
> While "gcc -E -C -I. block/qcow2-snapshot.c", I can get:
> typedef char
>  qemu_build_bug_on____LINE__
> # 241 "block/qcow2-snapshot.c"
>    [(__builtin_offsetof (QCowHeader, snapshots_offset) != __builtin_offsetof
> (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1];
>
>       ;
>  typedef char
>  qemu_build_bug_on____LINE__
> # 243 "block/qcow2-snapshot.c"
>  [(__builtin_offsetof (QCowHeader, snapshots_offset) != __builtin_offsetof
> (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1];
>
> __LINE__ are not expanded to real line number.
>
>
>
> While normally compiling, error message is:
>  CC    block/qcow2-snapshot.o
> block/qcow2-snapshot.c: In function \u2018qcow2_write_snapshots\u2019:
> block/qcow2-snapshot.c:244: error: redefinition of typedef
> \u2018qemu_build_bug_on____LINE__\u2019
> block/qcow2-snapshot.c:242: note: previous declaration of
> \u2018qemu_build_bug_on____LINE__\u2019 was here
> make: *** [block/qcow2-snapshot.o] Error 1

Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>

This isn't a compiler-specific issue, it has never worked but we
didn't realize it.  I suggest removing "On some platforms," from the
patch description.  The preprocessor won't expand __LINE__ since there
is a ## and it is inside the QEMU_BUILD_BUG_ON_MACRO():

http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with-positioning-macr

Stefan
Robert Wang Dec. 20, 2011, 1:12 p.m. UTC | #4
It can compile on my Ubuntu:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10"

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

While "gcc -E", it gets the same output as RHEL's, but it can compile. I do
not know why was that.  :(

在 2011年12月20日 下午8:08,Stefan Hajnoczi <stefanha@gmail.com>写道:

> On Tue, Dec 20, 2011 at 10:47 AM, Dong Xu Wang
> <wdongxu@linux.vnet.ibm.com> wrote:
> > 于 2011年12月20日 18:13, Stefan Hajnoczi 写道:
> >
> >> On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote:
> >>>
> >>> From: Dong Xu Wang<wdongxu@linux.vnet.ibm.com>
> >>>
> >>> On some platforms, __LINE__ will not expand to real number in
> >>> QEMU_BUILD_BUG_ON,
> >>> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This
> >>> patch will
> >>> fix it.
> >>>
> >>> BTW, I got error message on RHEL 6.1/gcc 4.4.5.
> >>
> >>
> >> Can you post the gcc -E output of the file that produces the error as
> >> well as the gcc error output?
> >>
> >> Stefan
> >>
> >>
> >
> > I doubled the following lines in block/qcow2-snapshot.c(line 211 and
> 212):
> >
> > QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) !=
> > offsetof(QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots));"
> >
> >
> > While "gcc -E -C -I. block/qcow2-snapshot.c", I can get:
> > typedef char
> >  qemu_build_bug_on____LINE__
> > # 241 "block/qcow2-snapshot.c"
> >    [(__builtin_offsetof (QCowHeader, snapshots_offset) !=
> __builtin_offsetof
> > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1];
> >
> >       ;
> >  typedef char
> >  qemu_build_bug_on____LINE__
> > # 243 "block/qcow2-snapshot.c"
> >  [(__builtin_offsetof (QCowHeader, snapshots_offset) !=
> __builtin_offsetof
> > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1];
> >
> > __LINE__ are not expanded to real line number.
> >
> >
> >
> > While normally compiling, error message is:
> >  CC    block/qcow2-snapshot.o
> > block/qcow2-snapshot.c: In function \u2018qcow2_write_snapshots\u2019:
> > block/qcow2-snapshot.c:244: error: redefinition of typedef
> > \u2018qemu_build_bug_on____LINE__\u2019
> > block/qcow2-snapshot.c:242: note: previous declaration of
> > \u2018qemu_build_bug_on____LINE__\u2019 was here
> > make: *** [block/qcow2-snapshot.o] Error 1
>
> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
>
> This isn't a compiler-specific issue, it has never worked but we
> didn't realize it.  I suggest removing "On some platforms," from the
> patch description.  The preprocessor won't expand __LINE__ since there
> is a ## and it is inside the QEMU_BUILD_BUG_ON_MACRO():
>
>
> http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with-positioning-macr
>
> Stefan
>
>
Stefan Hajnoczi Dec. 20, 2011, 1:41 p.m. UTC | #5
On Tue, Dec 20, 2011 at 1:12 PM, Dong Xu Wang
<wdongxu@linux.vnet.ibm.com> wrote:
> It can compile on my Ubuntu:
>
> DISTRIB_ID=Ubuntu
> DISTRIB_RELEASE=11.10
> DISTRIB_CODENAME=oneiric
> DISTRIB_DESCRIPTION="Ubuntu 11.10"
>
> gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
>
> While "gcc -E", it gets the same output as RHEL's, but it can compile. I do
> not know why was that.  :(

I see what you mean.  I find some gccs compile it successfully and
others warn about the typedef redefinition.  Whether or not you get an
error without the fix depends on whether your compiling warns about
redefined typedefs.

Your fix makes sense in any case.

Stefan
Robert Wang Jan. 9, 2012, 5:26 a.m. UTC | #6
QEMU_BUILD_BUG_ON is only used in ./block/qcow2-snapshot.c, so CCed Kevin.

On Tue, Dec 20, 2011 at 21:41, Stefan Hajnoczi <stefanha@gmail.com> wrote:
>
> On Tue, Dec 20, 2011 at 1:12 PM, Dong Xu Wang
> <wdongxu@linux.vnet.ibm.com> wrote:
> > It can compile on my Ubuntu:
> >
> > DISTRIB_ID=Ubuntu
> > DISTRIB_RELEASE=11.10
> > DISTRIB_CODENAME=oneiric
> > DISTRIB_DESCRIPTION="Ubuntu 11.10"
> >
> > gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
> >
> > While "gcc -E", it gets the same output as RHEL's, but it can compile. I do
> > not know why was that.  :(
>
> I see what you mean.  I find some gccs compile it successfully and
> others warn about the typedef redefinition.  Whether or not you get an
> error without the fix depends on whether your compiling warns about
> redefined typedefs.
>
> Your fix makes sense in any case.
>
> Stefan
>
Kevin Wolf Feb. 8, 2012, 12:49 p.m. UTC | #7
Am 20.12.2011 10:03, schrieb Dong Xu Wang:
> From: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
> 
> On some platforms, __LINE__ will not expand to real number in QEMU_BUILD_BUG_ON,
> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This patch will
> fix it.
> 
> BTW, I got error message on RHEL 6.1/gcc 4.4.5.
> 
> Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>

Thanks, applied to the block branch.

Kevin
diff mbox

Patch

diff --git a/compiler.h b/compiler.h
index a1c0794..736e770 100644
--- a/compiler.h
+++ b/compiler.h
@@ -30,8 +30,10 @@ 
 # define QEMU_PACKED __attribute__((packed))
 #endif
 
+#define cat(x,y) x ## y
+#define cat2(x,y) cat(x,y)
 #define QEMU_BUILD_BUG_ON(x) \
-    typedef char qemu_build_bug_on__##__LINE__[(x)?-1:1];
+    typedef char cat2(qemu_build_bug_on__,__LINE__)[(x)?-1:1];
 
 #if defined __GNUC__
 # if !QEMU_GNUC_PREREQ(4, 4)