]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
compiler_types: Add __assume macro
authorHeiko Carstens <hca@linux.ibm.com>
Tue, 16 Sep 2025 13:48:01 +0000 (15:48 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Thu, 18 Sep 2025 12:06:40 +0000 (14:06 +0200)
Make the statement attribute "assume" with a new __assume macro available.

The assume attribute is used to indicate that a certain condition is
assumed to be true. Compilers may or may not use this indication to
generate optimized code. If this condition is violated at runtime, the
behavior is undefined.

Note that the clang documentation states that optimizers may react
differently to this attribute, and this may even have a negative
performance impact. Therefore this attribute should be used with care.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
include/linux/compiler_types.h
init/Kconfig

index 16755431fc11ee5e31c31df236fcda6c83a15b15..2f3e80bf9f3574621ce8616c4c1d2d925b718d77 100644 (file)
@@ -329,6 +329,29 @@ struct ftrace_likely_data {
 #define __no_sanitize_or_inline __always_inline
 #endif
 
+/*
+ * The assume attribute is used to indicate that a certain condition is
+ * assumed to be true. If this condition is violated at runtime, the behavior
+ * is undefined. Compilers may or may not use this indication to generate
+ * optimized code.
+ *
+ * Note that the clang documentation states that optimizers may react
+ * differently to this attribute, and this may even have a negative
+ * performance impact. Therefore this attribute should be used with care.
+ *
+ * Optional: only supported since gcc >= 13
+ * Optional: only supported since clang >= 19
+ *
+ *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#index-assume-statement-attribute
+ * clang: https://clang.llvm.org/docs/AttributeReference.html#id13
+ *
+ */
+#ifdef CONFIG_CC_HAS_ASSUME
+# define __assume(expr)                        __attribute__((__assume__(expr)))
+#else
+# define __assume(expr)
+#endif
+
 /*
  * Optional: only supported since gcc >= 15
  * Optional: only supported since clang >= 18
index 83632025121937527523f5977a493bd3ae24ed9f..dabec90f18f6462f38260d5c31f4f2abd79de87d 100644 (file)
@@ -112,6 +112,16 @@ config TOOLS_SUPPORT_RELR
 config CC_HAS_ASM_INLINE
        def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
 
+config CC_HAS_ASSUME
+       bool
+       # clang needs to be at least 19.1.0 since the meaning of the assume
+       # attribute changed:
+       # https://github.com/llvm/llvm-project/commit/c44fa3e8a9a44c2e9a575768a3c185354b9f6c17
+       default y if CC_IS_CLANG && CLANG_VERSION >= 190100
+       # supported since gcc 13.1.0
+       # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106654
+       default y if CC_IS_GCC && GCC_VERSION >= 130100
+
 config CC_HAS_NO_PROFILE_FN_ATTR
        def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)