Skip to content

Commit f72e2cf

Browse files
hcahcaAlexander Gordeev
authored andcommitted
compiler_types: Add __assume macro
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>
1 parent a9f859b commit f72e2cf

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

include/linux/compiler_types.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,29 @@ struct ftrace_likely_data {
329329
#define __no_sanitize_or_inline __always_inline
330330
#endif
331331

332+
/*
333+
* The assume attribute is used to indicate that a certain condition is
334+
* assumed to be true. If this condition is violated at runtime, the behavior
335+
* is undefined. Compilers may or may not use this indication to generate
336+
* optimized code.
337+
*
338+
* Note that the clang documentation states that optimizers may react
339+
* differently to this attribute, and this may even have a negative
340+
* performance impact. Therefore this attribute should be used with care.
341+
*
342+
* Optional: only supported since gcc >= 13
343+
* Optional: only supported since clang >= 19
344+
*
345+
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#index-assume-statement-attribute
346+
* clang: https://clang.llvm.org/docs/AttributeReference.html#id13
347+
*
348+
*/
349+
#ifdef CONFIG_CC_HAS_ASSUME
350+
# define __assume(expr) __attribute__((__assume__(expr)))
351+
#else
352+
# define __assume(expr)
353+
#endif
354+
332355
/*
333356
* Optional: only supported since gcc >= 15
334357
* Optional: only supported since clang >= 18

init/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ config TOOLS_SUPPORT_RELR
112112
config CC_HAS_ASM_INLINE
113113
def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
114114

115+
config CC_HAS_ASSUME
116+
bool
117+
# clang needs to be at least 19.1.0 since the meaning of the assume
118+
# attribute changed:
119+
# https://github.com/llvm/llvm-project/commit/c44fa3e8a9a44c2e9a575768a3c185354b9f6c17
120+
default y if CC_IS_CLANG && CLANG_VERSION >= 190100
121+
# supported since gcc 13.1.0
122+
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106654
123+
default y if CC_IS_GCC && GCC_VERSION >= 130100
124+
115125
config CC_HAS_NO_PROFILE_FN_ATTR
116126
def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
117127

0 commit comments

Comments
 (0)