[RFC] perf tools: Fix strict alias issue for find_first_bit

From: Jiri Olsa
Date: Wed Feb 26 2014 - 12:14:59 EST


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@xxxxxxxxxx>
Cc: Corey Ashford <cjashfor@xxxxxxxxxxxxxxxxxx>
Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
Cc: Paul Mackerras <paulus@xxxxxxxxx>
Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxxxxxxxxxx>
Cc: David Ahern <dsahern@xxxxxxxxx>
---
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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/