Re: next-20151007 perf build error "tools/include/linux/compiler.h:66: error: dereferencing pointer ‘res.41’ does break strict-aliasing rules"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 8, 2015 at 2:12 AM, Jiri Olsa <jolsa@xxxxxxxxxx> wrote:
> On Wed, Oct 07, 2015 at 11:28:26AM -0700, Vinson Lee wrote:
>> Hi.
>>
>> I hit this perf build error with next-20151007 with GCC 4.4.
>>
>>   CC       util/annotate.o
>> cc1: warnings being treated as errors
>> util/annotate.c: In function ‘disasm__purge’:
>> linux-next/tools/include/linux/compiler.h:66: error: dereferencing
>> pointer ‘res.41’ does break strict-aliasing rules
>> linux-next/tools/include/linux/compiler.h:66: note: initialized from here
>> util/annotate.c: In function ‘symbol__annotate’:
>> linux-next/tools/include/linux/compiler.h:66: error: dereferencing
>> pointer ‘res.41’ does break strict-aliasing rules
>> linux-next/tools/include/linux/compiler.h:66: note: initialized from here
>> linux-next/tools/include/linux/compiler.h:52: error: dereferencing
>> pointer ‘res.32’ does break strict-aliasing rules
>> linux-next/tools/include/linux/compiler.h:52: note: initialized from here
>>
>> Cheers,
>> Vinson
>
> we took this stuff from kernel, which is built with -fno-strict-aliasing
> which we use -Wstrict-aliasing=3
>
> we need something like below defined for all the types, but I'm still
> hoping for some nicer solution.. however patch below fixed the build
> for me.. could you please test?
>
> thanks,
> jirka
>
>
> ---
> diff --git a/tools/include/linux/compiler.h b/tools/include/linux/compiler.h
> index 9098083..0ed624f 100644
> --- a/tools/include/linux/compiler.h
> +++ b/tools/include/linux/compiler.h
> @@ -43,13 +43,18 @@
>
>  #include <linux/types.h>
>
> +typedef u64 __attribute__((__may_alias__)) u64_alias_t;
> +
>  static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
>  {
> +       u64_alias_t *u64_p = (u64_alias_t*) p;
> +       u64_alias_t *u64_res = (u64_alias_t*) res;
> +
>         switch (size) {
>         case 1: *(__u8 *)res = *(volatile __u8 *)p; break;
>         case 2: *(__u16 *)res = *(volatile __u16 *)p; break;
>         case 4: *(__u32 *)res = *(volatile __u32 *)p; break;
> -       case 8: *(__u64 *)res = *(volatile __u64 *)p; break;
> +       case 8: *u64_res = *u64_p; break;
>         default:
>                 barrier();
>                 __builtin_memcpy((void *)res, (const void *)p, size);
> @@ -59,11 +64,14 @@ static __always_inline void __read_once_size(const volatile void *p, void *res,
>
>  static __always_inline void __write_once_size(volatile void *p, void *res, int size)
>  {
> +       u64_alias_t *u64_p = (u64_alias_t*) p;
> +       u64_alias_t *u64_res = (u64_alias_t*) res;
> +
>         switch (size) {
>         case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
>         case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
>         case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
> -       case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
> +       case 8: *u64_p = *u64_res; break;
>         default:
>                 barrier();
>                 __builtin_memcpy((void *)p, (const void *)res, size);


This patch fixes my perf build error with GCC 4.4.

Vinson
--
To unsubscribe from this list: send the line "unsubscribe linux-next" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Linux USB Development]     [Yosemite News]     [Linux SCSI]

  Powered by Linux