mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [RFC] perf tools: Fix strict alias issue for find_first_bit
@ 2014-02-26 17:14 Jiri Olsa
  2014-02-26 17:18 ` Peter Zijlstra
  2014-03-02  8:57 ` [tip:perf/urgent] perf tools: Fix strict alias issue for find_first_bit tip-bot for Jiri Olsa
  0 siblings, 2 replies; 4+ messages in thread
From: Jiri Olsa @ 2014-02-26 17:14 UTC (permalink / raw)
  To: linux-kernel
  Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

hi,
got issue below when compiling perf tool on i686 with gcc 4.4,
but not sure the patch is correct workaround here.

thanks for comments,
jirka


---
When compiling perf tool code with gcc 4.4.7 I'm getting
following error:

  CC       util/session.o
cc1: warnings being treated as errors
util/session.c: In function ‘perf_session_deliver_event’:
/root/linux/tools/perf/util/include/linux/bitops.h:109: error: dereferencing pointer ‘p’ does break strict-aliasing rules
/root/linux/tools/perf/util/include/linux/bitops.h:101: error: dereferencing pointer ‘p’ does break strict-aliasing rules
util/session.c:697: note: initialized from here
/root/linux/tools/perf/util/include/linux/bitops.h:101: note: initialized from here
make[1]: *** [util/session.o] Error 1
make: *** [util/session.o] Error 2

The aliased types here are u64 and unsigned long pointers,
which is safe for the find_first_bit processing.

This error shows up for me only for gcc 4.4 on 32bit x86,
even for -Wstrict-aliasing=3, while newer gcc are quiet
and scream here for -Wstrict-aliasing={2,1}. Looks like
newer gcc changed the rules for strict alias warnings.

The gcc documentation offers workaround for valid
aliasing by using __may_alias__ attribute:
  http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Type-Attributes.html

Using this workaround for the find_first_bit function.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/perf/util/include/linux/bitops.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h
index 45cf10a..dadfa7e 100644
--- a/tools/perf/util/include/linux/bitops.h
+++ b/tools/perf/util/include/linux/bitops.h
@@ -87,13 +87,15 @@ static __always_inline unsigned long __ffs(unsigned long word)
 	return num;
 }
 
+typedef const unsigned long __attribute__((__may_alias__)) long_alias_t;
+
 /*
  * Find the first set bit in a memory region.
  */
 static inline unsigned long
 find_first_bit(const unsigned long *addr, unsigned long size)
 {
-	const unsigned long *p = addr;
+	long_alias_t *p = (long_alias_t *) addr;
 	unsigned long result = 0;
 	unsigned long tmp;
 
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC] perf tools: Fix strict alias issue for find_first_bit
  2014-02-26 17:14 [RFC] perf tools: Fix strict alias issue for find_first_bit Jiri Olsa
@ 2014-02-26 17:18 ` Peter Zijlstra
  2014-02-26 17:47   ` [PATCH] perf tools: Do not compile with -fstrict-aliasing Jiri Olsa
  2014-03-02  8:57 ` [tip:perf/urgent] perf tools: Fix strict alias issue for find_first_bit tip-bot for Jiri Olsa
  1 sibling, 1 reply; 4+ messages in thread
From: Peter Zijlstra @ 2014-02-26 17:18 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Arnaldo Carvalho de Melo,
	David Ahern

On Wed, Feb 26, 2014 at 06:14:26PM +0100, Jiri Olsa wrote:
> hi,
> got issue below when compiling perf tool on i686 with gcc 4.4,
> but not sure the patch is correct workaround here.
> 
> thanks for comments,
> jirka
> 
> 
> ---
> When compiling perf tool code with gcc 4.4.7 I'm getting
> following error:
> 
>   CC       util/session.o
> cc1: warnings being treated as errors
> util/session.c: In function ‘perf_session_deliver_event’:
> /root/linux/tools/perf/util/include/linux/bitops.h:109: error: dereferencing pointer ‘p’ does break strict-aliasing rules
> /root/linux/tools/perf/util/include/linux/bitops.h:101: error: dereferencing pointer ‘p’ does break strict-aliasing rules
> util/session.c:697: note: initialized from here
> /root/linux/tools/perf/util/include/linux/bitops.h:101: note: initialized from here
> make[1]: *** [util/session.o] Error 1
> make: *** [util/session.o] Error 2
> 
> The aliased types here are u64 and unsigned long pointers,
> which is safe for the find_first_bit processing.
> 
> This error shows up for me only for gcc 4.4 on 32bit x86,
> even for -Wstrict-aliasing=3, while newer gcc are quiet
> and scream here for -Wstrict-aliasing={2,1}. Looks like
> newer gcc changed the rules for strict alias warnings.
> 
> The gcc documentation offers workaround for valid
> aliasing by using __may_alias__ attribute:
>   http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Type-Attributes.html
> 

The kernel builds with -fno-strict-aliasing because the C aliasing rules
are a bunch of monkey poo. Perf tool should probably do the same.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] perf tools: Do not compile with -fstrict-aliasing
  2014-02-26 17:18 ` Peter Zijlstra
@ 2014-02-26 17:47   ` Jiri Olsa
  0 siblings, 0 replies; 4+ messages in thread
From: Jiri Olsa @ 2014-02-26 17:47 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Arnaldo Carvalho de Melo,
	David Ahern

On Wed, Feb 26, 2014 at 06:18:05PM +0100, Peter Zijlstra wrote:
> On Wed, Feb 26, 2014 at 06:14:26PM +0100, Jiri Olsa wrote:
> > hi,
> > got issue below when compiling perf tool on i686 with gcc 4.4,
> > but not sure the patch is correct workaround here.
> > 
> > thanks for comments,
> > jirka
> > 
> > 
> > ---
> > When compiling perf tool code with gcc 4.4.7 I'm getting
> > following error:
> > 
> >   CC       util/session.o
> > cc1: warnings being treated as errors
> > util/session.c: In function ‘perf_session_deliver_event’:
> > /root/linux/tools/perf/util/include/linux/bitops.h:109: error: dereferencing pointer ‘p’ does break strict-aliasing rules
> > /root/linux/tools/perf/util/include/linux/bitops.h:101: error: dereferencing pointer ‘p’ does break strict-aliasing rules
> > util/session.c:697: note: initialized from here
> > /root/linux/tools/perf/util/include/linux/bitops.h:101: note: initialized from here
> > make[1]: *** [util/session.o] Error 1
> > make: *** [util/session.o] Error 2
> > 
> > The aliased types here are u64 and unsigned long pointers,
> > which is safe for the find_first_bit processing.
> > 
> > This error shows up for me only for gcc 4.4 on 32bit x86,
> > even for -Wstrict-aliasing=3, while newer gcc are quiet
> > and scream here for -Wstrict-aliasing={2,1}. Looks like
> > newer gcc changed the rules for strict alias warnings.
> > 
> > The gcc documentation offers workaround for valid
> > aliasing by using __may_alias__ attribute:
> >   http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Type-Attributes.html
> > 
> 
> The kernel builds with -fno-strict-aliasing because the C aliasing rules
> are a bunch of monkey poo. Perf tool should probably do the same.

my pleasure ;-)

thanks,
jirka


---
Switching off the strict aliasing for perf tool compilation,
because it causes compilation issues/errors for older gcc,
and to quote Peter:
  "C aliasing rules are a bunch of monkey poo"

We don't enable strict aliasing actively, it is forced by
-Ox option. Using -fno-strict-aliasing option at the same
time we use -O.

Removing -Wstrict-aliasing=3 option as well.

Suggested-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/perf/config/Makefile     | 2 +-
 tools/scripts/Makefile.include | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index f7c81d3..e7786c7 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -94,7 +94,7 @@ ifndef DEBUG
 endif
 
 ifeq ($(DEBUG),0)
-  CFLAGS += -O6
+  CFLAGS += -O6 -fno-strict-aliasing
 endif
 
 ifdef PARSER_DEBUG
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
index 8abbef1..3667b5b 100644
--- a/tools/scripts/Makefile.include
+++ b/tools/scripts/Makefile.include
@@ -32,7 +32,6 @@ EXTRA_WARNINGS += -Wold-style-definition
 EXTRA_WARNINGS += -Wpacked
 EXTRA_WARNINGS += -Wredundant-decls
 EXTRA_WARNINGS += -Wshadow
-EXTRA_WARNINGS += -Wstrict-aliasing=3
 EXTRA_WARNINGS += -Wstrict-prototypes
 EXTRA_WARNINGS += -Wswitch-default
 EXTRA_WARNINGS += -Wswitch-enum
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tip:perf/urgent] perf tools: Fix strict alias issue for find_first_bit
  2014-02-26 17:14 [RFC] perf tools: Fix strict alias issue for find_first_bit Jiri Olsa
  2014-02-26 17:18 ` Peter Zijlstra
@ 2014-03-02  8:57 ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 4+ messages in thread
From: tip-bot for Jiri Olsa @ 2014-03-02  8:57 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, namhyung,
	jolsa, fweisbec, dsahern, tglx, cjashfor, mingo

Commit-ID:  b39c2a57a00a841f057a75b41df4c26173288b66
Gitweb:     http://git.kernel.org/tip/b39c2a57a00a841f057a75b41df4c26173288b66
Author:     Jiri Olsa <jolsa@redhat.com>
AuthorDate: Wed, 26 Feb 2014 18:14:26 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 28 Feb 2014 10:39:40 -0300

perf tools: Fix strict alias issue for find_first_bit

When compiling perf tool code with gcc 4.4.7 I'm getting
following error:

    CC       util/session.o
  cc1: warnings being treated as errors
  util/session.c: In function ‘perf_session_deliver_event’:
  tools/perf/util/include/linux/bitops.h:109: error: dereferencing pointer ‘p’ does break strict-aliasing rules
  tools/perf/util/include/linux/bitops.h:101: error: dereferencing pointer ‘p’ does break strict-aliasing rules
  util/session.c:697: note: initialized from here
  tools/perf/util/include/linux/bitops.h:101: note: initialized from here
  make[1]: *** [util/session.o] Error 1
  make: *** [util/session.o] Error 2

The aliased types here are u64 and unsigned long pointers, which is safe
for the find_first_bit processing.

This error shows up for me only for gcc 4.4 on 32bit x86, even for
-Wstrict-aliasing=3, while newer gcc are quiet and scream here for
-Wstrict-aliasing={2,1}. Looks like newer gcc changed the rules for
strict alias warnings.

The gcc documentation offers workaround for valid aliasing by using
__may_alias__ attribute:

  http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Type-Attributes.html

Using this workaround for the find_first_bit function.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1393434867-20271-1-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/include/linux/bitops.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h
index 45cf10a..dadfa7e 100644
--- a/tools/perf/util/include/linux/bitops.h
+++ b/tools/perf/util/include/linux/bitops.h
@@ -87,13 +87,15 @@ static __always_inline unsigned long __ffs(unsigned long word)
 	return num;
 }
 
+typedef const unsigned long __attribute__((__may_alias__)) long_alias_t;
+
 /*
  * Find the first set bit in a memory region.
  */
 static inline unsigned long
 find_first_bit(const unsigned long *addr, unsigned long size)
 {
-	const unsigned long *p = addr;
+	long_alias_t *p = (long_alias_t *) addr;
 	unsigned long result = 0;
 	unsigned long tmp;
 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-03-02  8:58 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-26 17:14 [RFC] perf tools: Fix strict alias issue for find_first_bit Jiri Olsa
2014-02-26 17:18 ` Peter Zijlstra
2014-02-26 17:47   ` [PATCH] perf tools: Do not compile with -fstrict-aliasing Jiri Olsa
2014-03-02  8:57 ` [tip:perf/urgent] perf tools: Fix strict alias issue for find_first_bit tip-bot for Jiri Olsa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome