linux/arch/alpha/include/asm
Kees Cook a8d060ddee alpha: Add __attribute_const__ to ffs()-family implementations
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 Alpha's implementations
of __ffs(), ffs(), fls64(), __fls(), fls(), and ffz() 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=alpha defconfig with GCC alpha-linux-gnu 14.2.0.

Link: https://github.com/KSPP/linux/issues/364 [1]
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250804164417.1612371-7-kees@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
2025-09-08 14:58:51 -07:00
..
agp_backend.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
asm-prototypes.h alpha: move __udiv_qrnnd library function to arch/alpha/lib/ 2021-09-18 14:45:48 -07:00
atomic.h locking/atomic: treewide: delete arch_atomic_*() kerneldoc 2023-06-05 09:57:24 +02:00
barrier.h alpha: Override READ_ONCE() with barriered implementation 2020-07-21 10:50:35 +01:00
bitops.h alpha: Add __attribute_const__ to ffs()-family implementations 2025-09-08 14:58:51 -07:00
bug.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
cache.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
cacheflush.h mm: rationalise flush_icache_pages() and flush_icache_page() 2023-08-24 16:20:25 -07:00
checksum.h saner calling conventions for csum_and_copy_..._user() 2020-08-20 15:45:15 -04:00
cmpxchg.h alpha: no need to include asm/xchg.h twice 2024-08-19 09:45:27 +02:00
compiler.h alpha: remove undef inline in compiler.h 2021-07-25 22:18:20 -07:00
console.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
core_cia.h alpha: add full ioread64/iowrite64 implementation 2022-10-04 11:23:29 +02:00
core_irongate.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
core_marvel.h alpha: add full ioread64/iowrite64 implementation 2022-10-04 11:23:29 +02:00
core_mcpcia.h alpha: add full ioread64/iowrite64 implementation 2022-10-04 11:23:29 +02:00
core_polaris.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
core_t2.h alpha: sable: remove early machine support 2024-05-03 22:09:55 +02:00
core_titan.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
core_tsunami.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
core_wildfire.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
delay.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
device.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 428 2019-06-05 17:37:16 +02:00
dma-mapping.h alpha: remove DECpc AXP150 (Jensen) support 2024-05-03 22:09:50 +02:00
dma.h alpha: remove LCA and APECS based machines 2024-05-03 22:09:59 +02:00
elf.h alpha/elf: Fix misc/setarch test of util-linux by removing 32bit support 2025-02-06 07:35:38 -08:00
emergency-restart.h
err_common.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
err_ev6.h
err_ev7.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
extable.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
floppy.h arch/*/: remove CONFIG_VIRT_TO_BUS 2022-06-28 13:20:21 +02:00
fpu.h alpha: lazy FPU switching 2023-02-24 23:14:22 -05:00
ftrace.h tracing: make CALLER_ADDRx overwriteable 2009-03-02 16:49:37 -05:00
futex.h futex: arch_futex_atomic_op_inuser() calling conventions change 2020-03-27 23:58:51 -04:00
gct.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hardirq.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hw_irq.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hwrpb.h alpha: Replace one-element array with flexible array member 2025-02-14 14:06:15 -05:00
io.h alpha: stop using asm-generic/iomap.h 2025-03-10 16:20:25 +01:00
io_trivial.h alpha: add full ioread64/iowrite64 implementation 2022-10-04 11:23:29 +02:00
irq.h alpha: cabriolet: remove EV5 CPU support 2024-05-03 22:10:03 +02:00
irqflags.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
Kbuild asm-generic: introduce text-patching.h 2024-11-07 14:25:15 -08:00
linkage.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
local.h locking/local, arch: Rewrite local_add_unless() as a static inline function 2023-10-04 11:38:11 +02:00
machvec.h alpha: drop pre-EV56 support 2024-05-06 12:05:00 +02:00
mc146818rtc.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mce.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mmu.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mmu_context.h alpha: drop pre-EV56 support 2024-05-06 12:05:00 +02:00
module.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
page.h - The series "zram: optimal post-processing target selection" from 2024-11-23 09:58:07 -08:00
pal.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
parport.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci.h PCI/sysfs: Move declarations to linux/pci.h 2023-08-14 12:05:18 -05:00
percpu.h mm/percpu: conditionally define _shared_alloc_tag via CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU 2025-07-09 22:42:15 -07:00
perf_event.h perf, arch: Cleanup perf-pmu init vs lockup-detector 2010-11-26 15:14:56 +01:00
pgalloc.h mm/thp: define default pmd_pgtable() 2021-07-01 11:06:03 -07:00
pgtable.h mm: pgtable: fix pte_swp_exclusive 2025-06-11 14:52:08 -07:00
processor.h alpha/elf: Fix misc/setarch test of util-linux by removing 32bit support 2025-02-06 07:35:38 -08:00
ptrace.h kill signal_pt_regs() 2022-10-23 18:06:54 -04:00
rwonce.h alpha: Override READ_ONCE() with barriered implementation 2020-07-21 10:50:35 +01:00
serial.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
setup.h alpha: Use absolute_pointer to define COMMAND_LINE 2021-09-15 12:04:28 -07:00
sfp-machine.h
shmparam.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
signal.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
smp.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
socket.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sparsemem.h alpha: switch from DISCONTIGMEM to SPARSEMEM 2020-12-15 12:13:42 -08:00
special_insns.h alpha: drop pre-EV56 support 2024-05-06 12:05:00 +02:00
spinlock.h Merge branch 'linus' into locking/core, to resolve conflicts 2017-11-07 10:32:44 +01:00
spinlock_types.h Improve consistency of '#error' directive messages 2024-11-11 17:17:04 -08:00
string.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
switch_to.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
syscall.h alpha: Add syscall_get_return_value() 2021-07-25 22:33:03 -07:00
thread_info.h alpha: lazy FPU switching 2023-02-24 23:14:22 -05:00
timex.h alpha: define get_cycles macro for arch-override 2022-05-13 23:59:23 +02:00
tlb.h arch/tlb: Clean up simple architectures 2019-04-03 10:32:54 +02:00
tlbflush.h alpha: drop pre-EV56 support 2024-05-06 12:05:00 +02:00
topology.h alpha: remove DISCONTIGMEM and NUMA 2021-06-29 10:53:55 -07:00
types.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
uaccess.h alpha: drop pre-EV56 support 2024-05-06 12:05:00 +02:00
ucontext.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
unistd.h alpha: replace NR_SYSCALLS by NR_syscalls 2023-02-14 12:37:17 -05:00
user.h asm/user.h: killed unused macros 2022-01-30 21:17:00 -05:00
vga.h alpha: sort scr_mem{cpy,move}w() out 2024-05-03 22:08:50 +02:00
vmalloc.h mm/vmalloc: Add empty <asm/vmalloc.h> headers and use them from <linux/vmalloc.h> 2019-12-10 10:12:55 +01:00
word-at-a-time.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
wrperfmon.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xor.h lib/xor: make xor prototypes more friendly to compiler vectorization 2022-02-11 20:39:39 +11:00