Re: [PATCH 09/17] riscv: Add __attribute_const__ to ffs()-family implementations
Alexandre Ghiti <[email protected]>
| Newsgroups | gmane.linux.ports.m68k,gmane.linux.kernel.cross-arch,gmane.linux.kernel,gmane.linux.ports.alpha,gmane.linux.ports.hexagon,gmane.linux.ports.mips,gmane.linux.ports.parisc,gmane.linux.ports.ppc64.devel,gmane.linux.ports.riscv,gmane.linux.ports.sh.devel,gmane.linux.ports.sparc |
|---|---|
| Message-ID | <[email protected]> |
Hi Kees, On 8/4/25 18:44, Kees Cook wrote: > While tracking down a problem where constant expressions used by > BUILD_BUG_ON() suddenly stopped working[1], we found that an added static > initializer was convincing the compiler that it couldn't track the state > of the prior statically initialized value. Tracing this down found that > ffs() was used in the initializer macro, but since it wasn't marked with > __attribute__const__, the compiler had to assume the function might > change variable states as a side-effect (which is not true for ffs(), > which provides deterministic math results). > > Add missing __attribute_const__ annotations to RISC-V's implementations of > variable__ffs(), variable__fls(), and variable_ffs() functions. These are pure > mathematical functions that always return the same result for the same > input with no side effects, making them eligible for compiler optimization. > > Build tested ARCH=riscv defconfig with GCC riscv64-linux-gnu 14.2.0. > > Link: https://github.com/KSPP/linux/issues/364 [1] > Signed-off-by: Kees Cook <[email protected]> > --- > arch/riscv/include/asm/bitops.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/include/asm/bitops.h b/arch/riscv/include/asm/bitops.h > index d59310f74c2b..77880677b06e 100644 > --- a/arch/riscv/include/asm/bitops.h > +++ b/arch/riscv/include/asm/bitops.h > @@ -45,7 +45,7 @@ > #error "Unexpected BITS_PER_LONG" > #endif > > -static __always_inline unsigned long variable__ffs(unsigned long word) > +static __always_inline __attribute_const__ unsigned long variable__ffs(unsigned long word) > { > asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, > RISCV_ISA_EXT_ZBB, 1) > @@ -74,7 +74,7 @@ static __always_inline unsigned long variable__ffs(unsigned long word) > (unsigned long)__builtin_ctzl(word) : \ > variable__ffs(word)) > > -static __always_inline unsigned long variable__fls(unsigned long word) > +static __always_inline __attribute_const__ unsigned long variable__fls(unsigned long word) > { > asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, > RISCV_ISA_EXT_ZBB, 1) > @@ -103,7 +103,7 @@ static __always_inline unsigned long variable__fls(unsigned long word) > (unsigned long)(BITS_PER_LONG - 1 - __builtin_clzl(word)) : \ > variable__fls(word)) > > -static __always_inline int variable_ffs(int x) > +static __always_inline __attribute_const__ int variable_ffs(int x) > { > asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, > RISCV_ISA_EXT_ZBB, 1) Tested-by: Alexandre Ghiti <[email protected]> Acked-by: Alexandre Ghiti <[email protected]> Thanks, Alex