Re: [PATCH 05/17] powerpc: Add __attribute_const__ to ffs()-family implementations
Madhavan Srinivasan <[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]> |
On 8/4/25 10:14 PM, 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 PowerPC's implementations of > fls() function. 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=powerpc defconfig with GCC powerpc-linux-gnu 14.2.0. > Also tested with gcc 8.1. Acked-by: Madhavan Srinivasan <[email protected]> > Link: https://github.com/KSPP/linux/issues/364 [1] > Signed-off-by: Kees Cook <[email protected]> > --- > arch/powerpc/include/asm/bitops.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h > index 671ecc6711e3..0d0470cd5ac3 100644 > --- a/arch/powerpc/include/asm/bitops.h > +++ b/arch/powerpc/include/asm/bitops.h > @@ -276,7 +276,7 @@ static inline void arch___clear_bit_unlock(int nr, volatile unsigned long *addr) > * fls: find last (most-significant) bit set. > * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. > */ > -static __always_inline int fls(unsigned int x) > +static __always_inline __attribute_const__ int fls(unsigned int x) > { > int lz; > > @@ -294,7 +294,7 @@ static __always_inline int fls(unsigned int x) > * 32-bit fls calls. > */ > #ifdef CONFIG_PPC64 > -static __always_inline int fls64(__u64 x) > +static __always_inline __attribute_const__ int fls64(__u64 x) > { > int lz; >