Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PATCH] perf tools: Prevent from BITS_PER_LONG redefinition

4 views
Skip to first unread message

Frederic Weisbecker

unread,
Dec 18, 2009, 5:10:02 PM12/18/09
to
The system asm/types.h may have defined BITS_PER_LONG already,
depending on the distro.

Check that before defining it from bitops.h wrapper.

Fixes:

In file included from util/include/../../../../include/linux/bitops.h:17,
from util/include/linux/bitops.h:8,
from ../../lib/hweight.c:2:
util/include/asm/bitops.h:9:1: error: "BITS_PER_LONG" redefined
In file included from util/include/../../../../include/linux/bitops.h:3,
from util/include/linux/bitops.h:8,
from ../../lib/hweight.c:2:
/usr/include/asm/types.h:32:1: error: this is the location of the previous definition
make: *** [util/hweight.o] Erreur 1

Signed-off-by: Frederic Weisbecker <fwei...@gmail.com>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Arnaldo Carvalho de Melo <ac...@redhat.com>
Cc: Paul Mackerras <pau...@samba.org>
---
tools/perf/util/include/asm/bitops.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/include/asm/bitops.h b/tools/perf/util/include/asm/bitops.h
index 58e9817..d945334 100644
--- a/tools/perf/util/include/asm/bitops.h
+++ b/tools/perf/util/include/asm/bitops.h
@@ -5,8 +5,10 @@
#include "../../types.h"
#include <linux/compiler.h>

+#ifndef BITS_PER_LONG
/* CHECKME: Not sure both always match */
#define BITS_PER_LONG __WORDSIZE
+#endif

#include "../../../../include/asm-generic/bitops/__fls.h"
#include "../../../../include/asm-generic/bitops/fls.h"
--
1.6.2.3

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

Peter Zijlstra

unread,
Dec 19, 2009, 4:30:02 AM12/19/09
to
On Fri, 2009-12-18 at 23:05 +0100, Frederic Weisbecker wrote:
> +#ifndef BITS_PER_LONG
> /* CHECKME: Not sure both always match */
> #define BITS_PER_LONG __WORDSIZE
> +#endif

Why use __WORDSIZE if you're not sure?

(8*sizeof(long)) is simple and unambiguous.

Frederic Weisbecker

unread,
Dec 19, 2009, 9:40:02 AM12/19/09
to
On Sat, Dec 19, 2009 at 10:26:07AM +0100, Peter Zijlstra wrote:
> On Fri, 2009-12-18 at 23:05 +0100, Frederic Weisbecker wrote:
> > +#ifndef BITS_PER_LONG
> > /* CHECKME: Not sure both always match */
> > #define BITS_PER_LONG __WORDSIZE
> > +#endif
>
> Why use __WORDSIZE if you're not sure?
>
> (8*sizeof(long)) is simple and unambiguous.


Yeah but we need it from the CPP level.
We include such code located in kernel headers:

static __always_inline unsigned long __fls(unsigned long word)
{
int num = BITS_PER_LONG - 1;

#if BITS_PER_LONG == 64
if (!(word & (~0ul << 32))) {
num -= 32;
word <<= 32;
}
#endif
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
num -= 16;
word <<= 16;
}


And sizeof() is not defined :)

Jeremy Fitzhardinge

unread,
Dec 20, 2009, 12:20:02 AM12/20/09
to
On 12/19/2009 06:34 AM, Frederic Weisbecker wrote:
> Yeah but we need it from the CPP level.
> We include such code located in kernel headers:
>
> static __always_inline unsigned long __fls(unsigned long word)
> {
> int num = BITS_PER_LONG - 1;
>
> #if BITS_PER_LONG == 64
> if (!(word& (~0ul<< 32))) {

> num -= 32;
> word<<= 32;
> }
> #endif
> if (!(word& (~0ul<< (BITS_PER_LONG-16)))) {

> num -= 16;
> word<<= 16;
> }
>
>
> And sizeof() is not defined :)
>

You can use if() with a constant expression instead of #if.

J

Frederic Weisbecker

unread,
Dec 30, 2009, 4:50:02 PM12/30/09
to
On Sat, Dec 19, 2009 at 09:11:20PM -0800, Jeremy Fitzhardinge wrote:
> On 12/19/2009 06:34 AM, Frederic Weisbecker wrote:
>> Yeah but we need it from the CPP level.
>> We include such code located in kernel headers:
>>
>> static __always_inline unsigned long __fls(unsigned long word)
>> {
>> int num = BITS_PER_LONG - 1;
>>
>> #if BITS_PER_LONG == 64
>> if (!(word& (~0ul<< 32))) {
>> num -= 32;
>> word<<= 32;
>> }
>> #endif
>> if (!(word& (~0ul<< (BITS_PER_LONG-16)))) {
>> num -= 16;
>> word<<= 16;
>> }
>>
>>
>> And sizeof() is not defined :)
>>
>
> You can use if() with a constant expression instead of #if.

I did not write this code. But yes you're right, although I
think CPP is more suitable here because fls() can be called
from fastpath and this conditional build makes one check less
and lesser i-cache footprint.

Jeremy Fitzhardinge

unread,
Jan 2, 2010, 12:50:01 AM1/2/10
to
On 12/31/2009 08:45 AM, Frederic Weisbecker wrote:
>> You can use if() with a constant expression instead of #if.
>>
>
>
> I did not write this code. But yes you're right, although I
> think CPP is more suitable here because fls() can be called
> from fastpath and this conditional build makes one check less
> and lesser i-cache footprint.
>

Constant if()s are removed at compile time, so there should be no
runtime overhead. Constant if()s are generally preferable to #if
because the compile will statically check the other code branch, even if
it never gets executed, which helps prevent it from rotting.

J

Frederic Weisbecker

unread,
Jan 2, 2010, 12:10:02 PM1/2/10
to
On Thu, Dec 31, 2009 at 10:09:43PM +1100, Jeremy Fitzhardinge wrote:
> On 12/31/2009 08:45 AM, Frederic Weisbecker wrote:
>>> You can use if() with a constant expression instead of #if.
>>>
>>
>>
>> I did not write this code. But yes you're right, although I
>> think CPP is more suitable here because fls() can be called
>> from fastpath and this conditional build makes one check less
>> and lesser i-cache footprint.
>>
>
> Constant if()s are removed at compile time, so there should be no
> runtime overhead. Constant if()s are generally preferable to #if
> because the compile will statically check the other code branch, even if
> it never gets executed, which helps prevent it from rotting.

Good point! I did not think about compile time optimizations.
I'll try that then. Thanks!

0 new messages