]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
openrisc: Add __attribute_const__ to ffs()-family implementations
authorKees Cook <kees@kernel.org>
Mon, 4 Aug 2025 16:44:06 +0000 (09:44 -0700)
committerKees Cook <kees@kernel.org>
Mon, 8 Sep 2025 21:58:51 +0000 (14:58 -0700)
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 OpenRISC's implementations of
ffs(), __ffs(), fls(), and __fls() 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=openrisc defconfig with GCC or1k-linux 15.1.0.

Link: https://github.com/KSPP/linux/issues/364
Acked-by: Stafford Horne <shorne@gmail.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250804164417.1612371-10-kees@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
arch/openrisc/include/asm/bitops/__ffs.h
arch/openrisc/include/asm/bitops/__fls.h
arch/openrisc/include/asm/bitops/ffs.h
arch/openrisc/include/asm/bitops/fls.h

index 1e224b616fdf68b33dc8b90015f621432be90a9f..4827b66530b2bd1ed910d81d1c7e66e4ad76f0ca 100644 (file)
@@ -11,7 +11,7 @@
 
 #ifdef CONFIG_OPENRISC_HAVE_INST_FF1
 
-static inline unsigned long __ffs(unsigned long x)
+static inline __attribute_const__ unsigned long __ffs(unsigned long x)
 {
        int ret;
 
index 9658446ad14102c94edfd8cda8697271c80e505a..637cc76fe4b7d6cfb73066b7b8e8259564f5a13c 100644 (file)
@@ -11,7 +11,7 @@
 
 #ifdef CONFIG_OPENRISC_HAVE_INST_FL1
 
-static inline unsigned long __fls(unsigned long x)
+static inline __attribute_const__ unsigned long __fls(unsigned long x)
 {
        int ret;
 
index b4c835d6bc8496427c25a2f55bae249a5654d281..536a60ab9cc30f4624484228e33d3c674657cf4f 100644 (file)
@@ -10,7 +10,7 @@
 
 #ifdef CONFIG_OPENRISC_HAVE_INST_FF1
 
-static inline int ffs(int x)
+static inline __attribute_const__ int ffs(int x)
 {
        int ret;
 
index 6b77f6556fb9c1dc8a586e6896e5704c5959cb58..77da7639bb3e4f424062bcaebfcee5cc3f11a667 100644 (file)
@@ -11,7 +11,7 @@
 
 #ifdef CONFIG_OPENRISC_HAVE_INST_FL1
 
-static inline int fls(unsigned int x)
+static inline __attribute_const__ int fls(unsigned int x)
 {
        int ret;