diff mbox series

x86/dom0-build: fix build with clang5

Message ID ef670212-8257-b960-a3cb-9363cf076033@suse.com (mailing list archive)
State New, archived
Headers show
Series x86/dom0-build: fix build with clang5 | expand

Commit Message

Jan Beulich July 15, 2019, 10:35 a.m. UTC
With non-empty CONFIG_DOM0_MEM clang5 produces

dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
     if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                        ^  ~~~~~~~~~~~~~~~~~~
dom0_build.c:344:24: note: use '&' for a bitwise operation
     if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                        ^~
                        &
dom0_build.c:344:24: note: remove constant to silence this warning
     if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                       ~^~~~~~~~~~~~~~~~~~~~~
1 error generated.

Obviously neither of the two suggestions are an option here. Oddly
enough swapping the operands of the && helps, while e.g. casting or
parenthesizing doesn't. Another workable variant looks to be the use of
!! on the constant.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
I'm open to going the !! or yet some different route. No matter which
one we choose, I'm afraid it is going to remain guesswork what newer
(and future) versions of clang will choke on.
x86/dom0-build: fix build with clang5

With non-empty CONFIG_DOM0_MEM clang5 produces

dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                       ^  ~~~~~~~~~~~~~~~~~~
dom0_build.c:344:24: note: use '&' for a bitwise operation
    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                       ^~
                       &
dom0_build.c:344:24: note: remove constant to silence this warning
    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
                      ~^~~~~~~~~~~~~~~~~~~~~
1 error generated.

Obviously neither of the two suggestions are an option here. Oddly
enough swapping the operands of the && helps, while e.g. casting or
parenthesizing doesn't. Another workable variant looks to be the use of
!! on the constant.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
I'm open to going the !! or yet some different route. No matter which
one we choose, I'm afraid it is going to remain guesswork what newer
(and future) versions of clang will choke on.

--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -341,7 +341,7 @@ unsigned long __init dom0_compute_nr_pag
     unsigned long avail = 0, nr_pages, min_pages, max_pages;
     bool need_paging;
 
-    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
+    if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
         parse_dom0_mem(CONFIG_DOM0_MEM);
 
     for_each_node_mask ( node, dom0_nodes )

Comments

Tamas K Lengyel July 15, 2019, 1:41 p.m. UTC | #1
On Mon, Jul 15, 2019 at 4:36 AM Jan Beulich <JBeulich@suse.com> wrote:
>
> With non-empty CONFIG_DOM0_MEM clang5 produces
>
> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                         ^  ~~~~~~~~~~~~~~~~~~
> dom0_build.c:344:24: note: use '&' for a bitwise operation
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                         ^~
>                         &
> dom0_build.c:344:24: note: remove constant to silence this warning
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                        ~^~~~~~~~~~~~~~~~~~~~~
> 1 error generated.
>
> Obviously neither of the two suggestions are an option here. Oddly
> enough swapping the operands of the && helps, while e.g. casting or
> parenthesizing doesn't. Another workable variant looks to be the use of
> !! on the constant.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> ---
> I'm open to going the !! or yet some different route. No matter which
> one we choose, I'm afraid it is going to remain guesswork what newer
> (and future) versions of clang will choke on.

Is disabling the check itself not an option? Seems to me to be a more
sensible option then hacking around it.

Tamas
Andrew Cooper July 15, 2019, 1:49 p.m. UTC | #2
On 15/07/2019 11:35, Jan Beulich wrote:
> With non-empty CONFIG_DOM0_MEM clang5 produces
>
> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                         ^  ~~~~~~~~~~~~~~~~~~
> dom0_build.c:344:24: note: use '&' for a bitwise operation
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                         ^~
>                         &
> dom0_build.c:344:24: note: remove constant to silence this warning
>      if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>                        ~^~~~~~~~~~~~~~~~~~~~~
> 1 error generated.
>
> Obviously neither of the two suggestions are an option here. Oddly
> enough swapping the operands of the && helps, while e.g. casting or
> parenthesizing doesn't. Another workable variant looks to be the use of
> !! on the constant.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> ---
> I'm open to going the !! or yet some different route. No matter which
> one we choose, I'm afraid it is going to remain guesswork what newer
> (and future) versions of clang will choke on.
>
> --- a/xen/arch/x86/dom0_build.c
> +++ b/xen/arch/x86/dom0_build.c
> @@ -341,7 +341,7 @@ unsigned long __init dom0_compute_nr_pag
>       unsigned long avail = 0, nr_pages, min_pages, max_pages;
>       bool need_paging;
>   
> -    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
> +    if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
>           parse_dom0_mem(CONFIG_DOM0_MEM);

First and foremost, there is an identical construct on the ARM side,
which wants an equivalent adjustment.

As to the change, I'm going to suggest what I suggested instead of this
the first time around, which is strlen(CONFIG_DOM0_MEM) to make the
logic easier to follow.

~Andrew
Jan Beulich July 15, 2019, 2:13 p.m. UTC | #3
On 15.07.2019 15:41, Tamas K Lengyel wrote:
> On Mon, Jul 15, 2019 at 4:36 AM Jan Beulich <JBeulich@suse.com> wrote:
>>
>> With non-empty CONFIG_DOM0_MEM clang5 produces
>>
>> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                          ^  ~~~~~~~~~~~~~~~~~~
>> dom0_build.c:344:24: note: use '&' for a bitwise operation
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                          ^~
>>                          &
>> dom0_build.c:344:24: note: remove constant to silence this warning
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                         ~^~~~~~~~~~~~~~~~~~~~~
>> 1 error generated.
>>
>> Obviously neither of the two suggestions are an option here. Oddly
>> enough swapping the operands of the && helps, while e.g. casting or
>> parenthesizing doesn't. Another workable variant looks to be the use of
>> !! on the constant.
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>> ---
>> I'm open to going the !! or yet some different route. No matter which
>> one we choose, I'm afraid it is going to remain guesswork what newer
>> (and future) versions of clang will choke on.
> 
> Is disabling the check itself not an option? Seems to me to be a more
> sensible option then hacking around it.

How would you envision to disable the check? It's there for a reason
after all.

Jan
Jan Beulich July 15, 2019, 2:19 p.m. UTC | #4
On 15.07.2019 15:49, Andrew Cooper wrote:
> On 15/07/2019 11:35, Jan Beulich wrote:
>> With non-empty CONFIG_DOM0_MEM clang5 produces
>>
>> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                          ^  ~~~~~~~~~~~~~~~~~~
>> dom0_build.c:344:24: note: use '&' for a bitwise operation
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                          ^~
>>                          &
>> dom0_build.c:344:24: note: remove constant to silence this warning
>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>                         ~^~~~~~~~~~~~~~~~~~~~~
>> 1 error generated.
>>
>> Obviously neither of the two suggestions are an option here. Oddly
>> enough swapping the operands of the && helps, while e.g. casting or
>> parenthesizing doesn't. Another workable variant looks to be the use of
>> !! on the constant.
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>> ---
>> I'm open to going the !! or yet some different route. No matter which
>> one we choose, I'm afraid it is going to remain guesswork what newer
>> (and future) versions of clang will choke on.
>>
>> --- a/xen/arch/x86/dom0_build.c
>> +++ b/xen/arch/x86/dom0_build.c
>> @@ -341,7 +341,7 @@ unsigned long __init dom0_compute_nr_pag
>>        unsigned long avail = 0, nr_pages, min_pages, max_pages;
>>        bool need_paging;
>>    
>> -    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>> +    if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
>>            parse_dom0_mem(CONFIG_DOM0_MEM);
> 
> First and foremost, there is an identical construct on the ARM side,
> which wants an equivalent adjustment.

Oh, indeed. I should have remembered ...

> As to the change, I'm going to suggest what I suggested instead of this
> the first time around, which is strlen(CONFIG_DOM0_MEM) to make the
> logic easier to follow.

How does use of strlen() make anything easier? I think it is a pretty
common pattern to check the first character for nul if all one is
after is to know whether a string is empty.

Jan
Tamas K Lengyel July 15, 2019, 2:44 p.m. UTC | #5
On Mon, Jul 15, 2019 at 8:13 AM Jan Beulich <JBeulich@suse.com> wrote:
>
> On 15.07.2019 15:41, Tamas K Lengyel wrote:
> > On Mon, Jul 15, 2019 at 4:36 AM Jan Beulich <JBeulich@suse.com> wrote:
> >>
> >> With non-empty CONFIG_DOM0_MEM clang5 produces
> >>
> >> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
> >>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
> >>                          ^  ~~~~~~~~~~~~~~~~~~
> >> dom0_build.c:344:24: note: use '&' for a bitwise operation
> >>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
> >>                          ^~
> >>                          &
> >> dom0_build.c:344:24: note: remove constant to silence this warning
> >>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
> >>                         ~^~~~~~~~~~~~~~~~~~~~~
> >> 1 error generated.
> >>
> >> Obviously neither of the two suggestions are an option here. Oddly
> >> enough swapping the operands of the && helps, while e.g. casting or
> >> parenthesizing doesn't. Another workable variant looks to be the use of
> >> !! on the constant.
> >>
> >> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> >> ---
> >> I'm open to going the !! or yet some different route. No matter which
> >> one we choose, I'm afraid it is going to remain guesswork what newer
> >> (and future) versions of clang will choke on.
> >
> > Is disabling the check itself not an option? Seems to me to be a more
> > sensible option then hacking around it.
>
> How would you envision to disable the check? It's there for a reason
> after all.

By passing -Wno-constant-logical-operand to the compiler. It looks
like a check for a non-common situation which evidently Xen uses, so
what's the point of keeping it but hacking around with it with tricks
that are fragile?

Tamas
Jan Beulich July 15, 2019, 2:49 p.m. UTC | #6
On 15.07.2019 16:44, Tamas K Lengyel wrote:
> On Mon, Jul 15, 2019 at 8:13 AM Jan Beulich <JBeulich@suse.com> wrote:
>>
>> On 15.07.2019 15:41, Tamas K Lengyel wrote:
>>> On Mon, Jul 15, 2019 at 4:36 AM Jan Beulich <JBeulich@suse.com> wrote:
>>>>
>>>> With non-empty CONFIG_DOM0_MEM clang5 produces
>>>>
>>>> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>>>>        if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>>                           ^  ~~~~~~~~~~~~~~~~~~
>>>> dom0_build.c:344:24: note: use '&' for a bitwise operation
>>>>        if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>>                           ^~
>>>>                           &
>>>> dom0_build.c:344:24: note: remove constant to silence this warning
>>>>        if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>>                          ~^~~~~~~~~~~~~~~~~~~~~
>>>> 1 error generated.
>>>>
>>>> Obviously neither of the two suggestions are an option here. Oddly
>>>> enough swapping the operands of the && helps, while e.g. casting or
>>>> parenthesizing doesn't. Another workable variant looks to be the use of
>>>> !! on the constant.
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>>> ---
>>>> I'm open to going the !! or yet some different route. No matter which
>>>> one we choose, I'm afraid it is going to remain guesswork what newer
>>>> (and future) versions of clang will choke on.
>>>
>>> Is disabling the check itself not an option? Seems to me to be a more
>>> sensible option then hacking around it.
>>
>> How would you envision to disable the check? It's there for a reason
>> after all.
> 
> By passing -Wno-constant-logical-operand to the compiler. It looks
> like a check for a non-common situation which evidently Xen uses, so
> what's the point of keeping it but hacking around with it with tricks
> that are fragile?

Oh, so you meant disabling the compiler warning. That may be an option,
but I wouldn't routinely suggest such as often besides unhelpful
instances there are also helpful ones.

Jan
Andrew Cooper July 15, 2019, 2:59 p.m. UTC | #7
On 15/07/2019 15:19, Jan Beulich wrote:
> On 15.07.2019 15:49, Andrew Cooper wrote:
>> On 15/07/2019 11:35, Jan Beulich wrote:
>>> With non-empty CONFIG_DOM0_MEM clang5 produces
>>>
>>> dom0_build.c:344:24: error: use of logical '&&' with constant operand [-Werror,-Wconstant-logical-operand]
>>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>                          ^  ~~~~~~~~~~~~~~~~~~
>>> dom0_build.c:344:24: note: use '&' for a bitwise operation
>>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>                          ^~
>>>                          &
>>> dom0_build.c:344:24: note: remove constant to silence this warning
>>>       if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>>                         ~^~~~~~~~~~~~~~~~~~~~~
>>> 1 error generated.
>>>
>>> Obviously neither of the two suggestions are an option here. Oddly
>>> enough swapping the operands of the && helps, while e.g. casting or
>>> parenthesizing doesn't. Another workable variant looks to be the use of
>>> !! on the constant.
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>> ---
>>> I'm open to going the !! or yet some different route. No matter which
>>> one we choose, I'm afraid it is going to remain guesswork what newer
>>> (and future) versions of clang will choke on.
>>>
>>> --- a/xen/arch/x86/dom0_build.c
>>> +++ b/xen/arch/x86/dom0_build.c
>>> @@ -341,7 +341,7 @@ unsigned long __init dom0_compute_nr_pag
>>>        unsigned long avail = 0, nr_pages, min_pages, max_pages;
>>>        bool need_paging;
>>>    
>>> -    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
>>> +    if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
>>>            parse_dom0_mem(CONFIG_DOM0_MEM);
>> First and foremost, there is an identical construct on the ARM side,
>> which wants an equivalent adjustment.
> Oh, indeed. I should have remembered ...
>
>> As to the change, I'm going to suggest what I suggested instead of this
>> the first time around, which is strlen(CONFIG_DOM0_MEM) to make the
>> logic easier to follow.
> How does use of strlen() make anything easier? I think it is a pretty
> common pattern to check the first character for nul if all one is
> after is to know whether a string is empty.

Only for things which are obviously a string.  CONFIG_DOM0_MEM isn't.

In this case, you have a name which would most obviously be an integer,
which is compiling in a context where an array reference is valid, which
is confusing to read.

As strlen() is implemented with a builtin, it should be evaluated by the
compiler, given that CONFIG_DOM0_MEM is a constant, but hopefully won't
trigger this warning.

~Andrew
diff mbox series

Patch

--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -341,7 +341,7 @@  unsigned long __init dom0_compute_nr_pag
      unsigned long avail = 0, nr_pages, min_pages, max_pages;
      bool need_paging;
  
-    if ( !dom0_mem_set && CONFIG_DOM0_MEM[0] )
+    if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set )
          parse_dom0_mem(CONFIG_DOM0_MEM);
  
      for_each_node_mask ( node, dom0_nodes )