sparse error on __int128
I think I've raised this question before, but I don't think I got a response that indicated whether this is a sparse bug or if there was a source or compile issue.
Here is the error:
sparse /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: impossible combination of type specifiers: unsigned __int128 /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: Expected ) at end of cast operator /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: got __int128
Here is the offending line in context:
5503 static inline __attribute__((no_instrument_function)) u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift) 5504 {
5505 return (u64)(((unsigned __int128)a * mul) >> shift);
5506 }
Here is the compile command:
$ gcc -E -Wp,-MD,/work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/.fw_common.i.d -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/5.1.1/include -I/work/rh7/arch/x86/include -Iarch/x86/include/generated -Iinclude -I/work/rh7/arch/x86/include/uapi -Iarch/x86/include/generated/uapi -I/work/rh7/include/uapi -Iinclude/generated/uapi -include /work/rh7/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m64 -mno-sse -mpreferred-stack-boundary=3 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -Wframe-larger-than=2048 -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS= 1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -Wframe-larger-than=2048! -fstack-p rotector-strong -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -mfentry -DCC_USING_FENTRY -fno-inline-functions-called-once -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -D__CHECK_ENDIAN__ -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(fw_common)" -D"KBUILD_MODNAME=KBUILD_STR(rtl8723_common)" -o /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c
Quoted 10 lines · Tony Camuso
I think I've raised this question before, but I don't think I got a response that indicated whether this is a sparse bug or if there was a source or compile issue.
Here is the error:
sparse /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: impossible combination of type specifiers: unsigned__int128/work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: Expected ) at end of cast operator /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: got__int128
Quoted 7 lines
Here is the offending line in context:
5503 static inline __attribute__((no_instrument_function)) u64
mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift)5504 {
5505 return (u64)(((unsigned __int128)a * mul) >> shift);
5506 }
Hi,
There is no source or compile issue here.
It's just that __int128 is only defined by gcc on x86_64 but is not defined by sparse.
Now, __int128 is only used twice in the kernel:
(mul_u64_u32_shr() & mul_u64_u64_shr()) and then only if
supported by the platform and if __SIZEOF_INT128__ is defined. Since sparse doesn't define __SIZEOF_INT128__ there shouldn't be any problems but you have used sparse not on the code itself but on preprocessed code by gcc. If you run sparse directly on the C code or more simply by using "make C=1 ..." to build kernel code, no such problem occurs.
Now, of course, one could argue that sparse should also define __int128 on platforms where gcc define it, on x86_64 thus.
Regards,
Luc
Quoted 34 lines · Luc Van Oostenryck
Quoted 10 lines · Tony Camuso
I think I've raised this question before, but I don't think I got a response that indicated whether this is a sparse bug or if there was a source or compile issue.
Here is the error:
sparse /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: impossible combination of type specifiers: unsigned__int128/work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: Expected ) at end of cast operator /work/rh7/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.i:5505:26: error: got__int128Quoted 7 lines
Here is the offending line in context:
5503 static inline __attribute__((no_instrument_function)) u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift) 5504 { 5505 return (u64)(((unsigned __int128)a * mul) >> shift); 5506 }Hi,
There is no source or compile issue here.
It's just that__int128is only defined by gcc onx86_64but is not defined by sparse.Now,
__int128is only used twice in the kernel:
(mul_u64_u32_shr()&mul_u64_u64_shr()) and then only if
supported by the platform and if__SIZEOF_INT128__is defined. Since sparse doesn't define__SIZEOF_INT128__there shouldn't be any problems but you have used sparse not on the code itself but on preprocessed code by gcc. If you run sparse directly on the C code or more simply by using "make C=1 ..." to build kernel code, no such problem occurs.
Quoted 2 lines
Now, of course, one could argue that sparse should also define
__int128on platforms where gcc define it, onx86_64thus.
Hi, Luc.
Thank you for responding. We are using preprocessor files, because what we're trying to do is to use sparse to identify exported symbols and all their dependencies, so we need to pull in the .h files, which the preprocessor does for us.
So, I will apply the argument you so graciously supplied and posit that sparse should define __int128 on platforms where gcc defines it, e.g. x86_64. :)
It doesn't seem like a very intrusive change.
Quoted 4 lines
Regards,
Luc
On Wed, Jan 13, 2016 at 09:06:33AM -0500, Tony Camuso wrote:
...
Quoted 2 lines
Quoted 2 lines
Now, of course, one could argue that sparse should also define
__int128on platforms where gcc define it, onx86_64thus.
...
Quoted 4 lines
So, I will apply the argument you so graciously supplied and posit that sparse should define
__int128on platforms where gcc defines it, e.g.x86_64. :)It doesn't seem like a very intrusive change.
Hehe :)
Feel like writing a patch for it?
Luc
Quoted 11 lines · Luc Van Oostenryck
On Wed, Jan 13, 2016 at 09:06:33AM -0500, Tony Camuso wrote:
...Quoted 2 lines
Quoted 2 lines
Now, of course, one could argue that sparse should also define
__int128on platforms where gcc define it, onx86_64thus....
Quoted 3 lines
So, I will apply the argument you so graciously supplied and posit that sparse should define
__int128on platforms where gcc defines it, e.g.x86_64. :)
Quoted 8 lines
Quoted 1 line
It doesn't seem like a very intrusive change.
Hehe :)
Feel like writing a patch for it?Luc
Sure! ;)