Re: [PATCH 09/17] riscv: Add __attribute_const__ to ffs()-family implementations
Alexandre Ghiti <[email protected]>
| Newsgroups | org.kernel.vger.linux-hexagon,dev.linux.lists.llvm,org.infradead.lists.linux-riscv,org.kernel.vger.linux-alpha,org.kernel.vger.linux-arch,org.kernel.vger.linux-csky,org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k,org.kernel.vger.linux-mips,org.kernel.vger.linux-openrisc,org.kernel.vger.linux-parisc,org.kernel.vger.linux-s390,org.kernel.vger.linux-sh,org.kernel.vger.sparclinux,org.ozlabs.lists.linuxppc-dev |
|---|---|
| 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