2014-01-22 17:20:01

by Paul Walmsley

[permalink] [raw]
Subject: Re: [PATCH] bitops: fix signedness of compile-time hweight implementations

Hi Peter, hpa, Arnd,

On Wed, 18 Dec 2013, Paul Walmsley wrote:

>
> Enabling '-Wsign-compare' compiler warnings on code that includes
> include/linux/bitops.h can generate the following warning:
>
> In file included from include/linux/kernel.h:10:0,
> from <random filename>:48:
> include/linux/bitops.h: In function ?hweight_long?:
> include/linux/bitops.h:77:26: error: signed and unsigned type in conditional
> expression [-Werror=sign-compare]
>
> (converted to an error with -Werror)
>
> This is due to the use of the logical negation operator '!' in the
> __const_hweight8 macro in include/asm-generic/bitops/const_hweight.h.
> The use of that operator here results in a signed value.
>
> Fix by explicitly casting the __const_hweight8 macro expansion to
> 'unsigned int'. While here, clean up several checkpatch.pl warnings.
>
> Signed-off-by: Paul Walmsley <[email protected]>
> Cc: H. Peter Anvin <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Cc: Arnd Bergmann <[email protected]>
> ---
> Intended for v3.14.

Ping. Just checking to see if you have any comments on this one, or if
you're planning to send it upstream for v3.14.


- Paul

>
> include/asm-generic/bitops/const_hweight.h | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/include/asm-generic/bitops/const_hweight.h
> b/include/asm-generic/bitops/const_hweight.h
> index fa2a50b7ee66..40966203804d 100644
> --- a/include/asm-generic/bitops/const_hweight.h
> +++ b/include/asm-generic/bitops/const_hweight.h
> @@ -5,14 +5,15 @@
> * Compile time versions of __arch_hweightN()
> */
> #define __const_hweight8(w) \
> - ( (!!((w) & (1ULL << 0))) + \
> - (!!((w) & (1ULL << 1))) + \
> - (!!((w) & (1ULL << 2))) + \
> - (!!((w) & (1ULL << 3))) + \
> - (!!((w) & (1ULL << 4))) + \
> - (!!((w) & (1ULL << 5))) + \
> - (!!((w) & (1ULL << 6))) + \
> - (!!((w) & (1ULL << 7))) )
> + ((unsigned int) \
> + ((!!((w) & (1ULL << 0))) + \
> + (!!((w) & (1ULL << 1))) + \
> + (!!((w) & (1ULL << 2))) + \
> + (!!((w) & (1ULL << 3))) + \
> + (!!((w) & (1ULL << 4))) + \
> + (!!((w) & (1ULL << 5))) + \
> + (!!((w) & (1ULL << 6))) + \
> + (!!((w) & (1ULL << 7)))))
>
> #define __const_hweight16(w) (__const_hweight8(w) + __const_hweight8((w) >>
> 8 ))
> #define __const_hweight32(w) (__const_hweight16(w) + __const_hweight16((w) >>
> 16))
> --
> 1.8.5.1
>


- Paul


2014-01-22 17:48:18

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH] bitops: fix signedness of compile-time hweight implementations

On Wed, Jan 22, 2014 at 05:19:58PM +0000, Paul Walmsley wrote:
> Hi Peter, hpa, Arnd,
>
> On Wed, 18 Dec 2013, Paul Walmsley wrote:
>
> >
> > Enabling '-Wsign-compare' compiler warnings on code that includes
> > include/linux/bitops.h can generate the following warning:
> >
> > In file included from include/linux/kernel.h:10:0,
> > from <random filename>:48:
> > include/linux/bitops.h: In function ‘hweight_long’:
> > include/linux/bitops.h:77:26: error: signed and unsigned type in conditional
> > expression [-Werror=sign-compare]
> >
> > (converted to an error with -Werror)
> >
> > This is due to the use of the logical negation operator '!' in the
> > __const_hweight8 macro in include/asm-generic/bitops/const_hweight.h.
> > The use of that operator here results in a signed value.
> >
> > Fix by explicitly casting the __const_hweight8 macro expansion to
> > 'unsigned int'. While here, clean up several checkpatch.pl warnings.
> >
> > Signed-off-by: Paul Walmsley <[email protected]>
> > Cc: H. Peter Anvin <[email protected]>
> > Cc: Peter Zijlstra <[email protected]>
> > Cc: Arnd Bergmann <[email protected]>
> > ---
> > Intended for v3.14.
>
> Ping. Just checking to see if you have any comments on this one, or if
> you're planning to send it upstream for v3.14.

I'm not sure through which tree to send it, but just I've queued it so
it doesn't get lost again.

Also, it didn't apply as is for some reason, hit it on the head with a
hammer though.