/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __LINUX_COMPILER_TYPES_H #define __LINUX_COMPILER_TYPES_H #ifndef __ASSEMBLY__ #include "compiler_attributes.h" /* * Skipped when running bindgen due to a libclang issue; * see https://github.com/rust-lang/rust-bindgen/issues/2244. */ #if defined(CONFIG_DEBUG_INFO_BTF) && defined(CONFIG_PAHOLE_HAS_BTF_TAG) && \ __has_attribute(btf_type_tag) && !defined(__BINDGEN__) #define BTF_TYPE_TAG(value) __attribute__((btf_type_tag(#value))) #else #define BTF_TYPE_TAG(value) /* nothing */ #endif /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ #define ___PASTE(a, b) a##b #define __PASTE(a, b) ___PASTE(a, b) /* sparse defines __CHECKER__; see Documentation/dev-tools/sparse.rst */ #ifdef __CHECKER__ /* address spaces */ #define __kernel __attribute__((address_space(0))) #define __user __attribute__((noderef, address_space(__user))) #define __iomem __attribute__((noderef, address_space(__iomem))) #define __percpu __attribute__((noderef, address_space(__percpu))) #define __rcu __attribute__((noderef, address_space(__rcu))) static inline void __chk_user_ptr(const volatile void __user *ptr) { } static inline void __chk_io_ptr(const volatile void __iomem *ptr) { } /* context/locking */ #define __must_hold(x) __attribute__((context(x, 1, 1))) #define __acquires(x) __attribute__((context(x, 0, 1))) #define __cond_acquires(x) __attribute__((context(x, 0, -1))) #define __releases(x) __attribute__((context(x, 1, 0))) #define __acquire(x) __context__(x, 1) #define __release(x) __context__(x, -1) #define __cond_lock(x, c) \ ((c) ? ({ \ __acquire(x); \ 1; \ }) : \ 0) /* other */ #define __force __attribute__((force)) #define __nocast __attribute__((nocast)) #define __safe __attribute__((safe)) #define __private __attribute__((noderef)) #define ACCESS_PRIVATE(p, member) \ (*((typeof((p)->member) __force *)&(p)->member)) #else /* __CHECKER__ */ /* address spaces */ #define __kernel #ifdef STRUCTLEAK_PLUGIN #define __user __attribute__((user)) #else #define __user BTF_TYPE_TAG(user) #endif #define __iomem #define __percpu BTF_TYPE_TAG(percpu) #define __rcu BTF_TYPE_TAG(rcu) #define __chk_user_ptr(x) (void)0 #define __chk_io_ptr(x) (void)0 /* context/locking */ #define __must_hold(x) #define __acquires(x) #define __cond_acquires(x) #define __releases(x) #define __acquire(x) (void)0 #define __release(x) (void)0 #define __cond_lock(x, c) (c) /* other */ #define __force #define __nocast #define __safe #define __private #define ACCESS_PRIVATE(p, member) ((p)->member) #define __builtin_warning(x, y...) (1) #endif /* __CHECKER__ */ /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ #define ___PASTE(a, b) a##b #define __PASTE(a, b) ___PASTE(a, b) #endif /* __ASSEMBLY__ */ /* * The below symbols may be defined for one or more, but not ALL, of the above * compilers. We don't consider that to be an error, so set them to nothing. * For example, some of them are for compiler specific plugins. */ #ifndef __latent_entropy #define __latent_entropy #endif #if defined(RANDSTRUCT) && !defined(__CHECKER__) #define __randomize_layout __designated_init __attribute__((randomize_layout)) #define __no_randomize_layout __attribute__((no_randomize_layout)) /* This anon struct can add padding, so only enable it under randstruct. */ #define randomized_struct_fields_start struct { #define randomized_struct_fields_end \ } \ __randomize_layout; #else #define __randomize_layout __designated_init #define __no_randomize_layout #define randomized_struct_fields_start #define randomized_struct_fields_end #endif #ifndef __noscs #define __noscs #endif #ifndef __nocfi #define __nocfi #endif #if defined(CC_USING_HOTPATCH) #define notrace __attribute__((hotpatch(0, 0))) #elif defined(CC_USING_PATCHABLE_FUNCTION_ENTRY) #define notrace __attribute__((patchable_function_entry(0, 0))) #else #define notrace __attribute__((__no_instrument_function__)) #endif /* * gcc provides both __inline__ and __inline as alternate spellings of * the inline keyword, though the latter is undocumented. New kernel * code should only use the inline spelling, but some existing code * uses __inline__. Since we #define inline above, to ensure * __inline__ has the same semantics, we need this #define. * * However, the spelling __inline is strictly reserved for referring * to the bare keyword. */ #define __inline__ inline /* * GCC does not warn about unused static inline functions for -Wunused-function. * Suppress the warning in clang as well by using __maybe_unused, but enable it * for W=1 build. This will allow clang to find unused functions. Remove the * __inline_maybe_unused entirely after fixing most of -Wunused-function warnings. */ #ifdef KBUILD_EXTRA_WARN1 #define __inline_maybe_unused #else #define __inline_maybe_unused __maybe_unused #endif /* * Rather then using noinline to prevent stack consumption, use * noinline_for_stack instead. For documentation reasons. */ #define noinline_for_stack noinline /* * Prefer gnu_inline, so that extern inline functions do not emit an * externally visible function. This makes extern inline behave as per gnu89 * semantics rather than c99. This prevents multiple symbol definition errors * of extern inline functions at link time. * A lot of inline functions can cause havoc with function tracing. */ #define inline inline __gnu_inline __inline_maybe_unused notrace /* * Any place that could be marked with the "alloc_size" attribute is also * a place to be marked with the "malloc" attribute, except those that may * be performing a _reallocation_, as that may alias the existing pointer. * For these, use __realloc_size(). */ #ifdef __alloc_size__ #define __alloc_size(x, ...) __alloc_size__(x, ##__VA_ARGS__) __malloc #define __realloc_size(x, ...) __alloc_size__(x, ##__VA_ARGS__) #else #define __alloc_size(x, ...) __malloc #define __realloc_size(x, ...) #endif #ifndef asm_volatile_goto #define asm_volatile_goto(x...) asm goto(x) #endif #ifdef CONFIG_CC_HAS_ASM_INLINE #define asm_inline asm __inline #else #define asm_inline asm #endif /* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) /* * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. */ #define __scalar_type_to_expr_cases(type) \ unsigned type : (unsigned type)0, signed type : (signed type)0 #define __unqual_scalar_typeof(x) \ typeof(_Generic((x), char \ : (char)0, __scalar_type_to_expr_cases(char), \ __scalar_type_to_expr_cases(short), \ __scalar_type_to_expr_cases(int), \ __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), default \ : (x))) /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \ sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) #ifdef __OPTIMIZE__ #define __compiletime_assert(condition, msg, prefix, suffix) \ do { \ /* \ * __noreturn is needed to give the compiler enough \ * information to avoid certain possibly-uninitialized \ * warnings (regardless of the build failing). \ */ \ __noreturn extern void prefix##suffix(void) \ __compiletime_error(msg); \ if (!(condition)) \ prefix##suffix(); \ } while (0) #else #define __compiletime_assert(condition, msg, prefix, suffix) \ do { \ } while (0) #endif #define _compiletime_assert(condition, msg, prefix, suffix) \ __compiletime_assert(condition, msg, prefix, suffix) /** * compiletime_assert - break build and emit msg if condition is false * @condition: a compile-time constant condition to check * @msg: a message to emit if condition is false * * In tradition of POSIX assert, this macro will break the build if the * supplied condition is *false*, emitting the supplied error message if the * compiler has support to do so. */ #define compiletime_assert(condition, msg) \ _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) #define compiletime_assert_atomic_type(t) \ compiletime_assert( \ __native_word(t), \ "Need native word sized stores/loads for atomicity.") /* Helpers for emitting diagnostics in pragmas. */ #ifndef __diag #define __diag(string) #endif #ifndef __diag_GCC #define __diag_GCC(version, severity, string) #endif #define __diag_push() __diag(push) #define __diag_pop() __diag(pop) #define __diag_ignore(compiler, version, option, comment) \ __diag_##compiler(version, ignore, option) #define __diag_warn(compiler, version, option, comment) \ __diag_##compiler(version, warn, option) #define __diag_error(compiler, version, option, comment) \ __diag_##compiler(version, error, option) #ifndef __diag_ignore_all #define __diag_ignore_all(option, comment) #endif #endif /* __LINUX_COMPILER_TYPES_H */